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ť.
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'));
}
}
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
.
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
.
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ť