Kdyby\Doctrine – IEntityProvider
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- AlesMenzel
- Člen | 13
Ahoj, předělávám projekt na modulovou strukturu. Používám Flame/Modules.
Dost jsem se nechal inspirovat bundly v symfony.
<projekt>
app/
config/
config.local.neon
config.neon
bootstrap.php
src/
XModule/
DI/ .. Extension class a routerFactory
model/
components/
database/
entities/
repositories/
queries/ .. "Query objekty":https://github.com/Kdyby/Doctrine/blob/master/docs/en/resultset.md#queryobject
services/
facades/
presenters/
templates/
resources/
config/
docs/
public/
css/
js/
translations/
tests/
YModule/
...
ZModule/
...
www/
Nedaří se mi však namapovat entity pomocí IEntityProvider. Jedinou dokumentaci, kterou jsem k tomuto tématu našel je z IEntityProvider, kde se píše, že by tato metoda měla vracet pole typu ‚Namespace ⇒ mapping definition‘. Což (viz. kód) mi nefunguje.
@TomášVotruba "Dalším tipem je použití providerů, které umožňují předávání závislostí mezi moduly.
Ve zmíněném Kdyby\Doctrine např. IEntityProvider, který je odchytán v rozšíření – ten se stará o přidání tříd entit."
<?php
namespace X\DI;
use Flame\Modules\DI\ModulesExtension;
use Flame\Modules\Providers\IPresenterMappingProvider;
use Kdyby\Doctrine\DI\IEntityProvider;
use Nette\DI\CompilerExtension;
class Extension extends CompilerExtension implements IPresenterMappingProvider, IEntityProvider
{
/**
* Loads up the router factory
*/
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$builder->addDefinition('service.XRouterFactory')
->setClass('X\DI\RouterFactory')
->addTag(ModulesExtension::TAG_ROUTER);
}
/**
* Sets the mapping for presenters
*
* @return array Presenters mapping
*/
public function getPresenterMapping()
{
return [ '*' => '*\Presenters\*Presenter' ];
}
/**
* Sets the mapping for entities
*
* @return array Entity mapping
*/
public function getEntityMappings()
{
return [ 'X\Model\Database' => __DIR__ . '/../model/database/entities/' ];
}
}
?>
Nicméně když dám do cli příkaz:
>php www/index.php orm:info
tak mi to najde pouze 2 entity z Kdyby (BaseEntity a IdentifiedEntity).
Entita:
<?php
namespace X\Model\Database;
use Doctrine\ORM\Mapping as ORM;
class User
{
use \Kdyby\Doctrine\Entities\Attributes\Identifier;
/**
* @ORM\Column(name="first_name", type="string")
*/
protected $firstName;
/**
* @ORM\Column(name="last_name", type="string")
*/
protected $lastName;
public function __construct($firstName, $lastName)
{
$this->setFirstName($firstName);
$this->setLastName($secondName);
}
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
public function getLastName()
{
return $this->lastName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
}
?>
V čem dělám chybu?