我有一个Car
- 实体,它是insurance fees
(不是实体的一部分!),我是由外部提供商收到的。目前我正在互相反对:
当前:(伪代码)
foreach ($insuranceFeesArr as $insuranceFeesObj):
if ($insuranceFeesObj.carId == $car.id):
echo 'Fees: ' . $insuranceFeesObj.USD; // "Fees: 75.00 USD"
endif;
endforeach;
我想在任何地方准备/合并数据(存储库?服务?),以便能够通过Car
访问保险费:
渴望:(twig)
{{ car.insuranceFees.USD }} // Fees: 75.00 USD
什么是最好或最好的做法?
提前致谢!
答案 0 :(得分:2)
我假设你用学说来管理你的实体。
您应该为此目的创建存储库服务。
use Doctrine\ORM\EntityRepository;
class CarRepository extends EntityRepository
{
$protected $insuranceFeeApi;
public function setInsuranceFeeApi($insuranceFeeApi)
{
$this->insuranceFeeApi = $insuranceFeeApi;
return $this;
}
/**
* overwrite doctrine repository functions you will use to enrich your car entities with insurancefee objects
*/
public function fetchAll()
{
$insuranceFees = $this->insuranceFeeApi->getInsuranceFees(); //pseudocode
$cars = parent::fetchAll();
//enrich your car instances here
return $cars;
}
}
将此存储库设置为用于您的汽车实体的存储库:
/**
* @Entity(repositoryClass="CarRepository")
*/
class Car
{
// ...
}
将此存储库声明为服务:
insurance_fee_api:
class: My\InsuranceFee\Api
car_repository:
class: Doctrine\ORM\EntityRepository
factory_service: doctrine.orm.default_entity_manager
factory_method: getRepository
arguments:
- My\Entity\Car
calls:
- ['setInsuranceFeeApi', ['@insurance_fee_api']]
在您的控制器中使用此存储库来获取您的汽车实例:
$carRepository = $this->get('car_repository');
$cars = $carRepository->fetchAll(); // cars with insurancefees
您现在可以将这些汽车实例传递到视图模板,并根据需要访问保险。
使用此方法的缺点:
您不能对CarRepository的依赖项使用构造函数注入
您可能无法使用$this->getDoctrine()->getRepository()
获取存储库。相反,您必须通过容器