Controllery – ich význam a základy používania

xvital
napísal @xvital (460), pred 5 rokmi, posledná úprava 14.1.2019 22:44

V tomto blogu nadviažem na posledný článok o routingu. Controllery s routami dosť úzko súvisia.

Controller je základným kameňom každej, aspoň trochu rozsiahlejšej aplikácie. Primárnou úlohou controllerov je oddeliť logiku spracovania požiadavky od zvyšku aplikácie. Bez tejto abstrakcie by boli naše route súbory obrovské, pretože by obsahovali celú logiku spracovania požiadaviek.

Ako sa však dostane požiadavka do controllera? Vďaka routeru. V route file sme zadefinovali, ktorý controller má spracovať požiadavku smerovanú na daný endpoint aplikácie. Laravel sa postará, aby naša požiadavka dorazila do príslušného controllera a tam ju môžeme spracovať.

Definícia route a controllera

Pripomeňme si, ako vyzerá základná definícia cesty v route súbore, ktorá zabezpečí spracovanie GET požiadavky zaslanej na endpoint forum, controllerom ThreadController – konkrétne jeho akciou (metódou) index:

Route::get('/forum', 'ThreadController@index');

Súbor controllera je možné vytvoriť v app/Http/Controllers, omnoho jednoduchšie je však použiť vstavaný artisan príkaz

php artisan make:controller ThreadController

ThreadController by mohol v tomto prípade po implementácii metódy index vyzerať napríklad takto:

<?php

namespace App\Http\Controllers;

use App\Thread;
use App\Http\Controllers\Controller;

class ThreadController extends Controller
{
    /**
     * Zobrazenie zoznamu 10 najnovsich tem fora.
     *
     * @param  int  $id
     * @return View
     */
    public function index()
    {
        $threads = Thread::latest()->take(10)->get();

        return view('thread.index', compact('threads'));
    }
}

Jednoúčelový controller (controller s jedinou akciou)

Menej bežná je definícia controllera s jedinou akciou. V určitých prípadoch však môže prísť táto možnosť vhod. Namiesto definície jednotlivých akcií zadefinujete jedinú metódu __invoke v triede controllera.

Route by potom vyzeral napríklad takto

Route::get('/forum', 'IndexController');

Trieda controllera by v tomto prípade obsahovala obsahovala implementáciu metódy __invoke

public function __invoke()
{
    $threads = Thread::latest()->take(10)->get();

    return view('thread.index', compact('threads'));
}

Pri použití jednoúčelového controllera môžete využívať všetky ostatné možnosti (predávanie parametrov, explicitná definícia konštruktora, …). artisan podporuje aj vytváranie jednoúčelových controllerov, stačí použiť prepínač --invokable.

Štandardné akcie controllerov

Dobrým zvykom je používať štandardné akcie controllerov vždy, pokiaľ to je možné. Je to štandard, ktorý zabezpečí, že váš kód bude ľahšie pochopiteľný a rýchlejšie čitateľný. Preto rozhodne odporúčam dodržiavať. Prehľadnú tabuľku nájdete priamo v dokumentácii.

Pre vytvorenie resource controlleru (obsahuje všetky uvedené akcie), môžete použiť pri vytváraní controlleru prepínač --resource. Ak chcete do jednotlivých metód automaticky vložiť aj triedu modelu na ktorý sa controller vzťahuje (type-hinting), použite pri vytváraní controlleru prepínač --model=NazovModelu.

Ešte nie si členom CZ/SK Laravel komunity?

To možeš ľahko zmeniť. Registrácia je zdarma a ako registrovaný člen získaš množstvo výhod. Prečítaj si prečo by si mal byť členom.

Prihlásiť sa Zaregistrovať

Mohlo by Ťa zaujímať: