时间:2021-05-26
前言
读过一篇关于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对应用户的一篇博客文章
方案引用自原文:
看了这篇文章后,我打算使用我用过的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:
<?phpreturn 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?name=:1', '/^user\/([a-zA-Z0-9_-]+)\/blog$/' => 'Home/Blog/index?name=:1', '/^user\/([a-zA-Z0-9_-]+)\/blog\/([0-9]+)$/' => 'Home/Blog/show?name=:1&blog_id=:2', ),);?>创建文件tp\Application\Home\Controller\UserController.class.php:
<?phpnamespace 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 "<a href=\"{$url}\">{$url}<a/><br />\n"; } } public function index() { echo '我是用户列表^_^'; } public function show($name) { echo "欢迎你,{$name}"; }}?>创建文件tp\Application\Home\Controller\BlogController.class.php:
<?phpnamespace 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}"; }}?>访问:http://127.0.0.1/tp/url
输出:
复制代码 代码如下:
<a href="/tp/user">/tp/user<a/><br />
<a href="/tp/user/jing">/tp/user/jing<a/><br />
<a href="/tp/user/jing/blog">/tp/user/jing/blog<a/><br />
<a href="/tp/user/jing/blog/1">/tp/user/jing/blog/1<a/><br />
访问上面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:
<?php/** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://piled在生产环境中应该开启,以提升性能:
复制代码 代码如下:
php artisan optimize --force
修改路由文件laravel\app\Http\routes.php:
复制代码 代码如下:
<?php
Route::get('/url', array('uses' => 'UserController@getUrl'));
Route::get('/user', array('uses' => 'UserController@getIndex'));
Route::get('/user/{username}', array('uses' => 'UserController@getShow'));
Route::get('/user/{username}/blog', array(
'as' => 'blog_list',
'uses' => 'BlogController@getIndex',
));
Route::get('/user/{username}/blog/{blogId}', array(
'as' => 'blog',
'uses' => 'BlogController@getShow',
))->where(array('blogId' => '[0-9]+'));
查看路由定义情况:
复制代码 代码如下:
php artisan route:list
输出:
复制代码 代码如下:
+--------+----------+-------------------------------+-----------+----------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------------+-----------+----------------------------------------------+------------+
| | GET|HEAD | url | | App\Http\Controllers\UserController@getUrl | |
| | GET|HEAD | user | | App\Http\Controllers\UserController@getIndex | |
| | GET|HEAD | user/{username} | | App\Http\Controllers\UserController@getShow | |
| | GET|HEAD | user/{username}/blog | blog_list | App\Http\Controllers\BlogController@getIndex | |
| | GET|HEAD | user/{username}/blog/{blogId} | blog | App\Http\Controllers\BlogController@getShow | |
+--------+----------+-------------------------------+-----------+----------------------------------------------+------------+
定义路由变量全局模式,修改文件laravel\app\Providers\RouteServiceProvider.php中的boot方法:
复制代码 代码如下:
public function boot(Router $router) {
$router->pattern('username', '[a-zA-Z0-9_-]+');
parent::boot($router);
}
创建UserController控制器:
复制代码 代码如下:
php artisan make:controller UserController
Laravel帮我们在laravel\app\Http\Controllers目录下创建了文件UserController.php,文件中已经为我们写好一部分骨架代码。修改文件laravel\app\Http\Controllers\UserController.php:
复制代码 代码如下:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function getUrl() {
$name = 'jing';
$blogId = 1;
$urls = array(
url('/user'),
action('UserController@getShow', array($name)),
route('blog_list', array($name)),
route('blog', array($name, $blogId)),
);
foreach ($urls as $url) {
echo "<a href=\"{$url}\">{$url}<a/><br />\n";
}
}
public function getIndex() {
echo '我是用户列表^_^';
}
public function getShow($name) {
echo "欢迎你,{$name}";
}
}
创建BlogController控制器:
复制代码 代码如下:
php artisan make:controller BlogController
修改文件laravel\app\Http\Controllers\BlogController.php:
复制代码 代码如下:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class BlogController extends Controller {
public function getIndex($name) {
echo "这是{$name}的博客列表";
}
public function getShow($name, $blogId) {
echo "{$name}的这篇博客的id为{$blogId}";
}
}
Laravel的Action也支持参数绑定,是按变量顺序绑定的,和变量名无关。
后语
我是Laravel粉,但是我也没有想黑其他框架的意思,大家有兴趣也可以用自己熟悉的框架来实现这个小例子,写了记得@我,语言不限。
以上所述就是本文的全部内容了,希望大家能够喜欢。
请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#中自定义控件VS用户控件大比拼1自定义控件与用户控件区别WinForm中,用户控件(UserControl):继承自UserControl,主要用于开发Co
除了快递业务量、市场份额等方面的大比拼,物流绿色化也正日益成为快递巨头们争相追逐的焦点。邮政、京东物流、苏宁物流、菜鸟、“通达系”纷纷加
8月26日消息,临近中秋,大闸蟹接棒小龙虾成为消费者餐桌上的新晋“网红”。日前,在“大闸蟹与月饼大比拼”话题调研
举办网站线上线下活动。弹幕视频网站截至今日举办了许多线上活动,比如人生第一次、COS仿妆大比拼、国风新青年等活动。其中最大的线上活动是哔哩哔哩的拜年祭活动,是网
全文主题风格:淘宝商家如何提高销售量?有什么方式有关谈起淘宝网发展趋势经营规模越来越大,因此,店家的市场竞争也就日益猛烈起來,相互之间大比拼的目地,便是要想提高