Nettrine ORM – inject repozitáře

Phalanx
Člen | 310
+
0
-

Ahoj,

zkouším balíček Nettrine ORM a potřebuju trochu pomoct. Když v presenteru použiju EntityManager @inject pak zdroják běží správně. Pokud ale chci použít přímo repozitář CategoryRepository @inject, pak mi skáče chyba:

Service ‚45_App_Model_Repository_CategoryRepository‘ (type of App\Model\Repository\CategoryRepository): Service of type Doctrine\ORM\Mapping\ClassMetadata needed by $class in Doctrine\ORM\EntityRepository::__construct() not found. Did you register it in configuration file?

Rozumím, že třída CategoryRepository by měla dostat metainformace o třídě k níž je navázána. Neměla by to ale zaručovat vazba v entitě? repositoryClass="App\Model\Repository\CategoryRepository"


Částečně opisuju kód z:
https://github.com/…e/playground

Není tam příklad, kde by injectovali přímo repozitář plus je příklad trochu zastaralý (místo Nettrine\ORM\EntityManager se používá Nettrine\ORM\EntityManagerDecorator).

<?php

namespace App\Presenters;


use App\Model\Entity\Category;
use App\Model\Repository\CategoryRepository;
use Nettrine\ORM\EntityManagerDecorator as EntityManager;


final class HomepagePresenter extends BasePresenter
{
	/** @var CategoryRepository @inject */
	public $categoryRepository;

	/** @var EntityManager @inject */
	public $em;



	public function renderDefault()
	{
		$categoryRepository = $this->em->getRepository(Category::class);
		$this->template->test = $categoryRepository->findAll();
		//$this->template->test = $this->categoryRepository->findAll();
	}
}
?>
<?php

namespace App\Model\Repository;

use Doctrine\ORM\EntityRepository as DoctrineEntityRepository;

final class CategoryRepository extends DoctrineEntityRepository
{
	public function getById($id)
	{
		return $this->findOneBy([ 'id' => $id ]);
	}
}

?>
<?php

namespace App\Model\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use \Nettrine\ORM\Entity\Attributes\Id;


/**
 * @ORM\Entity(repositoryClass="App\Model\Repository\CategoryRepository")
 */
class Category
{

	use Id;


	/**
	 * @ORM\Column(type="string")
	 * @var string
	 */
	private $title;



	// ...

}

?>
extensions:
	# Console
	console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)

	# DBAL
	dbal: Nettrine\DBAL\DI\DbalExtension
	dbal.console: Nettrine\DBAL\DI\DbalConsoleExtension

	# ORM
	orm: Nettrine\ORM\DI\OrmExtension
	#orm.cache: Nettrine\ORM\DI\OrmCacheExtension
	orm.console: Nettrine\ORM\DI\OrmConsoleExtension
	orm.annotations: Nettrine\ORM\DI\OrmAnnotationsExtension

	# extensions
	nettrine.extensions: Nettrine\Extensions\DI\DoctrineExtensionsExtension

orm.annotations:
	paths:
		- App/Model/Entity
	excludePaths: []
	ignore: []
	defaultCache: filesystem


services:
	# ...

	- App\Model\Repository\CategoryRepository

Editoval Phalanx (11. 12. 2018 12:16)

Martk
Člen | 652
+
+1
-

Třídu metadata se předává v metodě getRepository v EntityManager (ne přímo v ní, ale trošku hlouběji), pokud chceš repozitář jako službu, tak asi takto (nevím, jestli to bude funkční):

services:
	categoryRepository:
		class: App\Model\Repository\CategoryRepository
		create: @Doctrine\ORM\EntityManagerInterface::getRepository('App\Model\Entity\Category')

Proč chceš injectovat rovnou repozitář?

Phalanx
Člen | 310
+
0
-

@Martk Aha, takhle, díky moc. Repozitáře se teda vůbec nepoužívají jako služby, ale získávají se vždy přes entity manager.

V převzatém kódu jsem to tak měl nastavené (projekt na Kdyby\Doctrine) a zkoušel jsem funkčnost zachovat pro snazší přepis.

Martk
Člen | 652
+
+1
-

@Phalanx Kdyby\Doctrine si tohle dělá samo na podobném principu, co jsem popsal výše. Nettrine je nejjednodušší implementace doctrine, takže si to budeš muset v případě potřeby dodělat.

Felix
Nette Core | 1186
+
+1
-

Diky za dotaz. A diky @Martk za nasmerovani.


Není tam příklad, kde by injectovali přímo repozitář plus je příklad trochu zastaralý (místo Nettrine\ORM\EntityManager se používá Nettrine\ORM\EntityManagerDecorator).

Jenom upresnim. EntityManager je v posledni verzi final, takze je potreba pristupovat pres EntityManagerDecorator.

Viz: https://github.com/…yManager.php#L66

KristianSubweb
Člen | 144
+
0
-

Ahojte je to už staršie vlákno ale celkom by ma zaujímalo ako teraz riešite ten prístup ku Repositáru ako službe? Mne sa ten prístum tiež celkom páči. Aktuálne som začal používať Nettrine/Orm pred tým som tiež používal Kdyby/Doctrine.

Dikes za vaše odpoveďe.