Úvod
Ako Yii mieša karty PHP frameworkov sa už na Zdrojáku písalo. Poďme sa pozrieť ako Yii automaticky generuje kód.
Generovanie kódu
Tak ako sme začali využívať objektovo orientované programovanie po procedurálnom, a tak ako sme prešli ku MVC, tak si zaiste zvykneme na generovanie kódu a nebudeme chcieť už nič iné. Generovanie kódu patrí dnes k jedným z najdôležitejších (tzv. core) funkcií frameworkov. Tie, ktoré ho majú sa i vďaka nemu umiestňujú na vyšších priečkach v hodnoteniach. Yii framework medzi ne patrí, generovanie kódu má zvládnuté na jedničku, ľahko si naň zvyknúť.
Na začiatku cyklu projektu existuje len tabuľka v databáze, neskôr k nej vytvárame istú abstrakciu — model, vďaka ktorému môžeme k tabuľke vhodne pristupovať a meniť jej záznamy. Potom vytvárame v Controlleri konkrétne akcie (CRUD) slúžiace na manipuláciu s jej záznamami. Create Read Update Delete je súbor akcií, ktoré vykonávame takmer v každom projekte a takmer pri každom modeli. Nech sa jedná o akékoľvek entity v databáze, tieto operácie s nimi potrebujeme vykonávať vždy, a mechanické písanie kódu nás nikam neposúva, práve naopak.
Neustále písanie tej istej funkcionality pravdepodobne niekomu liezlo poriadne na nervy, a tak sa rozhodol tieto časti zautomatizovať — generovať ich.
Yii generuje kód za nás a spomínané kroky nie je nutné vykonávať, pretože obsahuje vstavané funkcie pre generovanie modulov, modelov a kompletných CRUDov vrátane controllerov, ktoré spolupracujú s modelom založeným na ActiveRecord
a umožňujú nám vykonávať štyri spomínané operácie. Samozrejmosťou je že, môžu byť naviazané na modul. Yii framework teda dodržuje architektúru MVC v každom smere, a to i pri generovaní kódu.
Yii ponúka generovanie kódu pomocou CLI ale i pomocou GUI — týmito dvoma sa budeme primárne zaoberať.
I. Príkazový riadok – CLI
CLI ponúka (ak nerátame help) 4 konzolové príkazy:
- message pre správu prekladov
- migrate pre manažovanie zmien v databáze
- shell pre spustenie CLI ku aplikácií
- webapp pre vygenerovanie základnej aplikácie
$ ./yiic help
Hint: Pri používaní na Windowse treba použiť yiic.bat
Všetky príkazy nájdeme v priečinku framework/cli/commands
, konkrétne s názvami MessageCommand.php
, MigrateCommand.php
, ShellCommand.php
a WebAppCommand.php
, pričom pre ShellCommand.php
sú zadefinované aj „podpríkazy“.
WebApp – prvotná aplikácia
Yii umožňuje vygenerovať jednoduchú aplikáciu, ktorá môže byť základom pre kompletný projekt.
$ cd framework $ ./yiic webapp ../aplikacia
Hint: Pre človeka menej skúseného s Yii odporúčam začať práve s webapp.
Po vygenerovaní aplikácie sa môžeme presunúť do adresára protected
v našej aplikácií, kde je pre nás dostupné CLI (súbor yiic
), avšak už s konfiguráciou pre našu aplikáciu.
$ cd ../aplikacia/protected/
Dostupné sú stále 4 príkazy.
Shell
$ ./yiic shell ../index.php $ help
Pričom ../index.php
je náš index súbor projektu — z neho sa načíta konfigurácia.
Shell ponúka opäť niekoľko príkazov:
- controller pre vygenerovanie controllera i s akciami, prípadne s reláciou k modulu
- crud pre vygenerovanie CRUD akcií nad modelom (možnosť relácie k modulu)
- form pre generovanie modelu pre formulár
- model pre generovanie modelu s možnosťou zadať názov tabuľky v databáze (dajú sa vygenerovať i všetky naraz)
- module pre vygenerovanie modulu pre aplikáciu i so základnou adresárovou štruktúrou
Po zadaní jedného z príkazov bez parametrov ( model
resp. help model
) sa nám zobrazí podrobný návod na použitie konkrétneho príkazu i s príkladmi.
>> model

Z príkladov je jasné, že model je možné vygenerovať niekoľkými spôsobmi. Podobne sú na tom i ostatné príkazy.
Migrate a Message
Tieto príkazy až tak ku generovaniu kódu nepatria, preto sa nimi budeme zaoberať neskôr.
Vytvorenie vlastného konzolového príkazu
Základom všetkých konzolových príkazov je CConsoleCommand
. Používa sa ako pri ShellCommand
tak i pri WebAppCommand
a ostatných príkazoch. CConsoleCommand
je v podstate Controller, ktorý sa stará o spracovanie parametrov a beh samotného príkazu. Tak ako aj Controller, má akcie (metódy s prefixom action
, ktoré je možné volať s tým, že predvolená akcia je index, no je možné ju zmeniť).
Hint: Netreba zabudnúť, že konzolová aplikácia má tiež svoj config: protected/config/console.php
Aby sme mohli využívať vlastný konzolový príkaz, ktorý bude pre nás dostupný, takisto ako CRUD, či controller, je nutné vytvoriť si v priečinku protected/commands/shell
súbor s triedou, ktorá rozširuje CConsoleCommand
:
$ cd protected/commands/shell $ vim HelloWorldCommand.php
Príklad:
<?php class HelloWorldCommand extends CConsoleCommand { public function actionIndex() { echo 'Hello world!'; } } ?>
Spustenie (zo shellu):
>> helloworld
V prípade, že by sme chceli vytvorený skript spúšťať napríklad pomocou CRONu, stačí opäť spustiť yiic
a ako argument zadať názov konzolového príkazu.
$ ./yiic helloworld
II. Gii webové rozhranie – GUI
Gii generátor kódu zapneme tak, že tento modul povolíme v hlavnom konfiguračnom súbore protected/config/main.php
a nastavíme heslo pre prístup k nemu.
<?php 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'1_My_3_Secure_5_Password_7', 'ipFilters'=>array('127.0.0.1','::1'), // 'generatorPaths' => array( // 'application.gii', // znamená "protected/gii" (default) // ), // 'newDirMode' => 0755, // default 0777 // 'newFileMode' => 0644, // default 0666 ), ), ?>
Existuje ešte pár možností ako Gii nastaviť (viď príklad vyššie).
generatorPaths
určuje cesty, kde máme umiestnené vlastné kódy/šablóny pre generovanieipFilters
povoľuje IP adresy odkiaľ je možné Gii spustiť- …
Hint: Kvôli bezpečnosti je dobré ponechať prístupné Gii len z lokálnej IP adresy.

Po úspešnom prihlásení máme na výber, podobne ako pri CLI, 5 možností (controller, crud, form, model a modul).

Vygenerovaný kód
Jednotlivé generátory vytvárajú rôzne súbory a priečinky. Príkazy controller a crud pridávajú súbory do protected/controllers
a šablóny do protected/views
, model a form zase do protected/models
, a module vygeneruje podobnú štruktúru aká sa nachádza v protected
do protected/modules
. Konkrétne názvy súborov samozrejme závisia od názvu modelov.
Rozšírenie a prispôsobenie Gii
Predstavme si, že sme sa rozhodli upraviť si generátor pre model tak, aby negeneroval v kóde žiadne komentáre, aby v ňom nebola funkcia relations()
ani search()
a aby zátvorky funkcií boli na konci riadku (tam kde je názov funkcie a nie na novom), prípadne chceme pridať nejaké anotácie. Skopírujeme si teda súbor framework/gii/generators/model/templates/default/model.php
do protected/gii/model/templates/custom/model.php
, vymažeme nepotrebné časti kódu a získame jednoduchý custom model:
<?php echo "<?phpn"; ?> /** * @author Vladimír Kriška * @version 1.2.0 * @since Version 1.0.1 */ class <?php echo $modelClass; ?> extends <?php echo $this->baseClass; ?> { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return '<?php echo $tableName; ?>'; } public function rules() { return array( <?php foreach($rules as $rule): ?> <?php echo $rule.",n"; ?> <?php endforeach; ?> ); } public function attributeLabels() { return array( <?php foreach($labels as $name=>$label): ?> <?php echo "'$name' => '$label',n"; ?> <?php endforeach; ?> ); } }

Akonáhle je úprava šablóny na generovanie hotová, je možné ju používať, pretože Gii ju deteguje a zobrazí sa vo výbere ponúkaných šablón.

Podobným spôsobom môžeme upraviť akékoľvek časti generovaného kódu, napr. zmeniť spôsob generovania formulárov pre CRUD tak, aby boli v tabuľkách. Alebo do nich, v prípade viacjazyčnej aplikácie, rovno implementovať preklady.
Přehled komentářů