[英]FastRoute: Pass route prefix to handler
例如,假設我有這條路線。
<?php declare(strict_types = 1);
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $router) {
$router->addRoute('GET', '/{slug}', ['App\Controllers\SomeController', 'someMethod']);
}, [ 'cacheFile' => ROOT . '/storage/cache/route.cache', 'cacheDisabled' => true, ]);
這是我如何處理路由,並調用控制器及其方法。
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
echo '404 Not Found';
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$allowedMethods = $routeInfo[1];
echo '405 Method Not Allowed';
break;
case FastRoute\Dispatcher::FOUND:
$controller = $dice->create($routeInfo[1][0]);
echo $controller->{$routeInfo[1][1]}($routeInfo[2]);
break;
}
如何將 {slug} 傳遞給控制器方法? 它在其文檔中沒有提及任何關於它的內容,並且無法通過谷歌搜索找到有關它的信息。
直到現在我才使用 DICE,盡管我查看了它的實現以向您展示第一個選項。 我希望它會起作用。 如果沒有,請隨時閱讀有關call
規則和create
方法的 DICE 文檔/代碼。
注意:標題應該類似於“FastRoute:將路由參數傳遞給處理程序”或“FastRoute:將路由參數傳遞給處理程序”,因為前綴被定義為路由部分,它被添加到路由組內的每個路由模式之前.
call
規則:當然,這是推薦的方式,因為 DI 容器會自動注入方法參數。 這可能比從路線中讀取的更多!
注意:控制器方法 =:“動作”。
請參閱(在 DICE 文檔中):
call
規則。路線:
$router->addRoute('GET', '/{userName}[/{userId:\d+}]', ['UserController', 'list']);
注意:如果你有可選的路由部分,那么你必須將相應的動作參數定義為可選。
FastRoute 的調度請求:
case FastRoute\Dispatcher::FOUND:
$controllerName = $routeInfo[1][0]; // "UserController"
$action = $routeInfo[1][1]; // "list" action
$parameters = $routeInfo[2]; // Action parameters list (e.g. route parameters list)
$rule['call'] = [ // Define the method to be called and the parameters to be passed to the further created controller.
[$action, $parameters],
];
$dice->addRule($controllerName, $rule);
$controller = $dice->create($controllerName); // UserController instance
break;
UserController 中的操作:
public function list($userName, $userId = NULL) {
return 'User name = ' . $userName . ', User id = ' . $userId ?? 'N/A';
}
路線:
相同。
FastRoute 的調度請求:
case FastRoute\Dispatcher::FOUND:
$controllerName = $routeInfo[1][0]; // "UserController"
$action = $routeInfo[1][1]; // "list" action
$parameters = $routeInfo[2]; // Action parameters list (e.g. route parameters list)
$controller = $dice->create($controllerName); // UserController instance
call_user_func_array(
[$controller, $action] // callable
, $parameters
);
break;
UserController 中的操作:
public function list($userName, $userId = NULL) {
return 'User name = ' . $userName . ', User id = ' . $userId ?? 'N/A';
}
將路由參數列表作為屬性分配給Request
實例(參見PSR-7 ),並將實例作為操作參數傳遞。
路線:
相同。
DI 容器定義:
// Share a Request instance.
$dice->addRule('Request', ['shared' => true]);
FastRoute 的調度請求:
case FastRoute\Dispatcher::FOUND:
$controllerName = $routeInfo[1][0]; // "UserController"
$action = $routeInfo[1][1]; // "list" action
$parameters = $routeInfo[2]; // Action parameters list (e.g. route parameters list)
// Create Request instance.
$request = $dice->create('Request');
// Assign the route parameters list to the Request instance.
$request->setAttribute('parameters') = $parameters
$controller = $dice->create($controllerName); // UserController instance
call_user_func_array(
[$controller, $action] // callable
, [$request]
);
break;
UserController 中的操作:
public function list(ServerRequestInterface $request) {
$userName = $request->getAttribute('parameters')['userName'];
$userId = $request->getAttribute('parameters')['userId'] ?? 'N/A';
return 'User name = ' . $userName . ', User id = ' . $userId ?? 'N/A';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.