学习Slim Framework for PHP v3 (一)
2016-01-21 22:05
906 查看
因为公司的项目用到是slim 框架,所以想把它学习一下。在公司用到是Slim2版本,现在官网已经到达 Slim3的版本了。官网地址:http://www.cnblogs.com/lmenglliren89php/。
首先按照官网的教程,安装Slim:
1.curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
2.composer require slim/slim "^3.0"
这样一个Slim就安装好了。还有Apache的DirectDocumentroot设置:
同时它自带的Example的例子也是可以运行的,需要调整下文件夹的位置就好。
如何才能理解一个框架呢?是很顺利的使用吗?还是从一步步去跟进去它的流程?
我的思路是这样的,我把这个Example改成自己的项目,然后在不知道如何去的时候去深挖一下,不知道这样的逻辑是否正确,暂且就这样做吧。
项目逻辑要求是这样的,页面提交数据--->>接收数据--->>存入数据库--->>记入日志--->>返回写入成功
接收数据的route:
要说的是Slim就是基于route概念的,它将所有的request都转给不同的route,然后每个route完成功能,最后设定response,请求完毕。
get方法就是去设定一个route,以后的‘replace’就会匹配到那个闭包函数中。
而这个route是放在哪里呢?在APP.php中有个contianer。这个container是个什么东西呢,来看代码:
来看Container怎么做的:
会看到这段代码就是初始化container中的router key,以后的route都加到这个里面就好了。
第一次写,就先这样吧。
首先按照官网的教程,安装Slim:
1.curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
2.composer require slim/slim "^3.0"
这样一个Slim就安装好了。还有Apache的DirectDocumentroot设置:
AllowOverride All。
同时它自带的Example的例子也是可以运行的,需要调整下文件夹的位置就好。
如何才能理解一个框架呢?是很顺利的使用吗?还是从一步步去跟进去它的流程?
我的思路是这样的,我把这个Example改成自己的项目,然后在不知道如何去的时候去深挖一下,不知道这样的逻辑是否正确,暂且就这样做吧。
项目逻辑要求是这样的,页面提交数据--->>接收数据--->>存入数据库--->>记入日志--->>返回写入成功
接收数据的route:
$app->get('/replace/', function ($request, $response, $args) { Example\Module\Replace::instance()->setBody($request, $response); });
要说的是Slim就是基于route概念的,它将所有的request都转给不同的route,然后每个route完成功能,最后设定response,请求完毕。
get方法就是去设定一个route,以后的‘replace’就会匹配到那个闭包函数中。
而这个route是放在哪里呢?在APP.php中有个contianer。这个container是个什么东西呢,来看代码:
public function __construct($container = []) { if (is_array($container)) { $container = new Container($container); } if (!$container instanceof ContainerInterface) { throw new InvalidArgumentException('Expected a ContainerInterface'); } $this->container = $container; }
来看Container怎么做的:
public function __construct(array $values = []) { parent::__construct($values); $userSettings = isset($values['settings']) ? $values['settings'] : []; $this->registerDefaultServices($userSettings); } private function registerDefaultServices($userSettings) { $defaultSettings = $this->defaultSettings; /** * This service MUST return an array or an * instance of \ArrayAccess. * * @return array|\ArrayAccess */ $this['settings'] = function () use ($userSettings, $defaultSettings) { return new Collection(array_merge($defaultSettings, $userSettings)); }; if (!isset($this['environment'])) { /** * This service MUST return a shared instance * of \Slim\Interfaces\Http\EnvironmentInterface. * * @return EnvironmentInterface */ $this['environment'] = function () { return new Environment($_SERVER); }; } if (!isset($this['request'])) { /** * PSR-7 Request object * * @param Container $c * * @return ServerRequestInterface */ $this['request'] = function ($c) { return Request::createFromEnvironment($c->get('environment')); }; } if (!isset($this['response'])) { /** * PSR-7 Response object * * @param Container $c * * @return ResponseInterface */ $this['response'] = function ($c) { $headers = new Headers(['Content-Type' => 'text/html; charset=UTF-8']); $response = new Response(200, $headers); return $response->withProtocolVersion($c->get('settings')['httpVersion']); }; } if (!isset($this['router'])) { /** * This service MUST return a SHARED instance * of \Slim\Interfaces\RouterInterface. * * @return RouterInterface */ $this['router'] = function () { return new Router; }; } if (!isset($this['foundHandler'])) { /** * This service MUST return a SHARED instance * of \Slim\Interfaces\InvocationStrategyInterface. * * @return InvocationStrategyInterface */ $this['foundHandler'] = function () { return new RequestResponse; }; } if (!isset($this['errorHandler'])) { /** * This service MUST return a callable * that accepts three arguments: * * 1. Instance of \Psr\Http\Message\ServerRequestInterface * 2. Instance of \Psr\Http\Message\ResponseInterface * 3. Instance of \Exception * * The callable MUST return an instance of * \Psr\Http\Message\ResponseInterface. * * @param Container $c * * @return callable */ $this['errorHandler'] = function ($c) { return new Error($c->get('settings')['displayErrorDetails']); }; } if (!isset($this['notFoundHandler'])) { /** * This service MUST return a callable * that accepts two arguments: * * 1. Instance of \Psr\Http\Message\ServerRequestInterface * 2. Instance of \Psr\Http\Message\ResponseInterface * * The callable MUST return an instance of * \Psr\Http\Message\ResponseInterface. * * @return callable */ $this['notFoundHandler'] = function () { return new NotFound; }; } if (!isset($this['notAllowedHandler'])) { /** * This service MUST return a callable * that accepts three arguments: * * 1. Instance of \Psr\Http\Message\ServerRequestInterface * 2. Instance of \Psr\Http\Message\ResponseInterface * 3. Array of allowed HTTP methods * * The callable MUST return an instance of * \Psr\Http\Message\ResponseInterface. * * @return callable */ $this['notAllowedHandler'] = function () { return new NotAllowed; }; } if (!isset($this['callableResolver'])) { /** * Instance of \Slim\Interfaces\CallableResolverInterface * * @param Container $c * * @return CallableResolverInterface */ $this['callableResolver'] = function ($c) { return new CallableResolver($c); }; } }
会看到这段代码就是初始化container中的router key,以后的route都加到这个里面就好了。
$this['router'] = function () { return new Router; }; 只是能不加入自己的Key呢?
第一次写,就先这样吧。
相关文章推荐
- php字符串处理
- comet realization with ajax&php
- php 删除文件夹下的所有文件
- 05-SCP&SFTP
- 关于FragmentPagerAdapter的方法讲解
- PHP 上传文件 Allowed memory size of 134217728 bytes exhausted
- Entity Framework 6 Recipes 2nd Edition(10-6)译 -> TPT继承模型中使用存储过程
- thinkphp微信扫码支付模式二
- Servlet 与jsp 区别对比 php中 的 view 和 controller
- jrtplib学习之example1例程分析
- 深入浅出讲解:php的socket通信
- pxe+dhcp+tftp+kickstart 实现无人值守自动安装
- sftp常用命令介绍
- yii2登录流程
- 转:PHP Composer 管理工具的介绍 这个相对清晰点
- Yii中引入php文件及插件
- PHP开发工具
- PHP 数字前面补零 固定位数补0
- thinkphp 本页项目, 调用方法
- thinkphp读取配置文件中的数据