我有这段代码
<li>
<a href="{{ URL::to('restaurants/admins/25') }}">
<i class="fa fa-location-arrow"></i> profile
</a>
</li>
在路线中,我有这个:
Route::resource('restaurants', 'RestaurantsController');
但是我收到了这个错误:
Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException
你可以帮忙吗?
答案 0 :(得分:1)
<强> TL; DR 强>
我建议您使用网址restaurants/25/admins
而不是餐馆/管理员/ 25,以便实体从大到小排序,即餐馆 - &gt;一家餐厅 - &gt;餐厅的管理员。所以,对于这个答案,我将使用:
<a href="{{ URL::to('restaurants/25/admins') }}">
然后在您的路线中,您可以:
Route::get('restaurants/{id}/admins'), 'RestaurantsController@admins');
Route::resource('restaurants', 'RestaurantsController');
在控制器代码中,您可以:
class RestaurantsController
{
// your code for index(), show(), etc...
public function admins($id)
{
// Whatever you want Laravel to do for /restaurants/{id}/admins
}
}
答案很长:
让我解释一下resource controller
的作用。在Laravel,当你这样做时:
Route::resource('restaurants', 'RestaurantsController');
它或多或少是一个自动扩展为这些的助手:
Route::get ('restaurants', 'RestaurantsController@index');
Route::get ('restaurants/{id}', 'RestaurantsController@show');
Route::get ('restaurants/create', 'RestaurantsController@create');
// There are a few more generated. See http://laravel.com/docs/controllers#resource-controllers
您可能知道,第一条路线是显示所有餐厅。第二条路线用于显示特定餐厅。第三个用于显示添加餐馆的表单。
需要注意的是,Laravel只生成这些路线,因此您无需反复编写多条路线。你在控制器的方法(a.k.a. functions)中写的内容完全取决于你。您可以让/restaurants
显示添加餐馆的表单,/restaurants/create
显示餐馆列表。但是这会破坏资源控制器的目的,因为它可以让你更容易和更短地编写代码,同时仍然可以理解!
所以,如果我们符合Laravel的作用。这条单线路线:
Route::resource('restaurants', 'RestaurantsController');
您会收到一个保留用于显示所有餐馆(/restaurants
)的网址,另一个用于显示特定餐馆的网址(/restaurants/{id}
),以及另一个用于添加新餐馆的网址的网址({{1 }})。 注意:有7条路线,但为了简洁,我在这里只提到3条路线。
如果我理解正确,您要做的是添加其他功能。您想要一个显示餐馆列表管理员的页面。这是不适合我们现有的3个网址的东西,所以你决定创建另一个网址,例如/restaurants/create
。
我给你的第一个建议是,在构建网址时,尝试从最大的实体到最小的实体进行排列。您的原始restaurants/admins/25
大致翻译为:
餐厅&gt; <餐厅管理员>一家餐馆
如果我是你,我会选择这样的事情:
餐厅&gt;一家餐馆&gt;一家餐馆的管理员
所以我的网址不是餐馆/管理员/ 25,而是:
restaurants/admins/25
你能感觉到区别吗?现在我们有更容易理解的网址:
<a href="{{ URL::to('restaurants/25/admins') }}">
现在您的路线文件只需要额外的一行来支持restaurants <-- show all restaurants
restaurants/25 <-- show restaurant #25
restaurants/25/admins <-- show admins in restaurant #25
restaurants/create <-- show form to create a new restaurant
这是我们的自定义操作:
admins
在控制器代码中,您可以:
Route::get('restaurants/{id}/admins'), 'RestaurantsController@admins');
Route::resource('restaurants', 'RestaurantsController');
从此处开始,您可以按照自己喜欢的方式添加class RestaurantsController
{
// your code for index(), show(), etc...
public function admins($id)
{
// Whatever you want Laravel to do for /restaurants/{id}/admins
}
}
,/restaurants/25/info
等。
答案 1 :(得分:0)
从您的网址中取出admins
。它不存在,因此抛出异常。
所以你更希望URL::to('restaurants/25/show')
。
可视化您的路线的有用提示,特别是资源控制器,是您控制台中的artisan routes
。