简体   繁体   English

Lumen (5.8.12) - 带前缀的多个可选参数

[英]Lumen (5.8.12) - Multiple optional paramter with prefix

I am trying to create an endpoint like this:我正在尝试创建这样的端点:

/most-popular/language/{language}[/max/{max}[/page/{page}]]

It's working perfectly if I create two separates routes:如果我创建两条单独的路线,它会完美运行:

/most-popular/language/en/max/10
/most-popular/language/en/max/10/page/2

But I can't do this:但我不能这样做:

/most-popular/language/en/page/2

How can I set my route in order to be able to use multiple optional parameters based on prefix?如何设置路由以便能够使用基于前缀的多个可选参数?

$router->get(
    '/most-popular/language/{language}[/max/{max}[/page/{page}]]', array(
    'as' => 'most-popular',
    'uses' => 'MyController@myMethod'
));

I don't think it's possible to do this directly.我认为不可能直接做到这一点。 The route matcher is quite strict.路由匹配器非常严格。 You might be able to cheat though and declare all the possible incarnations of the routes.不过,您也许可以作弊并声明所有可能的路线化身。

$callback = function (Request $request) {
    $defaults = [
        'language' => 'language/en',
        'max' => 'max/10',
        'page' => 'page/1'
    ];
    $language = $request->route('language', $defaults['language']);
    $max = $request->route('max', $defaults['max']);
    $page = $request->route('page', $defaults['page']);
    dd($language, $max, $page);
    // Some string splitting may be required
};


$router->get('/most-popular',$callback);
$router->get('/most-popular/{page:page/\d+}',$callback);
$router->get('/most-popular/{max:max/\d+}',$callback);
$router->get('/most-popular/{language:language/\w+}',$callback);
$router->get('/most-popular/{language:language/\w+}/{max:max/\d+}',$callback);
$router->get('/most-popular/{language:language/\w+}/{page:page/\d+}',$callback);
$router->get('/most-popular/{max:max/\d+}/{page:page/\d+}',$callback);
$router->get('/most-popular/{language:language/\w+}/{max:max/\d+}/{page:page/\d+}',$callback);

Admittedly I didn't actually try this on Lumen but in Laravel (using equivalent syntax) but if I'm reading the docs correctly it should work.诚然,我实际上并没有在 Lumen 上尝试过这个,而是在 Laravel 中(使用等效语法),但如果我正确阅读文档,它应该可以工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM