Я работаю над приложением Symfony, использующим MVC и шаблон репозитория.Теперь я хочу иметь определенные сущности, которые используют mysql, и вызывать DatabaseRepository и другие сущности, которые собраны из API, и использовать ApiRepository.
Теперь для сущностей mysql я использую ORM по умолчанию, но для сущностей api я использовал жретчтобы собрать их данные.
Фрагмент базы данных репозитория:
/**
* @method Merchant|null find($id, $lockMode = null, $lockVersion = null)
* @method Merchant|null findOneBy(array $criteria, array $orderBy = null)
* @method Merchant[] findAll()
* @method Merchant[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class MerchantRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, Merchant::class);
}
}
Фрагмент ApiRepository:
/**
* Get a merchant by Id
*
* @param $transaction
* @return Merchant
*/
public function find($id, $lockMode = null, $lockVersion = null) {
if(strpos($id, Merchant::blockchainNameSpace()) !== false) {
$id = explode("#", $id)[1];
}
// Specify API Call
$url = $this->api_url . "Merchant/" . $id;
$merchant = $this->client->get($url, [
'query' => [
'id' => $id,
'filter' => '{"include": "resolve"}',
]
]);
$merchant = $merchant->getBody()->getContents();
$merchant = \GuzzleHttp\json_decode($merchant, true);
$m = $this->convertToMerchant($merchant);
return $m;
}
ConvertToMerchant:
/*
* Convert merchant array to marchant
* @param array $merchant
* return Merchant
*/
public function convertToMerchant(array $merchant) {
$m = new Merchant();
$m->setId($merchant['id']);
$m->setName($merchant['name']); $m->setUsers($this->userRepository()->findByMerchant($merchant['id']));
}
Выше Ядал пример относительно моего Продавца.Теперь мой пользователь, использующий mysql, связан с Merchant, и я хочу получить список Merchants, который есть у этого пользователя.
Однако всякий раз, когда я вызываю метод find для репозитория пользователя, он пытается найти все отношения внутриРепозитории mysql вместо репозитория сущностей, определенного классом.
Класс пользователя:
/**
* @ORM\Entity(repositoryClass="App\Repository\UserDatabaseRepository")
* @ORM\Table(name="user")
*/
class User extends BaseUser implements EntityInterface, UserInterface
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(type="string", nullable=true)
*/
private $email;
/**
* @var Collection
*
* @ORM\ManyToMany(targetEntity="App\Entity\Merchant", inversedBy="users")
*/
protected $merchants;
}
Класс продавца:
/**
* @ORM\Entity(repositoryClass="App\Repository\MerchantApiRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Merchant extends EntityBase
{
/**
* @var int
*
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $name;
/**
* @var User[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\User", mappedBy="merchants")
*/
private $users;
}
Теперь я ожидаю, чтокогда я пытаюсь найти пользователя, он извлекает пользователя из базы данных (идентификатор, адрес электронной почты и все идентификаторы продавцов) и извлекает продавцов из хранилища API, поскольку я указал класс Merchant для вызова MerchantApiRepository.
Однако вместо этого он извлекает пользователя из базы данных (идентификатор, адрес электронной почты и все торговые идентификаторы) и пытается извлечь продавцов из базы данных, выдавая ошибку, поскольку они не существуют в базе данных.
I 'я ожидал, что он будет использовать репозиторий, определенный в Торговой Сущности, однако, похоже, что он использует репозиторий, определенный ПользователемEntity.
Как я могу заставить его функционировать так, чтобы он использовал хранилище, указанное в сущности Merchant при получении пользователя?