虽然我有这个函数,但是出现了laravel NotFoundHttpException

时间:2014-06-21 19:08:55

标签: php laravel laravel-4 blade

我有这段代码

<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
你可以帮忙吗?

2 个答案:

答案 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