ngyuki/route-collector
Composer 安装命令:
composer require ngyuki/route-collector
包简介
Simple route collector
关键字:
README 文档
README
ルート定義をメソッドチェインでできるようにしてはどうかと思って作ったサンプル。
Example
$registry = new RouteRegistry(); $r = new RouteCollector($registry); // GET / -> HomeController::index $r->path('/')->get()->controller('HomeController')->action('index'); // GET|POST /both -> HomeController::both $r->path('/both')->get()->post()->controller('HomeController')->action('both'); // GET|POST /both -> HomeController::method $r->path('/method')->method('GET|POST')->controller('HomeController')->action('method'); $r->controller('UserController')->group(function (RouteCollector $r) { $r->path('/user')->group(function (RouteCollector $r) { // GET /user -> UserController::index $r->get()->action('index'); // GET /user/create -> UserController::create $r->path('/create')->get()->action('create'); // POST /user/create -> UserController::store $r->path('/create')->post()->action('store'); }); $r->path('/user/{id}')->group(function (RouteCollector $r) { // GET /user/{id} -> UserController::show $r->get()->action('show'); // GET /user/{id}/edit -> UserController::edit $r->path('/edit')->get()->action('edit'); // PUT /user/{id}/edit -> UserController::update $r->path('/edit')->put()->action('update'); // DELETE /user/{id}/edit -> UserController::delete $r->path('/edit')->delete()->action('delete'); }); }); return $registry->getRoutes();
詳細
メソッドチェインを用いた内部 DSL からルート定義の配列を作成するライブラリです。
以下のメソッドでルートを定義します。
path(string $path)- URL のリクエストパス
get()/post()/put()/patch()/delete()/method(string $method)- リクエストメソッド
params(array $params)param(string $name, mixed $value)- ルートパラメータ
これら以外の名前でマジックメソッドが呼ばれると param($name, $value) に置き換えられます。よって、下記の2つの呼び出しは等価です。
$r->controller('HomeController')->action('index'); $r->param('controller', 'HomeController')->param('action', 'index');
チェインが途切れたところで1つのルートが登録されます。
// これで1つのルート定義 $r->path('/')->get()->controller('HomeController')->action('index');
チェインの順番を入れ替えても同じ結果になります。
// ↑と同じルート定義 $r->action('index')->controller('HomeController')->get()->path('/');
リクエストメソッドのチェインを複数つなげると複数のリクエストメソッドにマッチします。
// GET と POST の両方にマッチします $r->path('/')->get()->post()->controller('HomeController')->action('index');
リクエストメソッドは method() で文字列リテラルでパイプ区切りでも指定できます。
// GET と POST の両方にマッチします $r->path('/')->method('GET|POST')->controller('HomeController')->action('index');
path のチェインを複数つなげるとパスが連結されます。
// '/aaa/bbb' にマッチします $r->path('/aaa')->path('/bbb')->get()->controller('HomeController')->action('index');
params のチェインはマージされます。
// params(['aaa' => 9, 'bbb' => 2, 'ccc' => 3]) とマージされる $r->path('/')->get() ->params(['aaa' => 1]) ->params(['aaa' => 9, 'bbb' => 2]) ->params(['ccc' => 3]);
group で途中まで定義されたルート定義を元に複数のルート定義ができます。
でチェインの途中で複数のルートを定義できます。
$r->controller('UserController')->group(function (RouteCollector $r) { // このブロックのルート定義ではコントローラーに UserController が適用される $r->get()->path('/users')->action('index'); $r->post()->path('/users')->action('store'); $r->path('/user/{id}')->group(function (RouteCollector $r) { // このブロックのルート定義ではパスの先頭に /user/{id} が追加される // /user/{id} $r->get()->action('show'); // /user/{id}/edit $r->get()->path('/edit')->action('edit'); }); });
マジックメソッドの警告を抑止
マジックメソッドを使用すると PhpStorm で警告が表示されますが、RouteCollector を継承したクラスで @method アノテーションを記述すれば大丈夫です。
// MyRouteCollector.php /** * @method $this controller(string $controller) * @method $this action(string $action) */ class MyRouteCollector extends RouteCollector {}
// routes.php $registry = new RouteRegistry(); $r = new MyRouteCollector($registry);
本来であれば $this ではなく static にするべきなのですが、なぜか PhpStorm だと @method ときに static による補完が効かなかったため $this にしています。
気になるなら @method は使わずに普通にメソッド定義をしてください。これなら static でも補完が効きます。
// MyRouteCollector.php class ActionRouteCollector extends RouteCollector { /** * @param string $controller * @return static */ public function controller($controller) { return $this->param(__FUNCTION__, $controller); } }
ngyuki/route-collector 适用场景与选型建议
ngyuki/route-collector 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.46k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2017 年 08 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「router」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 ngyuki/route-collector 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 ngyuki/route-collector 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 ngyuki/route-collector 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Router
PMVC App Action Router
Database alias router extension for Nette Framework
PHP Router
A PSR7 / PSR-15 compatible HTTP router.
Simple PHP Router, with prefix groups and filtering
统计信息
- 总下载量: 1.46k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 7
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-08-08