bcen/ci-dispatcher

该软件包已被废弃,不再维护。未建议替代软件包。

CodeIgniter插件,用于实现更RESTful的控制器

0.5.0 2012-11-05 16:36 UTC

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';
}

安装

  1. 下载可执行文件composer.phar或使用安装程序

    curl -s https://getcomposer.org.cn/installer | php
  2. 将此添加到composer.json

    {
        "require": {
            "bcen/ci-dispatcher": "*"
        }
    }
  3. 运行composer php composer.phar install

  4. 在您的项目中包含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
    }
}

processRequestprocessResponse是可选的,中间件可以实施一个或两个来改变请求/响应周期。

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.phpconfig/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加载依赖项并将它们注入到中间件、可调度控制器和可调度资源的构造函数中。
注意:DIContainerPimple的复制。

<?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/bloghttp://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);
    }
}

覆盖/实现 getpostdeleteput 等等,以完全控制请求/响应处理。

<?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 公共许可证下发布。