2014-06-21 1 views
0

У меня есть этот кодLaravel NotFoundHttpException появляется, хотя у меня есть функция

<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

Я думаю, вам нужно сказать нам, чего вы пытаетесь достичь, например. что «админы» имеют отношение к остальной части вашего кода, на какой странице вы хотите установить ссылку. – Unnawut

+0

@Unnawut Я пытаюсь вызвать указанный url, но я получил заявленное исключение –

+0

Да, но какие 'рестораны/админы/25' должны делать, когда вы обращаетесь к нему, какова функция/метод, который следует вызывать, и т. Д. – Unnawut

ответ

1

TL; DR

Я хотел бы предложить вам использовать URL restaurants/25/admins вместо ресторанов/админов/25, так что объекты упорядочены от большого к малому, то есть рестораны -> один ресторан -> админ ресторана. Итак, для этого ответа я буду использовать:

<a href="{{ URL::to('restaurants/25/admins') }}"> 

Тогда в вашем маршруте вы можете сделать:

Route::get('restaurants/{id}/admins'), '[email protected]'); 
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', '[email protected]'); 
Route::get ('restaurants/{id}', '[email protected]'); 
Route::get ('restaurants/create', '[email protected]'); 
// There are a few more generated. See http://laravel.com/docs/controllers#resource-controllers 

Как вы наверное знаете, первый маршрут для отображения всех ресторанов. Второй маршрут предназначен для отображения конкретного ресторана. Третий для отображения формы для добавления ресторана.

Следует отметить, что Laravel просто генерирует эти маршруты, поэтому вам не нужно много раз писать много маршрутов. То, что вы пишете в методах контроллера (функции a.k.a.), полностью зависит от вас. Вы можете сделать свой /restaurants показать форму для добавления ресторанов, а /restaurants/create показать список ресторанов. Но это разрушает назначение контроллеров ресурсов, потому что предполагается, что вы будете писать код проще и короче, хотя и быть понятным!

Итак, если мы согласны с тем, что делает Laravel.При этом один линии маршрута:

Route::resource('restaurants', 'RestaurantsController'); 

вы получаете URL, зарезервированный для отображения всех ресторанов (/restaurants), другой URL для отображения конкретного ресторана (/restaurants/{id}), а другой URL для формы, чтобы добавить новый ресторан (/restaurants/create). Примечание: Есть 7 маршрутов, но я упоминаю только 3 здесь для краткости.

Если я правильно понимаю, то, что вы пытаетесь сделать, это добавить еще одну функцию. Вам нужна страница, которая отображает список администраторов для ресторана. Это то, что не соответствует 3 URL-адресам, которые у нас есть, поэтому вы решили создать еще один, например. restaurants/admins/25.

Моя первая рекомендация вам в том, что при структурировании URL-адреса попробуйте организовать от самого большого объекта до наименьшего. Ваш оригинальный restaurants/admins/25 переводится примерно на:

Restaurants > Admins of a restaurant > One restaurant

Если бы я тебя, я бы что-то вроде этого:

Restaurants > One restaurant > Admins of a restaurant

Так вместо ресторанов/админов/25 мой URL будет:

<a href="{{ URL::to('restaurants/25/admins') }}"> 

Вы чувствуете разницу? Теперь у нас есть URLs, которые являются гораздо более понятным:

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'), '[email protected]'); 
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, /restaurants/25/photos и т.д., как вам нравится так же, как описано выше.

0

введите admins из вашего URL-адреса. Он не существует, поэтому он генерирует исключение.

Вы хотите, чтобы URL::to('restaurants/25/show') более чем вероятно.

Полезный совет для визуализации ваших маршрутов, в частности Resourceful Controllers, - это artisan routes в вашей консоли.

+0

, которая не является полностью помогающим решением (я не знаю, работает ли она bty), но, возможно, будущее, мне нужна была функция, как 'restaruants/info/id', я был бы в беде –

+0

Ну, это либо работает, либо нет. Если вы хотите, чтобы такой маршрут просто строил его. Находчивые контроллеры должны использоваться определенным образом ... вы не можете просто надеяться, что они работают так, как вы хотите. Используйте «ремесленные маршруты», чтобы посмотреть, как выглядят пути вашего контроллера ресурсов, и это поможет вам. –