Nettrine ORM – inject repozitáře
- Phalanx
- Člen | 310
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 | 661
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ář?
- Martk
- Člen | 661
@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 | 1245
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.
- KristianSubweb
- Člen | 146
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.