Ответ 1
Возьмите этот контроллер в качестве примера:
<?php
class TestController extends BaseController {
public function getIndex()
{
echo "a";
}
public function postSecond($a)
{
echo "b";
}
}
В ваших маршрутах, если у вас
Route::controller('tests', 'TestController');
И выполните
php artisan routes
У вас будет:
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| Domain | URI | Name | Action | Before Filters | After Filters |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| | GET /tests/index/{v1}/{v2}/{v3}/{v4}/{v5} | | [email protected] | | |
| | GET /tests | | [email protected] | | |
| | POST /tests | tests.store | [email protected] | | |
| | GET /tests/{_missing} | | [email protected] | | |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
Laravel проверяет контроллер и генерирует маршруты на основе того, какие методы он находит, автоматически.
Но если вы делаете
Route::resource('tests', 'TestController');
Вы получите список маршрутов:
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| Domain | URI | Name | Action | Before Filters | After Filters |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
| | GET /tests | | Closure | | |
| | GET /tests | tests.index | [email protected] | | |
| | GET /tests/create | tests.create | [email protected] | | |
| | POST /tests | tests.store | [email protected] | | |
| | GET /tests/{tests} | tests.show | [email protected] | | |
| | GET /tests/{tests}/edit | tests.edit | [email protected] | | |
| | PUT /tests/{tests} | tests.update | [email protected] | | |
| | PATCH /tests/{tests} | | [email protected] | | |
| | DELETE /tests/{tests} | tests.destroy | [email protected] | | |
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+
Отсутствие угадывания, Laravel использует предопределенный список маршрутов CRUD, вы можете удалить некоторые из этих маршрутов, но он не будет проверять ваш контроллер на создание маршрутов для ваших методов.
Вы решаете, что лучше всего для вас. Но, как правило, если ваш контроллер является CRUD, Route:: resource() - хороший старт, другой - вы можете использовать Route:: controller() или вручную создавать маршруты.
ИЗМЕНИТЬ:
Нет действительно, почему один или почему другой, это всего лишь вопрос дизайна и выбора. Некоторые из них никогда не будут использовать ни одного из них. Это просто шляпа Route::resource()
следует за маршрутизацией Rails: http://guides.rubyonrails.org/routing.html.
Используя Route::resource()
, вам не нужно создавать все эти методы, но в итоге вы получите список бессмысленных маршрутов, потому что Laravel всегда создает все по умолчанию, если вы не выполните:
Route::resource('photo', 'PhotoController',
array('only' => array('index', 'show')));
И ваш список маршрутов покажет только действия индекса и шоу.
Кроме того, если вам нужны какие-то другие маршруты, используя Route::resource()
, вам придется создавать их вручную или использовать некоторую магию, чтобы сделать их автоматическими для всех ваших находчивых маршрутов. Использование Route::controller()
все автоматически, каждый раз, когда вы добавляете новый метод, для вас создается новый маршрут.
Опять же, если у вас есть контроллер CRUD для сборки, начните с Route::resource()
. В противном случае подумайте о преимуществах того или иного в вашем конкретном случае.
EDIT2:
Это отличная статья от Phil Sturgeon (PyroCMS и PHP-FIG) о преимуществах ручной сборки всех ваших маршрутов: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil.