Laravel 4, определяющий контроллеры RESTful

Итак, я новичок в структуре Laravel с версии 4 и задаюсь вопросом, как создать и использовать контроллеры RESTful. Прочитав документацию, я немного смущен относительно разницы между контроллерами RESTful и контроллерами ресурсов.

При определении контроллера RESTful, согласно документам, предлагается сделать следующее в routes.php:

Route::controller('posts', 'PostController');

В PostController, мы определяем методы класса путем префикса имени метода с помощью глагола HTTP, который мы хотели бы использовать? Например:

class PostController extends \BaseController {
    public function getIndex()
    {
        //
    }
}

Однако он также описывает способ создания контроллеров ресурсов в файле routes.php следующим образом:   Route:: resource ('posts', 'PostController');

И в PostController.php мы определяем методы без префикса с помощью HTTP-глагола.

class PostController extends \BaseController {
    public function index()
    {
        //
    }
}

В чем разница между этими двумя? И когда мы используем один вместо другого, и почему?

Кроме того, следует использовать Route::controller('posts', 'PostController'); или Route::resource('posts', 'PostController'); для передачи маршрутизации в контроллер или мы должны определить каждый маршрут вручную, например ниже:

Route::get('/users', '[email protected]');
Route::get('/users/create', '[email protected]');
Route::post('/users', '[email protected]');
Route::get('/users/{id}', '[email protected]');
Route::get('/users{id}/edit', '[email protected]');
Route::put('/users', '[email protected]');
Route::delete('/users', '[email protected]');

Ответы

Ответ 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.

Ответ 2

@Ответ Антонио хорош. Позвольте мне сказать что-то подобное и важное немного более сжато. В routes.php:

Route::resource('users', 'UserController');

Использование метода ресурса делает Laravel предполагаемым CRUD-функциональностью, и он ищет только свои шесть предварительно подготовленных CRUD-методов: индексировать, создавать, хранить, показывать, уничтожать и т.д. Он не будет "видеть" любые другие, новые методы вы создаете там.

Route::controller('info', 'InfoController');

Использование метода контроллера позволяет создавать пользовательские методы/страницы. Laravel ищет их, когда вы добавляете имя метода/страницы с помощью HTTP-глагола. В вашем XxxxController.php:

class InfoController extends \BaseController {

    public function getFeatures()
    {
        return View::make('info.features');
    }

    public function getContactUs()
    {
        return View::make('info.contact-us');
    }

    public function getPricing()
    {
        return View::make('info.pricing');
    }

}