EntityRepository u Doctrine

Nax
Člen | 35
+
0
-

Zdravím,

snažím se udělat EntityRepository pro entitu User (tedy UserRepository). Nejsem si ale jist jak má tato věc být navržena. Začal jsem tak, že jsem vytvořil třídu UserRepository, která je rozšířením třídy Doctrine\ORM\EntityRepository, naimplementoval jsem pár custom funkci pro vyhledávání a zaregistroval jako service v configu. Když jsem to ale chtěl vyzkoušet, dostal jsem Exception:

Nette\Utils\AssertionException

The magic auto-detection of entity for repository App\Repository\UserRepository for Kdyby\Doctrine\DI\IRepositoryFactory was removed from Kdyby.You have to specify doctrine.repositoryEntity tag with classname of the related entity in order to use this feature

Pochopil jsem tedy že je potřeba nějakým způsobem aplikaci sdělit, jakou entitu má vlastně UserRepository na starosti. Přidal jsem tedy do configu následující řádky:

userRepository:
	class: App\Repository\UserRepository
		tags:
			doctrine.repositoryEntity: App\Models\User

To ale způsobilo následující vyjímku:

TypeError

Return value of Container_23d11fb8c0::createServiceUserRepository() must be an instance of App\Repository\UserRepository, instance of Kdyby\Doctrine\EntityDao returned

Container se snaží získat UserRepository tímto způsobem:

$service = $this->getService('doctrine.default.entityManager')->getRepository('App\Models\User');

Jenže tento způsob z nějakého důvodu nevrací muj UserRepository ale EntityDao..

Repozitář je implementován takto:

<?php

namespace App\Repository;


use App\Models\User;
use Doctrine\ORM\EntityRepository;
use Kdyby\Doctrine\EntityManager;
use Kdyby\Doctrine\Mapping\ClassMetadata;

final class UserRepository extends EntityRepository {

	/**
	 * @var EntityManager
	 */
    private $em;

	/**
	 * UserRepository constructor.
	 * @param EntityManager $entityManager
	 */
    public function __construct(EntityManager $entityManager) {
    	parent::__construct($entityManager, new ClassMetadata(User::class));

        $this->em = $entityManager;
    }

	/**
	 * @param int $id
	 * @return User
	 * @throws \Doctrine\ORM\ORMException
	 * @throws \Doctrine\ORM\OptimisticLockException
	 * @throws \Doctrine\ORM\TransactionRequiredException
	 */
    public function getById(int $id) : User {
    	$user = $this->em->find(User::class, $id);

    	if($user instanceof User) {
    		return $user;
		}
		return null;
	}

	/**
	 * @param string $email
	 * @param string $password
	 * @return User
	 * @throws \Exception
	 */
	public function create(string $email, string $password) : User {
 		$user = new User($email, $password);

 		$this->em->persist($user)
			->flush();

 		return $user;
	}

	/**
	 * @param User $user
	 * @return User
	 * @throws \Exception
	 */
	public function update(User $user) : User {
 		$this->em->persist($user)
			->flush();

 		return $user;
	}

	/**
	 * @param User $user
	 * @throws \Exception
	 */
	public function remove(User $user) : void {
 		$this->em->remove($user)
			->flush();
	}

}

Dokázal by mi někdo prosím vysvětlit co jsem pochopil špatně? :)

Díky a přeju pěkný den

Nax
Člen | 35
+
0
-

Aha, tak to bylo zpusobeno tím, že jsem entitě user neřekl který repozitář se má používat.

namespace App\Models;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="\App\Repository\UserRepository")
 * @ORM\Table(name="user")
 */
class User {

    public const COLUMN_EMAIL = "email";

    /**
     * @ORM\Id