【问题标题】:symfony2 - DBAL custom "model" layersymfony2 - DBAL 自定义“模型”层
【发布时间】:2014-02-22 12:42:39
【问题描述】:

在编写 symfony2 应用程序的过程中,我需要为所有数据库交互编写自定义模型层,并且我想使用 Doctrine DBAL,而不是完整的 ORM。这是因为我没有设计数据库并且必须使用一组预定义的查询。

我知道我可以从控制器调用 DBAL 连接的服务,例如:

$results = $this->get('my_service')->someMethod();

将服务定义为:

src/Acme/BundleName/Resources/config/services.yml

services:
  my_service:
  class:  Acme\BundleName\Entity\BaseEntity
  arguments:  [@database_connection]

src/Acme/BundleName/Entity/BaseEntity.php

namespace Acme\BundleName\Entity;
use Doctrine\DBAL\Connection;

class BaseEntity
{
  private $connection;

  public function __construct(Connection $dbalConnection)  {
      $this->connection = $dbalConnection;    
 }

 public function someMethod(){
   //method logic
 }

}

现在,如何从我的自定义模型类中调用该服务,以便使用 dbal 连接来执行原始 slq?

我还了解到,我可以将每个类定义为将注入 dbal 连接的服务,但这会导致我有数十个已定义的服务(每个模型类一个)仅用于共享 dbal 连接。

理想情况下,我希望我的类使用自定义逻辑映射数据库表,就像许多其他框架一样。我也知道我可以在 Doctrine orm 中定义自定义“存储库”,但我只需要坚持使用 DBAL 层。

【问题讨论】:

  • 您可以在 Symfony 中使用 DBAL 和 Doctrine 存储库,那么您的问题是什么?
  • 如何从自定义类(我的模型类)获取 DBAL 连接?
  • 你的意思是custom class是一个服务?
  • 我实际上不知道它是否应该是一个服务,我正在寻找一种在我的自定义模型类中拥有 DBAL 连接的方法,我认为将它定义为一个服务很好方法,但我只能从 Controller 类中获取该服务(dbal 连接服务)。
  • 但是您已经使用arguments: [@database_connection] 将 DBAL 注入到服务中。这是您需要的解决方案。所以在这个服务中使用$this->connection

标签: symfony doctrine-orm


【解决方案1】:

所以,我认为您需要创建一个 service,在其中注入 Doctrine DBAL 依赖项,并通过此服务加载和使用您的模型

public function someMethod(){
   //load the model
   $model = new MyModel();
   // Then get data from DB and fetch them to model

   //other method logic
   return $model;
}

【讨论】:

  • 这正是我所做的,我有一个注入 DBAL 的服务。我只是不知道如何与我的模型类交互
  • 检查更新。尝试在我的示例中使用类似的东西。但是,如果您对它的实现没有任何想法或不太了解它必须如何工作,也许您最好先使用 Doctrine?
  • 感谢您的回答。我确实了解服务的运作方式。我不明白如何在不为每个模型声明一项服务的情况下将我的模型类作为服务。如果您注意到,在您的解决方案中,有一个硬编码的类实例化,这是我试图避免的,但在这一点上我认为这是不可能的。
  • 你可以配置composer从目录中动态加载你的模型类,你不需要使用requireinclude
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多