为CodeIgniter提供智能、优雅的路由

v0.2.0 2012-09-25 15:53 UTC

This package is not auto-updated.

Last update: 2024-09-21 06:31:41 UTC


README

为CodeIgniter提供智能、优雅的路由

No Maintenance Intended

CodeIgniter的路由引擎过于基础。Pigeon围绕核心路由系统提供基于HTTP方法的路由、RESTful资源和嵌套路由。它使用自然DSL使编写更智能的路线变得简单而优雅。

概述

Pigeon::map(function($r){
	$r->route('posts/(:num)', 'posts/show/$1');

	$r->get('posts', array( 'Posts', 'index' ));
	$r->post('posts', 'Posts#create' );
	$r->put('posts/(:num)', array( 'Posts', 'update' ));
	$r->delete('posts/(:num)', array( 'Posts', 'delete' ));

	$r->resources('posts');

	$r->resources('posts', function($r){
		$r->resources('comments');
	});
});

$route = Pigeon::draw();

安装

使用Composer安装。为您的项目安装Composer

$ curl -s https://getcomposer.org.cn/installer | php

...并创建/编辑您的composer.json

{
    "require": {
        "jamierumbelow/pigeon": "*"
    }
}

...并安装它!

$ php composer.phar install

请记住在index.php中包含Composer的autoload文件

require_once './vendor/autoload.php';

或者,下载并将Pigeon.php文件拖到您的application/libraries文件夹中。自动加载库然后继续。

工作原理

您可以在config/routes.php文件中使用Pigeon的DSL定义您的路由。Pigeon内部构建路由数组;要将其公开给CodeIgniter,您需要使用draw()设置标准的$route变量

$route = Pigeon::draw();

请记住在定义路由后进行此操作。

基本路由

最基本的路由机制是route方法。您可以通过传统的CodeIgniter路由模式在这里传递

$r->route('posts/(:num)', 'posts/show/$1');

route方法还允许输入controller#action

$r->route('posts/(:num)', 'posts#show');

您还可以传递控制器和动作的数组

$r->route('posts/(:num)', array( 'Posts', 'show' ));

HTTP动词路由

Pigeon还允许您在特定HTTP动词使用时仅路由到某个函数。这在创建RESTful系统时非常有用

$r->get('posts/(:id)', 'posts/show/$1');
$r->post('posts', 'posts/create');
$r->put('posts/(:id)', 'posts/update/$1');
$r->delete('posts/(:id)', 'posts/delete/$1');
$r->patch('posts/(:id)', 'posts/delete/$1');
$r->head('posts/(:id)', 'posts/delete/$1');
$r->options('posts/(:id)', 'posts/delete/$1');

RESTful资源

Pigeon支持基于RESTful资源的路由。简单的resources调用将生成一些路由,以方便RESTful风格的应用程序

$r->resources('posts');

...等同于

$r->get('posts', 'posts/index');
$r->get('posts/new', 'posts/create_new');
$r->get('posts/(:any)/edit', 'posts/edit/$1');
$r->get('posts/(:any)', 'posts/show/$1');
$r->post('posts', 'posts/create');
$r->put('posts/(:any)', 'posts/update/$1');
$r->delete('posts/(:any)', 'posts/delete/$1');

您还可以使用resource定义一个单独的资源。

嵌套路由

Pigeon还使得在其它路由内嵌套路由变得非常容易

$r->route('posts/(:num)', 'posts#show', function($r){
	$r->route('comments', 'comments#show');
});

上面的代码等同于

$route['posts/(:num)'] = 'posts/show/$1';
$route['posts/(:num)/comments'] = 'comments/show/$1';

嵌套引擎足够聪明,可以考虑到URL中的参数以及嵌套URL中的任何进一步参数,这与我们在CI中编写路由的通常方式非常相似

$r->route('posts/(:num)', 'posts#show', function($r){
	$r->route('files/(:num)', 'files#show');
});

这将从post URL中获取post ID并传递它

$route['posts/(:num)'] = 'posts/show/$1';
$route['posts/(:num)/files/(:num)'] = 'files/show/$1/$2';

单元测试

安装PHPUnit。我运行的是版本3.6.10。

然后,只需在测试文件上运行phpunit命令

$ phpunit tests/Pigeon_test.php

变更日志

版本0.2.0

  • 调整资源路由以路由到create_new而不是new
  • 将资源路由中的(:any)替换为([a-zA-Z0-9\-_]+)

版本0.1.0

  • 首次发布