Enstage
Enstage

Reputation: 2126

Laravel Reusing Controller Logic

I have multiple controllers, with multiple methods, which all return views.

class PageController extends Controller {
    public function index()
    {
        // do lots of stuff
        return view('view.name', $lotsOfStuffArray);
    }

    public function list()
    {
    //...and so on
}

I now have the need to create an API, which performs much of the same logic as the methods above, but returns a JSON output instead:

class PageApiController extends Controller {
    public function index()
    {
        // do lots of the same stuff
        return $lotsOfStuffCollection;
    }

    public function list()
    {
    //...and so on
}

What is the best way to accomplish this without having to copy and paste code from one controller to the other?

I've tried placing a lot of the logic into traits and using them in my Eloquent models, but that still requires that I copy and paste code from controller to controller. I should also note its not viable to check expectsJson() and return a response accordingly as I have many, many methods.

Is it a good idea to have the logic stored in a parent class and then create a child controller that responds with a view and a child controller that responds with JSON?

Upvotes: 1

Views: 1801

Answers (1)

Wistar
Wistar

Reputation: 3790

You could abstract the logic to a service class. I have answered a similar question.

You have PageController, PageAPIController and PageService.

class PageService {
    public function doStuff()
    {
        return $stuff;
    }
}

class PageController extends Controller {
    public function index()
    {
        $service = new PageService();
        $stuff = $service->doStuff();
        return $stuff;
    }

}

class PageAPIController extends Controller {
    public function index()
    {
        $service = new PageService();
        $stuff = $service->doStuff();
        return $stuff->toJSON();
    }

    protected function toJSON(){
       //You could also abstract that to a service or a trait.
    }

}

Upvotes: 6

Related Questions