Symfony实体应具有的实用程序功能

时间:2017-06-19 02:50:14

标签: php symfony orm

我不知道也许是我或者可能是symfony是蹩脚的,请问为什么symfony实体类没有这样的实用功能:

//Assume product is an entity class
$product = Product::findById($id);
$productExample = new Product(array("price"=>20, "vendor"=>'friends'));
$products = Product::findByExample($productExample);

$Dql = "SELECT * FROM product p WHERE p.id IN (SELECT si.pid FROM solditem si WHERE si.sold_date BETWEEN 1-1-2017 AND 2-2-2017 ORDER BY si.price)";
$products = Product::findByDql($Dql) or Product::findBySql($sql);

$product = new Product(array('id' => $id)); // I should be able to get the entity with that Id

在像Zend这样的其他框架中(即使是像CakePHP,codeIgniter这样的小而简单的框架),很容易实现这些函数,它们可以在任何地方调用,你不必在一个entityManagers或entityCEO之后运行。

有没有一种简单的方法可以实现在symfony中实现这些方法,如果有,请告诉我,如果没有,请告诉我原因。

由于

1 个答案:

答案 0 :(得分:4)

总的来说,我建议你多阅读一下你要比较的框架的文档。

  

我不知道也许是我或者可能是symfony是蹩脚的,请问为什么symfony实体类没有像这样的实用功能

老实说,在这种情况下,它是你;-) ...没有冒犯,但系统正在实施不同的存储层。其他框架如CodeIgniter,CakePHP和Laravel正在实现Active Record Pattern。后者例如提供Eloquent ORM

  

Laravel附带的Eloquent ORM提供了一个漂亮,简单的ActiveRecord实现,用于处理数据库。每个数据库表都有一个相应的“模型”,用于与该表进行交互。

另一方面,Symfony使用Doctrine 2 ORM作为存储层:

  

正如ORM所暗示的那样,Doctrine 2旨在简化数据库行与PHP对象模型之间的转换。因此,Doctrine的主要用例是使用面向对象编程范例的应用程序。对于主要不使用对象的应用程序,Doctrine 2不太适合。

您可以自己决定自己喜欢哪一个,但在这些框架中交换存储层并不是一件容易的事。如果你搜索它,我想你会找到一些discussions around this topic

在Symfony中Entity Repositories通常是place,您可以在其中定义所需的功能:

  

当您查询特定类型的对象时,您始终使用的是什么   被称为“存储库”。您可以将存储库视为PHP   class,其唯一的工作是帮助您获取某个类的实体。

the official documentation之后创建自定义存储库类,或者更进一步,设置自己的存储库类,而不使用Doctrines EntityRepository作为described in this highly recommended article

没有人阻止您向其添加静态功能,但推荐的方法是从您的存储库中提供服务,例如。

<强>存储库

// src/AppBundle/Product/DoctrineBasedProductRepository.php
namespace AppBundle\Product;

use Doctrine\ORM\EntityManager;

class DoctrineBasedProductRepository implements ProductRepository
{
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function all()
    {
        // Create a basic DQL query to fetch all entities
        return $this->entityManager->createQuery('SELECT p FROM '.Product::class.' p')
            ->getResult();
    }

   ...
}

服务定义

# app/config/services.yml
services:
    app.product_repository:
        class: AppBundle\Product\DoctrineBasedProductRepository
        arguments: ['@doctrine.orm.entity_manager']

现在您可以使用存储库,例如在你的控制器中:

public function listAction()
{
    $products = $this->get'app.product_repository')->all();


    // ... do something, like pass the $products object into a template
}