Nettrine repositář a PHPStan

Petr Parolek
Člen | 455
+
0
-

Ahoj, používám nettrine orm a stále uvažuju, jestli se tento zdlouhavý zápis v neonu nedá zjednodušit:

    fooRepository:
        class: App\Model\Repositories\FooRepository
        tags:
            doctrine.repositoryEntity: App\Model\Foo

    barRepository:
        class: App\Model\Repositories\BarRepository
        tags:
            doctrine.repositoryEntity: App\Model\Bar

Co takhle decorator nebo tagy? Jde to prosím nějak?

Když zaregistruju repozitář klasicky jako službu:

	/**
	 * @var EntityManagerDecorator
	 */
	public $em;

	/**
	 * @var App\Model\Repositories\FooRepository
	 */
	public $fooRepository;

	public function __construct(
		EntityManagerDecorator $em,
		App\Model\Repositories\FooRepository $fooRepository
	)
	{
		parent::__construct();
		$this->em = $em;
		$this->fooRepository = $fooRepository;
	}
services:
	- App\Model\Repositories\FooRepository

tak PHPStan řve:

Property App\Components\Forms\FooForm::$fooRepository (App\Model\Repositories\FooRepository) does not accept Doctrine\Persistence\ObjectRepository.

Mysteria
Člen | 797
+
0
-

PHPStan ti říká pravdu, protože pokud nemáš pro entitu vlastní repository, tak si tam přijde ObjectRepository. Uprav anotaci aby přijímala obě možnosti:

	/**
	 * @var App\Model\Repositories\FooRepository&\Doctrine\Persistence\ObjectRepository
	 */
	public $fooRepository;
Petr Parolek
Člen | 455
+
0
-

nefunguje

Mysteria
Člen | 797
+
0
-

Tak zkus ještě | místo &, koukal jsem že někde v kódu mám i to. Vyzkoušel jsem to a normálně jedno z toho mi vždy zabere:

/**
* @var XRepository
*/
private $xRepository;

Property X\XManager::$xRepository (X\XRepository) does not accept Doctrine\ORM\EntityRepository<X>.
/**
 * @var XRepository|EntityRepository<X>
 */
private $xRepository;

Případně se podívej jestli máš i Doctrine extension pro PHPStan a jaký máš verze, já mám poslední aktuální.

Petr Parolek
Člen | 455
+
0
-

vyřešeno. Problém se týká pouze verze 0.11.19, která je za zenitem, veze 0.12.22 je ok. Díky @OndřejMirtes

Rada všem, nepoužívejte na Doctrine PHPStan 0.11 nebo registrujte repositáře jako DI služby a v konstruktoru nepředávejte takhle:

<?php
    /**
	 * @var EntityManagerDecorator
	 */
	private $em;

	/**
	 * @var UserRepository
	 */
	private $userRepository;

	public function __construct(
		EntityManagerDecorator $em
	)
	{
		$this->em = $em;
		$this->userRepository = $em->getRepository(User::class);
	}
?>

Zápis v neonu se mi zdá jako oprus u každého repozitáře:

services:
	userRepository:
		class: App\Model\Repositories\UserRepository
		create: @Doctrine\ORM\EntityManagerInterface::getRepository(App\Model\Entities\User)

Editoval ppar (4. 5. 2020 16:02)