簡體   English   中英

FastRoute:將路由前綴傳遞給處理程序

[英]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:將路由參數傳遞給處理程序”,因為前綴被定義為路由部分,它被添加到路由組內的每個路由模式之前.

方案一:使用DI容器(DICE)的call規則:

當然,這是推薦的方式,因為 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;

UserController 中的操作:

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;

UserController 中的操作:

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;

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM