Laravel - Route :: resource vs Route :: controller

138

Li os documentos no site do Laravel, Stack Overflow e Google, mas ainda não entendo a diferença entre Route::resourcee Route::controller.

Uma das respostas disse que Route :: resource era para crud. No entanto, com Route :: controller, podemos realizar o mesmo que com Route :: resource e podemos especificar apenas as ações necessárias.

Eles parecem ser como irmãos:

Route::controller('post','PostController');
Route::resource('post','PostController');

Como podemos escolher o que usar? O que é uma boa prática?

Sonique
fonte
12
Apenas uma observação para os usuários do Laravel 5.2, enquanto os controladores implícitos estão obsoletos.
Roy

Respostas:

281

Controlador de Recurso RESTful

Um controlador de recurso RESTful configura algumas rotas padrão para você e até os nomeia.

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

Fornece as seguintes rotas nomeadas:

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

E você configuraria seu controlador mais ou menos assim (actions = methods)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Você também pode escolher quais ações são incluídas ou excluídas da seguinte maneira:

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

Documentação do RESTful Resource Controller


Controlador implícito

Um controlador implícito é mais flexível. Você é roteado para os métodos do seu controlador com base no tipo e no nome da solicitação HTTP. No entanto, você não tem nomes de rotas definidos para você e ela captura todas as subpastas para a mesma rota.

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

O levaria a configurar o controlador com um tipo de esquema de nomeação RESTful:

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

Documentação implícita do controlador


É uma boa prática usar o que você precisa, conforme sua preferência. Pessoalmente, não gosto dos controladores implícitos , porque eles podem ser confusos, não fornecem nomes e podem ser confusos ao usar php artisan routes. Normalmente, uso controladores RESTful Resource em combinação com rotas explícitas.

ryanwinchester
fonte
1
Se usarmos várias rotas de recursos (talvez indexar, mostrar), por que não usar rotas estáticas Route :: get (...)? Eu acho que não é melhor nem pior do que usar array ('only' => array ('index', 'show'). E qual método usado para o controlador RESTFull quando solicitamos algo como 'user / 123', getIndex () funciona para 'user /' mas com user / 123 recebo NotFoundHttpException erro (tentaram nomes diferentes GetView e outros, só funciona quando declarar como Controller @ getView)?
Sonique
Alguém pode esclarecer a que se destina 'resource.edit'? É um método GET, então presumo que ele deva fornecer informações completas sobre um recurso, em vez de apenas informações limitadas via 'resource.show'?
Anthony
1
@ Anthony - resource.edité mostrar uma visualização de edição, basicamente, o formulário para editar um recurso existente.
Ryanwinchester
@ fungku Isso é interessante .. então você está dizendo que o resource.edit realmente retornaria HTML em vez de JSON?
Anthony
2
@ Anthony Geralmente, (e até onde eu sei) sim. resource.edite resource.createnormalmente são para uma interface do usuário ... renderizando uma exibição com formulários HTML. Esses formulários seriam PUT / POST resource.updatee resource.storerespectivamente. Se você não estiver fazendo isso, poderá ignorá-los e se livrar dos métodos edit () e create () no seu controlador.
Ryanwinchester
3

Para o método do controlador de rota, temos que definir apenas uma rota. No método get ou post, temos que definir a rota separadamente.

E o método de recursos é usado para criar várias rotas para lidar com uma variedade de ações Restful.

Aqui a documentação do Laravel sobre isso.

Ahmad Sharif
fonte