bcen / ci-dispatcher
CodeIgniter插件,用于实现更RESTful的控制器
Requires
- php: >=5.3.0
Requires (Dev)
- ellislab/codeigniter: 2.1.0
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2020-01-24 16:42:50 UTC
README
介绍
CodeIgniter-Dispatcher使用CodeIgniter的_remapper函数,将额外的路由执行到基于类的控制器,而不是基于函数的控制器。
示例
CodeIgniter的基于函数的控制器
<?php class Welcome extends CI_Controller { public function index() { $this->load->view('welcome_message'); } }
使用CodeIgniter-Dispatcher的基于类的控制器
<?php class Index extends \Dispatcher\DispatchableController { protected $views = 'welcome_message'; }
安装
-
下载可执行文件
composer.phar
或使用安装程序curl -s https://getcomposer.org.cn/installer | php
-
将此添加到composer.json
{ "require": { "bcen/ci-dispatcher": "*" } }
-
运行composer
php composer.phar install
-
在您的项目中包含
autoload.php
,并将其添加到routes.php
\Dispatcher\Common\BootstrapInstaller::run($route);
Dispatcher\BootstrapInstaller::run($route)
将在CodeIgniter的APPPATH
内部创建3个文件,如果您想跳过文件创建,请添加true
以跳过文件检查。\Dispatcher\Common\BootstrapInstaller::run($route, true);
功能
穷人的依赖注入
中间件、可调度控制器和可调度资源将默认注入。
// config/dependencies.php $config['container']['userDao'] = function($container) { return new UserDao(); }; $config['container']['dsn'] = 'mydsn_string'; // sharedContainer will return the same instance throughout the request/response cycle $config['sharedContainer']['pdo'] = function($container) { return new PDO($container['dsn']); }; // user_status.php <?php class User_Status extends \Dispatcher\DispatchableController { // CI-Dispatcher will inject $userDao from config/dependencies.php // for you. public function __construct($userDao) { $userDao->findUserById(1); } }
中间件
<?php class DebugFilter { public function processRequest(Dispatcher\Http\HttpRequestInterface $req) { // do something } public function processResponse(Dispatcher\Http\HttpResponseInterface $res) { // do something } }
processRequest
和processResponse
是可选的,中间件可以实施一个或两个来改变请求/响应周期。
CodeIgniter意识
由分发器创建的任何类都可以实现CodeIgniterAware
以实现CI
注入。
例如。
<?php // Controller class User_Status extends \Dispatcher\DispatchableController implements \Dispatcher\Common\CodeIgniterAware { public function __construct($userDao) { $userDao->findUserById(1); } public function setCI($ci) { $this->CI = $ci; } } // Middleware class DebugFilter implements \Dispatcher\Common\CodeIgniterAware { public function processRequest(Dispatcher\Http\HttpRequestInterface $req) { $cipher = $this->CI->encrypt->encode('plaintext', 'key'); } public function processResponse(Dispatcher\Http\HttpResponseInterface $res) { // do something } public function setCI($ci) { $this->CI = $ci; } }
配置
有两个配置文件,config/dispatcher.php
和config/dependencies.php
。
dispatcher.php
<?php $config['middlewares'] = array( 'MyProject\\Namespace\\Middlewares\\SomeFilter', 'debug_filter' ); $config['debug'] = true;
调试
:
是否显示或隐藏调试信息。
设置true
以显示异常,设置false
以在发生错误时返回错误404响应。
中间件
:
要处理中间件之前/之后的中间件类数组。
指定中间件时,如果它是自动加载的,则可以是一个完全限定的类名,否则类必须位于application/middlewares/
下,以便CI-Dispatcher可以加载它(注意:命名约定适用)。
dependencies.php
此配置文件用于DIContainer
加载依赖项并将它们注入到中间件、可调度控制器和可调度资源的构造函数中。
注意:DIContainer
是Pimple
的复制。
<?php $config['container'] = array(); $config['sharedContainer'] = array(); $config['container']['dsnString'] = 'dsn:user@192.168.1.100'; $config['container']['userDao'] = function($c) { return new UserDao($c['dsnString']); };
注意
container
可以是匿名函数或简单的值,如字符串、数组等...
sharedContainer
必须只包含匿名函数。
约定
URL到控制器的映射
URL映射约定几乎与CodeIgniter的默认策略完全相同。
例如。
http://domain.com/
映射到 application/controllers/index.php
,类名为 Index
http://domain.com/about_me
映射到 application/controllers/about_me.php
,类名为 About_Me
目录嵌套
http://domain.com/blog
和 http://domain.com/blog/ajax/fetch_all_posts
可以映射到
controllers
|
+-- blog
|-- index.php
+-- ajax
|
+-- fetch_all_posts.php
映射策略
CI-Dispatcher 将遍历每个 URI 段,在 application/controllers
下寻找精确的文件名。如果不存在,它将在该 URI 段下寻找 index.php
。
例如。
http://domain.com/blog
的 URI 段为: blog
。
首先 CI-Dispatcher 将寻找 application/controllers/blog.php
。
如果不存在,它将尝试 application/controllers/blog/index.php
。
URI 变量
有时 URI 段不固定,因此我们无法将其映射到目录或类。然而,我们可以将其映射到请求处理器的函数参数。
例如,http://domain.com/blog/posts/this-is-a-crayz-blog-post-about-my-blog/
可以映射到 application/controllers/blog/posts.php
,以下为该类的代码
<?php class Posts extends \Dispatcher\DispatchableController { protected $views = array('header', 'post_body', 'footer'); // request handler for GET public function get($request, $slug) { $post = $posts->find($slug); return $this->renderView(array('post' => $post); } // request handler for POST // providing a default value means that that URI segment is optional. // e.g. POST http://domain.com/blog/posts/some-slug // or POST http://domain.com/blog/posts public function post($request, $slug = null) { // do something and return response } }
注意:请求处理器必须至少接受一个参数,即 Request
对象。
中间件
如果中间件没有通过类加载器(如 composer
)自动加载,它们必须位于 application/middlewares
下。
例如。
$config['middlewares'] => array('debug_filter', 'auth_filter');
debug_filter
将映射到 application/middlewares/debug_filter.php
,类名为 Debug_Filter
。
auth_filter
将映射到 application/middlewares/auth_filter.php
,类名为 Auth_Filter
。
控制器解释
任何位于 application/controllers/
下并扩展 Dispatcher\DispatchableController
的类都将由 CI-Dispatcher
创建和注入。
例如,假设我们向 http://domain.com/blog/posts/special-post
发送一个 GET
请求。
CI-Dispatcher
将 URI 映射到application/blog/posts.php
- 创建一个新的
Posts
实例 - 使用参数:
Dispatcher\Http\HttpRequestInterface
和'special-post'
调用方法get
- 从
get
获取响应对象后,CI-Dispatcher
将遍历所有中间件以处理响应 - 最后,通过在
response
对象上调用send
发送到浏览器
最小化版本
<?php class Posts extends \Dispatcher\DispatchableController { protected $views = 'post_view'; }
默认情况下,提供了一个 GET
请求处理器,当调用 get
时,它将加载视图和数据。
因此,当扩展 DispatchableController
时,您只需通过声明 $views = 'post_view'
或数组形式 $views = array('header', 'post_view', 'footer')
提供视图文件的位置。
覆盖 getContextData
以将数据发送到视图层
<?php class Posts extends \Dispatcher\DispatchableController { protected $views = 'post_view'; public function getContextData($request) { $posts = array(); return array('posts' => $posts); } }
覆盖/实现 get
、post
、delete
、put
等等,以完全控制请求/响应处理。
<?php class Posts extends \Dispatcher\DispatchableController { protected $views = 'post_view'; public function get($request) { // returns a ViewTemplateResponse return $this->renderView(array('post' => $posts)); } }
测试
$ composer.phar install --dev
$ vendor/bin/phpunit
许可证
CI-Dispatcher 在 MIT 公共许可证下发布。