Laravel 5路由中多个可选参数

5

我遇到了Laravel 5的问题,确切地说,我找不到解决方法。在C#(ASP.NET MVC)中,这很容易解决。例如,我有以下路由(为简单起见,我只会输入路由内容和函数头部分):

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

该函数定义在Product控制器内部。函数头如下:
public function list($page = 1, $category = null)

问题在于,每当我只输入一个参数时,它不会按照我在路由中设置的参数名称发送该参数的值,而是按照函数参数顺序推送值。 因此,当我打开 /Page1 时,它可以正常工作,将值 1 发送到 $page 变量, 但是当我访问 /Golf(即兴编造的),它也将值发送到 $page 变量。 有什么可能的方法可以避免这种情况,或者我是否真的需要创建不同的函数来处理这些情况?
在 C# 中,它会正确发送值,并保留未定义参数的默认值。
希望您能为我解答。 提前感谢您,祝您愉快 :)
2个回答

12

所以,正如您所看到的,参数是按顺序而不是按名称传递给函数。

为了实现您想要的功能,您可以通过将请求对象类型提示到函数中来访问这些路由参数,如下所示:

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");
    }
}

当然,你需要设置所有三个路由指向同一个控制器方法:

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

希望这能有所帮助..!

谢谢,这正是我需要的。我忘记了我有一个手动从请求中检索参数的选项,因为我还是 Laravel 的新手。@tcPeng 感谢您的回复,看起来很不错,但我认为这是一个更复杂的解决方案,但它仍然有所帮助。再次感谢你们两个,我希望这能帮助其他遇到相同或类似困境的会员 :) - Megastorm
如果只有少量的多个参数,那么这是一个不错的技巧。 但是如果我需要为SomeController@index设置很多过滤器怎么办? 例如:"/some" -> "SomeController@index" 可以应用多个过滤器: type-{type?}/color-{color?}/brand-{brand?}... 并且这些过滤器可以按不同的顺序和数量应用? - LINKeRxUA

1

如果您想在控制器中获取参数,可以使用以下方法:

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

对于/aaa/Page3$params将是array(category => 'aaa', page => '3')
对于/Page3$params将是array(page => '3')
对于/aaa$params将是array(category => 'aaa')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接