直到现在我才使用 DICE,尽管我查看了它的实现以便向您展示第一个选项。我希望它会奏效。如果没有,请随意阅读有关call
规则和create
方法的 DICE 文档/代码。
注意:标题应该类似于“FastRoute:将路由参数传递给处理程序”或“FastRoute:将路由参数传递给处理程序”,因为前缀被定义为路由部分,它被添加到路由组内的每个路由模式之前.
选项 1:使用call
DI 容器 (DICE) 的规则:
当然,这是推荐的方式,因为 DI 容器会自动注入方法参数。这可能比从路线中读取的更多!
注意:控制器方法=:“动作”。
请参阅(在 DICE 文档中):
路线:
$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;
用户控制器中的操作:
public function list($userName, $userId = NULL) {
return 'User name = ' . $userName . ', User id = ' . $userId ?? 'N/A';
}
选项 2:调用操作(不带 DICE),分别将所有路由参数传递给它:
路线:
相同。
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;
用户控制器中的操作:
public function list($userName, $userId = NULL) {
return 'User name = ' . $userName . ', User id = ' . $userId ?? 'N/A';
}
选项 3:调用操作(不带 DICE),传递 Request 类的实例:
将路由参数列表作为属性分配给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;
用户控制器中的操作:
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';
}