Kdyby\Doctrine – IEntityProvider

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

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?

Jiří Nápravník
Člen | 710
+
+1
-

Nemas u te entity User anotaci

/**
* @ORM\Entity
*/
class User
{
...
AlesMenzel
Člen | 13
+
0
-

Já jsem věděl, že to bude nějaká blbost :D. Díky!