Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como usar função de outro controller?

Como o título já diz, gostaria de saber como usar, em um controller A, uma função que está em outro controller B. Pensei em importar o outro controller e assim usar tal função, mas não sei se esta é a forma mais "correta".

3 respostas
solução!

Oi Carlos, tudo bom?

Não sei se entendi bem, mas sua ideia é utilizar uma rota de um controller em outro? Ou é apenas uma função mesmo?

Caso seja apenas uma função, você pode separar essa função em uma outra classe (normalmente um serviço) e utilizar essa classe nos dois controllers.

Caso seja uma rota, você pode simplesmente redirecionar.

Aguardo retorno.

Abraço!

Olá André, Quero usar uma função que está em outro controller.

Da forma que aprendi, eu junto no controller todas as funções que eu preciso para manipular um determinado Modelo.

A sua resposta bateu exatamente em uma dúvida que me perseguia, se é comum fazer isso no laravel: criar uma outra classe e juntar todas as funções em comum (uma classe DAO, por exemplo) e trabalhar ela no controller. Eu sei que eu posso organizar meu código como eu quiser, mas não sabia se essa era a prática mais recomendada no Laravel.

Oi Carlos,

Também já tive essa dúvida e aprendi/resolvi da forma que o Laravel recomenda: Service Providers (IoC Container), ou por meio de Dependency Injection.

É um nome chique para dizer que você criou uma classe auxiliar (às vezes chamada de repository pelos tutoriais de Laravel), que é responsável por prover a manipulação de uma entidade/contexto/modelo e a chamou dentro do Controller.

Eu defendo a visão purista do MVC, onde o Controller não faz nada, só manda alguém fazer. Portanto, eu crio uma classe para essa função que manipula um modelo. Especificamente no Laravel, o Controller é uma camada Http, então deveria ser responsável apenas por coordenar as Http Requests (nada de manipulação de Model aqui).

Exemplos:

ActionsController:

public function store(
    Request $request,
    ActionResourceInterface $action
) {
    $action = $action->store($request->all());
    // algumas chamadas aqui

    return redirect()->route('actions.edit', [$action->id])->with('message', 'Adicionado');
}

PrivateActionsController, que usa a mesma implementação daquele método mas em outro lugar da aplicação:

public function store(
    Request $request,
    ActionResourceInterface $action
) {
    $action = $action->store($request->all());
    // outras chamadas aqui

    return $action;
}

Arquivo config/app.php:

'providers' => [
    // ...
    App\Classes\Actions\ActionResourceServiceProvider::class,
]

Arquivo ActionResourceServiceProvider.php

// ...
public function register()
{
    $this->app->bind('App\Classes\Actions\ActionResourceInterface', function () {
        return new ActionResource();
    });
}
// ...

Arquivo ActionResourceInterface.php

namespace App\Classes\Actions;

interface ActionResourceInterface
{
    public function store($actionData);
}

Arquivo ActionResource.php

namespace App\Classes\Actions;

class ActionResource implements ActionResourceInterface
{
    public function store($actionData)
    {
        // ...
    }
}