Generovanie kódu s Yii framework

Yii, free open-source framework, je dostupný verejnosti približne od roku 2008. Jeho autor sa podieľal na vývoji frameworku Prado. Yii prichádza so silou, šikovnosťou a množstvom funkcií, ktoré urýchľujú vývoj webových projektov. Jednou z tých najšikovnejších, najviac uľahčujúcich prácu, je generovanie kódu — o ňom si dnes povieme.

Ú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 generovanie
  • ipFilters 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:

Nové téma

Nevíte si rady? Něco vám nefunguje? Zeptejte se
ostatních čtenářů na našem fóru!
      

<?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.

Referencie

Tvorbe webov sa venuje od roku 2003, kedy začínal s HTML a JavaScriptom. Dnes pracuje ako PHP web developer vo WebSupporte, má rád veci dotiahnuté do konca, zaujíma sa o typografiu na weboch, fonty a CSS3.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 22

Přehled komentářů

mato prvy :D
LV Budoucnost Yii?
ujovlado Re: Budoucnost Yii?
VM featury?
ujovlado Re: featury?
gawan čo urobí generátor ak prídam stĺpec do DB?
ujovlado Re: čo urobí generátor ak prídam stĺpec do DB?
Michal Re: čo urobí generátor ak prídam stĺpec do DB?
ujovlado Re: čo urobí generátor ak prídam stĺpec do DB?
gawan Re: čo urobí generátor ak prídam stĺpec do DB?
ujovlado Re: čo urobí generátor ak prídam stĺpec do DB?
Michal Re: čo urobí generátor ak prídam stĺpec do DB?
Kolemjdoucí Re: čo urobí generátor ak prídam stĺpec do DB?
drla Re: Generovanie kódu s Yii framework
ujovlado Re: Generovanie kódu s Yii framework
drla Re: Generovanie kódu s Yii framework
ujovlado Re: Generovanie kódu s Yii framework
srigi Re: Generovanie kódu s Yii framework
drla Re: Generovanie kódu s Yii framework
vvoody gii url
ujovlado Re: gii url
tom Cobolstina
Zdroj: https://www.zdrojak.cz/?p=3502