PHPPamokos.lt


3. Katalogų struktūra ir namespacing

Turbūt didžiausias pakeitimas Laravel 5 versijoje, apie kurį kalba absoliučiai visi, yra katalogų struktūros pakeitimas. Ir, be abejo, pirmas įspūdis neigiamas - reikia perprasti iš naujo tai, prie ko jau buvome pripratę, ir sunku surasti konkretų failą kai reikia. Bet taip tik iš pirmo žvilgsnio - pasiaiškinkime kodėl.

Kas būtent pasikeitė?

Palyginkime seną Laravel 4 struktūrą ir naują Laravel 5 struktūrą:

Iš pirmo žvilgsnio, Laravel 5 atrodo labiau griozdška? Bet neišsigąskite, viską išsiaiškinsime iš eilės.

Kaip matote, esminis skirtumas - iš katalogo /app buvo daug kas iškelta į pagrindinį katalogą. To tikslas - logikos atskyrimas. Jei anksčiau /app kataloge buvo saugoma praktiškai visas back-end projektas, atskiriant tik CSS ir JS, tai dabar į /app eina tik pagrindinė mūsų aplikacijos logika. Sakykime, anksčiau buvęs katalogas /app/database iškeltas į tiesiog /database, nes (labai teoriškai) galima būtų pakeisti šitą duomenų bazės sluoksnį ateityje, paliekant neliestą /app logiką.

Didžiausias pakeitimas, sukeliantis daugiausiai painiavos, yra MVC trijulės atskyrimas:

  • Views dabar yra "nukištas" į katalogą /resources/views. Iš pirmo žvilgsnio - WTF? Bet vėlgi, galvojant pagal tą pačią logiką, Views sluoksnis neįeina į aplikacijos logiką ir teoriškai gali būti nesunkiai pakeistas kitu HTML šablonu.
  • Controllers - dabar yra giliau /app/Http/controllers. Katalogas Http atsirado tam, kad atskirtų visą logiką, susijusią su HTTP užklausų apdorojimu, tai Controlleriai būtent tą funkciją ir atlieka.
  • Models katalogas gi... išvis dingo! Nuo šiol, jei kuriate Eloquent modelį, talpinkite jį tiesiogiai į /app, pvz /app/User.php ar /app/Book.php. Bet, jeigu jums patogiau - galite susikurti katalogą /app/Models.

Kur dabar dėti failą X?

Toks klausimas, tiesą pasakius, kildavo ir Laravel 4 versijoje - vientiso sprendimo kaip ir nebūdavo, realiai viskas lankstu - pats suskirstai savo projekto struktūrą. Penktoje versijoje tas lankstumas vis dar išliko, bet dabar kiek aiškiau, kur tiksliau rekomenduojama dėti savo failus:

  • Jei tai Eloquent modelis - tada jis keliauja tiesiai į /app pagrindinį katalogą (nebent norite ten viduje sukurti /Models savo patogumui)
  • Jei tai failas, susijęs su adreso ar URL užklausos apdorojimu (controlleris, validacija) - tai eina į /app/Http.
  • Jei tai susiję su komandinės eilutės komandomis, tai turbūt eis į /app/Console.
  • Jei tai susiję su filtrais, tai turbūt eis į /app/Http/Filters.

Aišku, yra visokių variantų ir, iš esmės, kiekvienas projektas unikalus ir turi savo logiką. Tad, jei nesate tikri dėl savo katalogų struktūros, kaip sakoma, pasitarkite su gydytoju arba vaistininku kokiu kolega Laravel specialistu.

Namespaces ir Use

Padirbėjęs kažkiek ilgiau su Laravel 5, pastebėjau gan apčiuopiamą skirtumą, kiek savo projektuose turiu use sakinių failų pradžioje. Gaunasi toks efektas - kadangi katalogų struktūra yra sudėtingesnė, tai reiškia, kad pasiekti kažkokią klasę panaudojimui nebėra taip paprasta - ji yra kataloge kuris yra visai kitame lygyje. Tai siekiamybė, kad jei savo klasės viduje naudojate kitą klasę, kad jos naudojimas su Namespace būtų aprašytas iškart viršuje:

namespace App\Http\Controllers;
use Redirect;
use App\User;
use App\Http\Requests\CreateUserRequest;

Dar įdomus pakeitimas liečia Eloquent ryšius - jei nurodinėsite, kad vienas modelis susijęs su kitu pvz per belongsTo funkciją, skliausteliuose jau reikia nurodyti ne tik modelį, bet pilną kelią iki jo: App\User. Pavyzdys:

function user() {
	return $this->belongsTo('App\User');
}

Vėlgi galbūt atrodo labiau griozdiška ir papildomas kodo rašymas, bet siekiamybė - daugiau tvarkos ir griežtumo struktūrose.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com