我对Laravel 5有疑问,确切地说,我无法找到解决方案。 在C#(ASP.NET MVC)中,它很容易解决。 例如,我有这些路由(为了简单起见,我只输入路由内容和函数头)
/{category}/Page{page}
/Page{page}
/{category}
该功能在Product controller内定义。 函数头看起来像这样:
public function list($page = 1, $category = null)
问题是,每当我输入一个参数时,它不会通过我在路径中设置的名称发送参数的值,而是按函数参数顺序推送值。 所以,当我打开/ Page1,它工作正常,值1被发送到$ page变量, 但是当我访问/ Golf(当场制作)时,它还会将值发送到$ page变量。 任何可能的想法如何避免这种情况,或者我是否真的需要使用不同的函数来处理这些情况?
在C#中,它正确发送值,并保留未定义参数的默认值。
希望你有答案。 提前谢谢你,祝你有个愉快的一天:)
答案 0 :(得分:5)
因此,您已经看到参数按顺序传递给函数,而不是名称。
要实现您想要的功能,您可以通过类型将请求对象提示给它来从您的函数中访问这些路由参数:
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");
}
}
然后,当然你会设置所有3个路由以达到相同的控制器方法:
Route::get('/{category}/Page{page}', 'ProductController@list');
Route::get('/Page{page}', 'ProductController@list');
Route::get('/{category}', 'ProductController@list');
希望这会有所帮助..!
答案 1 :(得分: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')