Doctrine2 adresarova struktura pre Nette projekt
- misiak
- Člen | 28
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
- Doctrine
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
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 :)
- misiak
- Člen | 28
<?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
- entities
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)