Prečítajte si niečo zaujímavé

Nette a Doctrine 2

Ako spojazdniť doctrine v Nette framework - u bez addonov

Po hodinách skúšania rôznych addonov a návodov som sa rozhodol prejsť na Doctrine dokumentáciu a nainštalovať Doctrine manuálne. Dokopy to zabralo asi 20 minút a mám k dispozícii celý Doctrine ako aj command line tool.

Ako nato?

Ako prvé je potrebné stiahnuť si do libs Doctrine (aktuálne verzia 2.4) alebo jednoducho pridať do composer.json

"require": {    "doctrine/orm": "*"}
Keď máme knižnicu k dispozícii, môžeme sa pustiť do nastavovania. Doctrine potrebuje pre správne fungovanie informácie o databázovom pripojení. Do config.neon na to stačí pridať do parametrov potrebné údaje, v mojom prípade nasledovné:
parameters:doctrine:driver:pdo_mysqlhost:localhostdbname:     hpdesk2user:adminpassword:   admin

Teraz nám už nič nebráni v tom aby sme v Bootstrap.php vytvorili inštanciu EntityManager –a a pridali ho medzi služby.

Postup je nasledovný:

  1. Uložme si údaje z config-u do premennej: $doctrine_data = $container->parameters['doctrine'];
  2. Doctrine potrebuje prístup k Setup-u a Manager-ovi:


        use Doctrine\ORM\Tools\Setup;    use Doctrine\ORM\EntityManager;
  3. Následne potrebujeme do premennej $paths uložiť lokácie, kde bude doctrine hľadať entity. V mojom prípade je to v dvoch moduloch, v zložkách model (nie najlepšie pomenovanie :))

    $paths = array(__DIR__ . "/SystemModule/model", __DIR__ . "/AdminModule/model");
  4. Pre nastavenie cache-ovania v doctrine je potrebné nastaviť v akom sme móde(napr: development)


    if ($container->parameters['environment'] == 'development') {    $isDevMode = true;} else {    $isDevMode = false;}
  5. Následne môžeme nastaviť spojenie a vytvoriť entity manažéra. V našom prípade používame anotácie:


    $dbParams = array(    'driver' => $doctrine_data['driver'],    'user' => $doctrine_data['user'],    'password' => $doctrine_data['password'],    'dbname' => $doctrine_data['dbname'],);$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);$entityManager = EntityManager::create($dbParams, $config);
  6. Teraz nám už ostáva iba pridať službičku do kontajnera:

    $container->addService('entityManager', $entityManager);

Toto je všetko čo potrebujeme k tomu aby sme mohli použiť doctrine. Kde všade budeme potrebovať prístup k službe entityManager? Minimálne v každom prezentéri a preto si do BasePresenter.php pridajme premennú:

    /** @var \Doctrine\ORM\EntityManager */    protected $em;

a v startupe jej priraďme službu z kontajnéra:

    public function startup() {parent::startup();$this->em = $this->getContext()->getService('entityManager');    } 

Teraz, ak máme vytvorenú napr. entitu Products môžeme v prezentéri zavolať:

$productRepository = $this->em->getRepository('SystemModule\Model\Products');

Tu si treba dať pozor kvôli namespace-om, pokiaľ by sme zadali iba Products, doctrine nám vyhlási chybu.

Čo nám ešte chýba ku šťastiu je príkazový riadok, ten potrebujeme, keďže nechceme manuálne vytvárať entity a aktualizovať databázu. Pokiaľ ste si inštalovali doctrine cez composer, tak v zložke vendor mate adresár bin, kde sa nachádzajú súbory doctrine a doctrine.php. V tomto adresári si vytvorte súbor cli-config.php s obsahom:

    <?php    use Doctrine\ORM\Tools\Console\ConsoleRunner;    require_once '../../app/bootstrap.php';    return ConsoleRunner::createHelperSet($entityManager);

Cestu si upravte k svojmu boostrapu.

Tak a sme hotoví! Ak si otvoríte shell alebo cmd a nasmerujete sa do adresára bin môžete spúšťať doctrine príkazy ako napr: php doctrine orm:schema-tool:update --force --dump-sql

Celý popis aj s jednoduchým tutoriálom nájdete v doctrine dokumentácii:

Dokumentácia

Tím web-solutions

Zdielaj článok

Komentáre (5)

  • avatar
    okehitozip Odpovedať

    http://cialis-20mg-lowestprice.org/ - Cialis 20 Mg Lowest Price <a href="http://5mg-generic-cialis.net/">Cialis 10 Mg</a> http://prednisone-20mg-buy.com/

  • avatar
    uzonocwo Odpovedať

    http://cialis-20mg-lowestprice.org/ - Cialis Buy <a href="http://5mg-generic-cialis.net/">Cialis Purchases Without A Prescription</a> http://prednisone-20mg-buy.com/

  • avatar
    Tomáš Votruba Odpovedať

    Parádní článek, taky něco podobného plánuju.

    Jak jsi s řešením spokojený teď?

    Btw, neplánuješ z toho udělat jednoduché extension?

  • avatar
    Július Koronci (Autor) Odpovedať

    Ahoj,
    S menšími vylepšeniami ale stale s tým istým princípom to funguje až dodnes na asi 3 projektoch a som s tým relatívne spokojný..na windowse robí trocha problém príkazový riadok..tam treba ísť cez vendor/doctrine/orm/bin ale ináč to šlape a je to milión krát lepšie ako dibi alebo Nette Database. Čo sa extensionu týka, žiaľ som prešiel na Szmfonz a v Nette už neprogramujem veľa takže skôr nie :(

  • avatar
    Tomáš Votruba Odpovedať

    Díky za zprávu.

    To mě těší, v Symfony taky programuju a spolu-organizuju srazy pro česko: http://www.symfony.cz/
    Vídáme se v Praze a Brně.

    Jak jste na tom v Bratislavě? Chtěl by ses zapojit?

Pridaj Komentár