作者:多盟乄丶 | 来源:互联网 | 2018-05-11 12:09
这篇文章主要介绍了ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼的相关资料,需要的朋友可以参考下
前言
读过一篇关于Zend Framework2的技术文章《ZF2多级树形路由Route配置实例》,是介绍路由配置的。我觉得很有意思,这是的需求:
/user对应用户列表页面
/user/:user_id对应用户的个人主页,比如 /user/AlloVince 就对应AlloVince用户的个人主页
/user/:user_id/blog/对应用户的博客列表页面,比如 /user/AlloVince/blog 就会列出AlloVince写过的Blog
/user/:user_id/blog/:blog_id对应用户的一篇博客文章
方案引用自原文:
'router' => array(
'routes' => array(
'user' => array(
'type' => 'Segment',
'options' => array(
'route' => '/user[/]',
'defaults' => array(
'controller' => 'UserController',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'profile' => array(
'type' => 'Segment',
'options' => array(
'route' => '[:id][/]',
'constraints' => array(
'id' => '[a-zA-Z0-9_-]+'
),
'defaults' => array(
'action' => 'get'
),
),
'may_terminate' => true,
'child_routes' => array(
'blog' => array(
'type' => 'Segment',
'options' => array(
'route' => 'blog[/]',
'constraints' => array(
),
'defaults' => array(
'action' => 'blog'
)
),
'may_terminate' => true,
'child_routes' => array(
'post' => array(
'type' => 'Segment',
'options' => array(
'route' => '[:post_id][/]',
'constraints' => array(
'post_id' => '[a-zA-Z0-9_-]+'
),
'defaults' => array(
'action' => 'post'
)
),
'may_terminate' => true,
),
),
),
), //profile child_routes end
), //profile end
), //user child_routes end
), //user end
),
),
看了这篇文章后,我打算使用我用过的PHP框架来实现这个路由需求。
ThinkPHP
新建一个ThinkPHP项目:
代码如下:
composer create-project topthink/thinkphp tp --prefer-dist
命令行显示我安装的是3.2.2
Installing topthink/thinkphp (3.2.2)
我看ThinkPHP官网最新稳定版本是3.2.3。
我特意去packagist官网查了一下,库中稳定版确实是3.2.2。
我得使用3.2.3。为什么我特别纠结这一点哩?因为:
3.2的路由功能是针对模块设置的,所以URL中的模块名不能被路由,路由定义也通常是放在模块配置文件中。 3.2.3版本开始增加全局路由定义支持,可以在项目的公共配置文件中定义路由。
也就是说,路由重写的部分是Controller和Action部分,Moudle还是存在。
我希望的是/user,而不是home/user。(ThinkPHP中默认Module是Home,'DEFAULT_MODULE' => 'Home',可以修改)
当然,这个问题也可以修改.htaccess文件的解决。但是,我还是决定安装3.2.3。
在ThinkPHP官网下载最新的包,解压。
使用浏览器访问一下项目的入口文件,让ThinkPHP自动生成了一个默认的应用模块Home。
修改公共配置文件tp\Application\Common\Conf\config.php:
<&#63;php
return array(
// 开启路由
'URL_ROUTER_ON' => true,
// URL访问模式,可选参数0、1、2、3,代表以下四种模式:
// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式
'URL_MODEL' => 2,
// URL伪静态后缀设置,为空表示可以支持所有的静态后缀
// 使用U函数生成URL时会不带后缀
'URL_HTML_SUFFIX' => '',
// URL变量绑定到Action方法参数,默认为true
'URL_PARAMS_BIND' => true,
// URL变量绑定的类型 0 按变量名绑定 1 按变量顺序绑定,默认为0
'URL_PARAMS_BIND_TYPE' => 0,
// 路由配置
'URL_ROUTE_RULES' => array(
'/^url$/' => 'Home/User/url',
'/^user$/' => 'Home/User/index',
'/^user\/([a-zA-Z0-9_-]+)$/' => 'Home/User/show&#63;name=:1',
'/^user\/([a-zA-Z0-9_-]+)\/blog$/' => 'Home/Blog/index&#63;name=:1',
'/^user\/([a-zA-Z0-9_-]+)\/blog\/([0-9]+)$/' => 'Home/Blog/show&#63;name=:1&blog_id=:2',
),
);
&#63;>
创建文件tp\Application\Home\Controller\UserController.class.php:
<&#63;php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {
public function url() {
$name = 'jing';
$blogId = 1;
$urls = array(
U('/user'),
U("/user/{$name}"),
U("/user/{$name}/blog"),
U("/user/{$name}/blog/{$blogId}"),
);
foreach ($urls as $url) {
echo "{$url}
\n";
}
}
public function index() {
echo '我是用户列表^_^';
}
public function show($name) {
echo "欢迎你,{$name}";
}
}
&#63;>
创建文件tp\Application\Home\Controller\BlogController.class.php:
<&#63;php
namespace Home\Controller;
use Think\Controller;
class BlogController extends Controller {
public function index($name) {
echo "这是{$name}的博客列表";
}
public function show($blog_id, $name) {
echo "{$name}的这篇博客的id为{$blog_id}";
}
}
&#63;>
访问:
输出:
代码如下:
/tp/user
/tp/user/jing
/tp/user/jing/blog
/tp/user/jing/blog/1
访问上面4个链接,依次返回:
我是用户列表^_^
欢迎你,jing
这是jing的博客列表
jing的这篇博客的id为1
下面其他框架,也同样输出以上内容。
Zend Framework 2
使用ZF2骨架程序创建一个ZF2项目:
composer create-project --stability="dev" zendframework/skeleton-application zf2
修改默认模块Application的配置文件zf2\module\Application\config\module.config.php: