Php 一个条令实体能自己解读吗?

Php 一个条令实体能自己解读吗?,php,doctrine-orm,doctrine,datamapper,single-responsibility-principle,Php,Doctrine Orm,Doctrine,Datamapper,Single Responsibility Principle,只是好奇。。我有一些这样的代码: //$em is EntityManager of Doctrine //$className is a type that uses polymorphism (subtype of a parent type) $pricing = $em->getRepository($className)->findOneBy(array( 'active' => true, 'product_id' => (int) $this

只是好奇。。我有一些这样的代码:

//$em is EntityManager of Doctrine
//$className is a type that uses polymorphism (subtype of a parent type)
$pricing = $em->getRepository($className)->findOneBy(array(
    'active' => true,
    'product_id' => (int) $this->id
));

//gets serialization of certain variables of $className
return $pricing->getSerialization();
但是。。。我是否可以将
getSerialization()
方法移到实体(即$className)内部,并从实体返回类参数,而不是在
$className
外部调用
findOneBy

我想这是不可能的,因为实体无法读取自身。对吗

我想解决的问题是。。。在上述示例中,实体通过条令填充,然后返回数据。因此,我必须使用另一个类来填充实体。如果没有原则,我知道可以做一些事情,例如从实体内部读取数据,即通过
mysqli
,然后直接或通过方法返回属性。换句话说,我是否绝对需要另一个位置(实体外部的类/函数/方法)来填充实体

示例实体看起来是这样的

class Pricing
{
    function getSerialization(){}

    /**
     * @var integer @Column(name="id", type="integer", nullable=false)
     *      @Id
     *      @GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    //etc, a typical Doctrine Entity
}

是的,实体类的实例可以读取自身。
但我想你的问题应该是:“一个条令实体能加载并读取它自己吗?”。答案是否定的

实体的加载由条令内部管理。如果您希望实体类自行加载,则意味着将
EntityManager
注入实体类

这是个坏主意,我@BryanM。他在另一个堆栈上的回答很好地涵盖了这一点:

允许实体对象依赖实体管理器不是一个好主意。它将实体绑定到持久层,这是Doctrine 2特别试图解决的问题。依赖实体管理器的最大麻烦是,它使您的模型很难在远离数据库的情况下单独测试

您可能应该依赖服务对象来处理依赖实体管理器的操作

这意味着您需要注意从外部加载实体。我仍然没有看到
getSerialization
的问题。它可以在实体类内部,并且可以在加载实体后使用,对吗

如果您想立即进行加载和序列化,我建议创建一个
PricingService
,在其中插入存储库或实体管理器,并在其中定义一个实现所有这些功能的公共方法。例如:

<?php

use Application\Entity\Pricing;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;

class PricingService
{
    /**
     * @var EntityManager
     */
    protected $entityManager;

    /**
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    
    /**
     * @return EntityRepository;
     */
    protected function getRepository()
    {
        return $this->entityManager->getRepository(`Application\Entity\Pricing`);
    }

    /**
     * @param $params
     * @return array 
     */
    public function findSerializedBy($params)
    {
        $pricing = $this->getRepository()->findOneBy($params);
        return $pricing->getSerialization();
    }
}

当然,您可以通过添加另一个带有
$classname

否的参数来概括您的服务。条令实体只是普通对象,不能从数据库加载自身。您可以做的是创建一个方法ProductRepository::getSerializedPricing($productId)。但是坚持你现有的代码可能是最好的。@Dennis创建这样的服务解决了你的问题吗?或者这不是你想要的答案D
$serializedPricing = $pricingService->findSerializedBy(array(
    'active' => true,
    'product_id' => (int) $this->id
));