1

例如,假设我有这条路线。

<?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} 传递给控制器​​方法?它在其文档中没有提及任何有关它的信息,也无法通过谷歌搜索找到有关它的信息。

4

1 回答 1

1

直到现在我才使用 DICE,尽管我查看了它的实现以便向您展示第一个选项。我希望它会奏效。如果没有,请随意阅读有关call规则和create方法的 DICE 文档/代码。

注意:标题应该类似于“FastRoute:将路由参数传递给处理程序”或“FastRoute:将路由参数传递给处理程序”,因为前缀被定义为路由部分,它被添加到路由组内的每个路由模式之前.

选项 1:使用callDI 容器 (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';
}
于 2018-02-20T02:07:03.440 回答