Symfony 3:如何动态操纵实体?

时间:2016-08-09 10:30:56

标签: php oop symfony

我有一个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

什么是最好或最好的做法?

提前致谢!

1 个答案:

答案 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()获取存储库。相反,您必须通过容器

  • 获取存储库