はじめに
ルーティング構成を紹介する Zend Framework2 の技術記事「ZF2 Multi-level Tree Routing ルート構成例」を読みました。とても興味深いと思います。これが需要です:
/userはユーザー一覧ページに対応します
/user/:user_id はユーザーの個人ホームページに対応します。たとえば、/user/AlloVince は AlloVince ユーザーの個人ホームページに対応します
。
/user/:user_id/blog/ はユーザーのブログ リスト ページに対応します。たとえば、/user/AlloVince/blog には AlloVince によって書かれたブログがリストされます
/user/:user_id/blog/:blog_id はユーザーのブログ投稿に対応します
計画は原文から引用:
この記事を読んだ後、このルーティング要件を実装するために使用した PHP フレームワークを使用する予定です。
PHP について考える
新しい ThinkPHP プロジェクトを作成します:
コードをコピーします コードは次のとおりです:
作曲家作成-プロジェクトtopthink/thinkphp tp --prefer-dist
コマンドラインには 3.2.2 がインストールされていることが表示されます
topthink/thinkphp (3.2.2) のインストール
ThinkPHP 公式 Web サイトの最新の安定バージョンは 3.2.3 です。
packagist の公式 Web サイトにアクセスして確認したところ、ライブラリの安定バージョンは確かに 3.2.2 であることがわかりました。
3.2.3を使用する必要があります。なぜ私はこれにそんなに夢中になっているのでしょうか?理由:
3.2のルーティング機能はモジュールに対して設定されているため、URL内のモジュール名をルーティングすることはできず、ルーティング定義は通常モジュール設定ファイルに記述されます。バージョン 3.2.3 では、グローバル ルート定義のサポートが追加され、プロジェクトのパブリック構成ファイルでルートを定義できるようになりました。
つまり、ルーティングを書き換える部分はControllerとActionの部分であり、Moodleはそのまま存在します。
home/user ではなく、/user が必要です。 (ThinkPHP のデフォルトのモジュールは Home、'DEFAULT_MODULE' => 'Home' ですが、これは変更可能です)
もちろん、この問題は .htaccess ファイルを変更することで解決することもできます。ただし、3.2.3 をインストールすることにしました。
ThinkPHP 公式 Web サイトから最新のパッケージをダウンロードし、解凍します。
ブラウザを使用してプロジェクトのエントリ ファイルにアクセスし、ThinkPHP にデフォルトのアプリケーション モジュール ホームを自動的に生成させます。
パブリック構成ファイル tpApplicationCommonConfconfig.php を変更します:
リーリーファイル tpApplicationHomeControllerUserController.class.php を作成します:
リーリーファイル tpApplicationHomeControllerBlogController.class.php を作成します:
リーリーアクセス: http://127.0.0.1/tp/url
出力:
コードをコピーします コードは次のとおりです:
//m.sbmmt.com/tp/user
//m.sbmmt.com/tp/user/jing
//m.sbmmt.com/tp/user/jing/blog
//m.sbmmt.com/tp/user/jing/blog/1
上記の 4 つのリンクにアクセスし、順番に戻ってください:
私はユーザーリストです^_^
ようこそ、ジンさん
jingさんのブログ一覧です
jingさんのこのブログのIDは1です
以下の他のフレームワークでも上記の内容が出力されます。
Zend フレームワーク 2
ZF2 スケルトン プログラムを使用して ZF2 プロジェクトを作成します:
composer create-project --stability="dev" zendframework/skeleton-application zf2
デフォルトモジュールアプリケーションの設定ファイルzf2moduleApplicationconfigmodule.config.phpを変更します:
リーリーこのファイルには、ルーター部分とコントローラー部分を変更したばかりのスケルトン プログラムが付属しています。こんな長い文書を書くのは私には難しすぎるでしょう。 ZFがスケルトンプログラムを正式にリリースしたのもこれが理由だ。
ファイル zf2moduleApplicationsrcApplicationControllerUserController.php を作成します:
リーリーファイル zf2moduleApplicationsrcApplicationControllerBlogController.php を作成します:
リーリーzf2 は Action パラメーターのバインドをサポートしません。ThinkPHP はバインドをサポートするだけでなく、変数名によるバインドと変数の順序によるバインドの 2 つのバインド方法もサポートします。
zf2 のアクションは、exit() を除いてビューを返す必要があります。表示を無効にする方法をご存知でしたら、教えてください。
ファイル zf2moduleApplicationviewapplicationuserurl.phtml を作成します:
リーリーファイル zf2moduleApplicationviewapplicationuserindex.phtml を作成します:
私はユーザーリストです^_^
ファイル zf2moduleApplicationviewapplicationusershow.phtml を作成します:
ようこそ、
ファイル zf2moduleApplicationviewapplicationblogindex.phtml を作成します:
のブログ一覧です。
ファイル zf2moduleApplicationviewapplicationblogshow.phtml を作成します:
コードをコピーします コードは次のとおりです:
このブログの ID は
Yafをインストールする
コード生成ツールを使用して Yaf プロジェクトを作成する
スタートアップ ファイル yafapplicationBootstrap.php を変更し、_initRoute メソッドを変更します。
$router = Yaf_Dispatcher::getInstance()->getRouter(); $route0 = new Yaf_Route_Rewrite('url', array( 'controller' => 'User', 'action' => 'url', ), array() ); $route1 = new Yaf_Route_Rewrite('user', array( 'controller' => 'User', 'action' => 'index', ), array() ); $route2 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)#', array( 'controller' => 'User', 'action' => 'show', ), array(1 => 'name',) ); $route3 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog#', array( 'controller' => 'Blog', 'action' => 'index', ), array(1 => 'name',) ); $route4 = new Yaf_Route_Regex('#user/([a-zA-Z0-9_-]+)/blog/([0-9]+)#', array( 'controller' => 'Blog', 'action' => 'show', ), array(1 => 'name', 2 => 'blogId',) ); $router->addRoute('url', $route0); $router->addRoute('user_list', $route1); $router->addRoute('user', $route2); $router->addRoute("blog_list", $route3); $router->addRoute("blog", $route4);
Yaf有路由功能,但是没有根据路由名生成URL的方法。所以我定义了一个项目名,用于拼接URL。
在配置文件中添加配置项yaf\conf\application.ini:
复制代码 代码如下:
project.name = 'yaf'
创建文件yaf\application\controllers\User.php:
<?php class UserController extends Yaf_Controller_Abstract { public function urlAction() { $name = 'jing'; $blogId = 1; $app = Yaf_Application::app(); $projectName = $app->getConfig()->project->name; $urls = array( "/{$projectName}/user", "/{$projectName}/user/{$name}", "/{$projectName}/user/{$name}/blog", "/{$projectName}/user/{$name}/blog/{$blogId}", ); foreach ($urls as $url) { echo "<a href=\"{$url}\">{$url}<a/><br />\n"; } return false; } public function indexAction() { echo '我是用户列表^_^'; // 禁用视图模板 return false; } public function showAction($name) { echo "欢迎你,{$name}"; return false; } }
创建文件yaf\application\controllers\Blog.php:
复制代码 代码如下:
<?php
class BlogController extends Yaf_Controller_Abstract {
public function indexAction($name) {
echo "这是{$name}的博客列表";
return false;
}
public function showAction($blogId, $name) {
echo "{$name}的这篇博客的id为{$blogId}";
return false;
}
}
Yaf的Action支持参数绑定,是按变量名绑定的。$name、$blogId要和路由中配置的名称一样,而和参数顺序无关。
Laravel
新建Laravel项目:
复制代码 代码如下:
composer create-project laravel/laravel --prefer-dist
清除合并文件。在目录laravel\vendor\下有个文件compiled.php,这个文件是为了减少IO提高框架性能,将很多类文件合并到一个文件中而生存的。在开发环境下,应该删除该文件,否则修改了一些文件发现没有效果,其实是因为文件已经合并缓存了。
清除命令:
复制代码 代码如下:
php artisan clear-compiled
在生产环境中应该开启,以提升性能:
复制代码 代码如下:
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
输出:
复制代码代码如下:
+----------+----------+---------------------- --+----------+------------------------------------- -----------+----------+
|ドメイン |方法 | URI |名前 |アクション |ミドルウェア |
+----------+----------+---------------------- --+----------+------------------------------------- -----------+----------+
| |取得 | 頭 | URL | | AppHttpControllersUserController@getUrl | |
| |取得 | 頭 |ユーザー | | AppHttpControllersUserController@getIndex | |
| |取得 | 頭 |ユーザー/{ユーザー名} | | AppHttpControllersUserController@getShow | |
| |取得 | 頭 |ユーザー/{ユーザー名}/ブログ |ブログリスト | AppHttpControllersBlogController@getIndex | |
| |取得 | 頭 |ユーザー/{ユーザー名}/ブログ/{ブログID} |ブログ | AppHttpControllersBlogController@getShow | |
+----------+----------+---------------------- --+----------+------------------------------------- -----------+----------+
定义路由变量全局モード,修正文件laravelappProvidersRouteServiceProvider.php中のブートメソッド:
复制代码代码如下:
public function boot(Router $router) {
$router->pattern('ユーザー名', '[a-zA-Z0-9_-]+');
parent::boot($router);
}
创建UserController制御器:
复制代码代码如下:
php 職人 make:controller UserController
Laravel帮私はlaravelappHttpControllers目录の下に文件UserController.phpを作成しました、文件の中から私が好んで一部骨フレームコードを書きました。修正文件laravelappHttpControllersUserController.php:
コードをコピーします コードは次のとおりです:
名前空間 AppHttpControllers;
AppHttpControllersController を使用します;
class UserController はコントローラーを拡張します {
パブリック関数 getUrl() {
$name = 'jing';
$blogId = 1;
$urls = array(
url('/user'),
action('UserController@getShow', array($name)),
ルート('ブログリスト', 配列($name)),
Route('ブログ', array($name, $blogId)),
);
foreach ($urls を $url として) {
echo "{$url}
n";
}
}
パブリック関数 getIndex() {
echo '私はユーザーリストです^_^';
}
パブリック関数 getShow($name) {
echo "ようこそ、{$name}";
}
}
BlogController コントローラーを作成します:
コードをコピーします コードは次のとおりです:
php 職人 make:controller BlogController
ファイル laravelappHttpControllersBlogController.php を変更します:
コードをコピーします コードは次のとおりです:
名前空間 AppHttpControllers;
AppHttpControllersController を使用します;
class BlogController extends Controller {
パブリック関数 getIndex($name) {
echo "これは {$name} のブログリストです";
}
パブリック関数 getShow($name, $blogId) {
echo "{$name} のブログの ID は {$blogId} です";
}
}
Laravel のアクションは、変数名に関係なく、変数の順序でバインドされるパラメーター バインディングもサポートしています。
追記
私は Laravel のファンですが、他のフレームワークをハッキングするつもりはありません。興味がある場合は、この小さなサンプルを実装するために自分の使い慣れたフレームワークを使用できます。言語の制限はありません。
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。
この記事を友達と共有したり、コメントを残してください。皆様のご支援に心より感謝申し上げます。