Doctrine2 adresarova struktura pre Nette projekt

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
misiak
Člen | 28
+
0
-

Zdravim,

ako mate riesenu adresarovu strukturu a co vsetko ste spravili aby vam Doctrine 2 islo bez problemov v Nette?

Ja konkretne som Doctrine umiestnil do lib asi nejak takto

  • app
  • lib
    • Doctrine
      • Common
      • DBAL
      • ORM
    • Nette

postupoval som podla pandy v https://forum.nette.org/…-2-me-reseni no mierne som to upravil lebo mi to nefungovalo. Teraz mam problem, ze mam napriklad entitu

<?php

namespace uBlog\Entities;

use uBlog\Entities\BaseEntity;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Role
 *
 * @author  Michal Kvasničák, michal.kvasnicak@gmail.com
 * @link    http://www.kvasnicak.info
 */
/** @Entity */
class Role extends BaseEntity
{

    /**
     * @Id @Column(type="integer")
     * @generatedValue
     * @var int
     */
    protected $id;


    /**
     * @Column(length=50, unique=true)
     * @var string
     */
    private $name;


    /**
     * @oneToMany(targetEntity="Permission")
     * @Column(name="permission_id")
     * @var array
     */
    private $permission;


    public function __construct()
    {
        $this->permission = new ArrayCollection;
    }


    public function setName($name)
    {
        $this->name = (string) $name;
    }


    public function setPermission($permission)
    {
        $this->permission[] = $permission;
    }


    public function getName()
    {
        return $this->name;
    }


    public function getPermission()
    {
        return $this->premission;
    }
} ?>

a ked chcem vytvorit v bootstrap.php pod require na bootstrap.doctrine.php entitu
<?php
	$permission = new \uBlog\Entities\Permission();
	$permission->setResource('article');
	$permission->setPrivilege('view');
	$permission->setRole('administrator');

	$permission->persist();

	$role->getPermission()->add($permission);
	$role->persist(true);
?>

tak mi to hadze:

Compile Error - require(): Failed opening required 'F:\Development\www\uBlog\libs\Doctrine\Common\Colections\ArrayCollection.php' (include_path='.;C:\php5\pear')

pritom je ta cesta uplne spravna… mohli by ste prosim niekto zverejnit ako to mate riesene a funkcne?

Dakujem :)

Editoval misiak (20. 8. 2010 22:53)

misiak
Člen | 28
+
0
-

uf, oh, :) ospravedlnujem sa… moja nepozornost v Entities\Permission.php som mal na riadku

<?php

//tento riadok sa mi zdal v poriadku
use Doctrine\Common\Colections\ArrayCollection;

// ale nebol, pretoze mal byt takto :D

use Doctrine\Common\Collections\ArrayCollection;

?>

zvlastne ze ma Netbeans nevarovalo, sorry za otravovanie :)

Panda
Člen | 569
+
0
-

Můžeš mi pak prosím do toho vlákna napsat, co konkrétně Ti nefungovalo a co sis musel upravit? Díky.

Editoval Panda (21. 8. 2010 20:08)

misiak
Člen | 28
+
0
-
<?php

namespace uBlog\Entities;

use uBlog\Entities\BaseEntity;
use Doctrine\Common\Collections\ArrayCollection;

/* ... */
?>

mal som chybu v

<?php

/* ... */
use Doctrine\Common\Colections\ArrayCollection;
/* ... */

?>

nemal som tam uvedené Collections ale Colections

Bohužial mám iný problém. Skúšal som tvoj postup na doctrine-cli.php. Všetko som spravil ako si popísal vo vlákne no nakoniec pri spustení z príkazovej riadky doctrine-cli.php orm:schema-tool:create mi stále vypisovalo v boostrap.doctrine.php, že nedokáže nájsť Doctrine\Common\Cache\ArrayCache();

Vyriešil som to tak, že som tvoj bootstrap.doctrine.php upravil nasledovným spôsobom:

<?php

/**
 * Doctrine 2 bootstrap
 */

use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Nette\Environment;

require_once LIBS_DIR . '/Doctrine/Common/ClassLoader.php';

//toto tu je z dovodu ze CLI mi nevie najst classes
$classloader = new Doctrine\Common\ClassLoader('Doctrine', realpath(LIBS_DIR));
$classloader->register();
$classloader = new Doctrine\Common\ClassLoader('Symfony', realpath(LIBS_DIR));
$classloader->register();
$classloader = new Doctrine\Common\ClassLoader('uBlog', realpath(LIBS_DIR));
$classloader->register();


// ak je production mod tak sa pokusime nastavit APC cache inak arraycache
if (Environment::isProduction() && extension_loaded('apc')) {
    $cache = new Doctrine\Common\Cache\ApcCache();
} else {
    $cache = new Doctrine\Common\Cache\ArrayCache();
}

$config = Environment::getConfig('doctrine');

$doctrineConfig = new Configuration;

//nastavime cache
$doctrineConfig->setMetadataCacheImpl($cache);
$doctrineConfig->setQueryCacheImpl($cache);

//nastavime metadatadriver pre citanie anotacii z entit
$metadataDriver = $doctrineConfig->newDefaultAnnotationDriver(APP_DIR . '/entities');
$doctrineConfig->setMetadataDriverImpl($metadataDriver);

//nastavime proxy adresar a namespace a vypneme generovanie proxy tried pre produkcny mod
$doctrineConfig->setProxyDir(APP_DIR . '/proxies');
$doctrineConfig->setProxyNamespace('uBlog\Entities');
$doctrineConfig->setAutoGenerateProxyClasses(!Environment::isProduction());

//vytvorenie EventManageru
$eventManager = new Doctrine\Common\EventManager;

if ($config->connection->driver == 'pdo_mysql') {
        $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit('utf8', 'utf8_general_ci'));
}


//vytvorime instanciu EntityManageru
$entityManager = EntityManager::create((array) $config->connection, $doctrineConfig, $eventManager);
//a registracia do sluzieb
Environment::getServiceLocator()->addService('Doctrine\ORM\EntityManager', $entityManager);

//vytvorenie aliasov
Environment::setServiceAlias('Doctrine\\ORM\\EntityManager', 'EntityManager');
Environment::setServiceAlias('uBlog\\Database\\DatabaseManager', 'DatabaseManager');

?>

Takto mi to funguje aj cez konzolu ale najradšej by som bol keby som sa mohol toho $classloader-u zbavit.

No a nakoniec som mal problém s dedením Entít od BaseEntity, ktorá sa nachádzala v rovnakom adresári ako Entity… napríklad

  • app
    • entities
      • Article.php
      • BaseEntity.php
      • ostatne entity

teda v normálnom prostredí keď spustím web to funguje v poriadku ale ak spustím doctrine-cli.php s orm:schema-tool:create alebo update tak mi vypíše chybu, že uBlog\Entities\BaseEntity neexistuje.

Potom som prišiel na dve riešenia tohto problému:

  • Súbor BaseEntity.php som premenoval na AbstractBaseEntity.php čím sa v adresári presunul pred Article.php (kvôli zoradeniu podľa abecedy)
  • Súbor som preniesol do LIBS_DIR s tým, že som config.ini pre RobotLoader upravil nasledovne:

    service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%

    service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%

    na

    service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%

    service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%

Som si istý, že určite existuje elegantnejšie riešenie no neviem si rady, môžete poradiť :) Celý projekt je na https://github.com/misiak/uBlog ale upozorňujem, že je to vývojova verzia zatiaľ určená na hranie s Doctrine 2 (učenie sa) a celý výstup do layout je len narýchlo spravený. Nie je naformátovaný :) A celé to je desne napísané :)

Menšie doplnenie:
config.ini som musel upraviť, pretože cez doctrine konzolu mi to vypisovalo ze [console] sekcia neexistuje, tak som tam pridal nasledujúcu sekciu:

[console.doctrine.connection]

kam som skopíroval údaje z

[development.doctrine.connection]

Editoval misiak (21. 8. 2010 20:58)