Laravel 5 multiple optional parameters in route

浪尽此生 提交于 2020-01-23 08:37:50

问题


I have a problem with Laravel 5, and to be precise, I can't find the solution for it. In C# (ASP.NET MVC) it's easy to solve. For example, I have these routes (I'll just type the route content, and the function header, for the sake of simplicity)

/{category}/Page{page}
/Page{page}
/{category}

The function is defined inside Product controller. function header looks like this:

public function list($page = 1, $category = null)

the problem is, whenever I enter just one argument, it doesn't send the value for the parameter by the name I set in the route, but rather, it pushes values by function parameter order. So, when I open /Page1, it works properly, value of 1 is sent to $page variable, but when I access /Golf(made up on the spot), it also sends the value to the $page variable. Any possible idea how to avoid this, or do I really need to make different functions to handle these cases?

In C#, it properly sends the value, and keeps the default value for undefined parameter.

Hope you have an answer for me. Thank you in advance and have a nice day :)


回答1:


So, as you've seen the parameters are passed to the function in order, not by name.

To achieve what you want, you can access these route parameters from within your function by type hinting the request object to it like this:

class ProductController extends Controller
{
    function list(Request $request){  # <----------- don't pass the params, just the request object

        $page = $request->route('page');   # <--- Then access by name
        $category = $request->route('category');

        dd("Page: $page | Category: $category");
    }
}

Then of course you would set all 3 of your routes to hit that same controller method:

Route::get('/{category}/Page{page}', 'ProductController@list');
Route::get('/Page{page}', 'ProductController@list');
Route::get('/{category}', 'ProductController@list');

Hope this helps..!




回答2:


if you want to get the parameters in your controller, you can use this:

public function list() {
    $params = $this->getRouter()->getCurrentRoute()->parameters();
}

for /aaa/Page3, the $params would be array(category => 'aaa', page => '3')
for /Page3, the $params would be array(page => '3')
for /aaa, the $params would be array(category => 'aaa')



来源:https://stackoverflow.com/questions/43749043/laravel-5-multiple-optional-parameters-in-route

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!