0

我试图在我的代码中更好地实现 OOP 和依赖注入,并遇到以下问题。

我为涉及雇主和公司的客户提供服务(使用相应的模型、映射器和数据库表):

class Service
{
    protected $clientId;
    protected $client;
    protected $employerId;
    protected $employer;
    protected $companyId;
    protected $company;

    public function setClient(Client $client)
    {
       $this->client = $client;       
    }

    public function setEmployer(Employer $client)
    {
        $this->employer = $employer;
    }

    public function setCompany(Company $company)
    {
        $this->company = $company;
    }

    // more
}

为了获得一个 Service 对象,我首先实例化 Service 对象,该对象从数据库中返回一个 clientId。使用 clientId 实例化一个 Client 对象(并将其附加到服务),这涉及再次访问数据库。雇主和公司也一样。

我可以通过连接从数据库中一次性检索服务、客户、雇主和公司,但这会使我的映射器更加复杂。例如,客户、雇主和公司都有地址,所以我需要为这些列加上别名并将它们映射到各自的模型。这比单独从每个表中检索所有列并将它们单独映射到每个模型(例如,使用一些逻辑将带下划线的列转换为 ZF camelCase)、重用我的客户、雇主和公司映射器更不干净。

是否有最佳实践解决方案,还是取决于个人喜好和情况(性能与可维护性)?

4

1 回答 1

1

首先,有一篇关于 PHP 依赖注入的好文章,我认为值得一试。其次,您的问题并不是关于依赖注入的问题,因为您的主要问题都是关于您应该查询数据库的次数。

如果您将对象注入到 Service 中,那么一次调用它们或一个接一个调用它们并不重要。真正的问题只是“我能负担得起多次访问数据库”。依赖注入的最大优点是您可以轻松更改所提供对象的来源(因此,如果您有数据库帮助程序类或类似的东西,依赖注入非常适合内部可更改的数据库对象)。

你只需要问自己这里的常规 MySQL 问题即可收集这些信息(性能与可维护性)。实际上,如果您有一个关系表,那么重点是能够使用连接查询它,并映射出这些表。

您可以查看其他 ORM 如何从数据库中补充其对象,但您是最了解您的应用程序的人。可维护性在这里应该是一个很大的问题,因为你已经很好地抽象了一些东西。

如果您的 DB 发生变化,您只需要更改映射对象,并且如果您的业务逻辑发生变化,则无需触及 DBAL。

于 2012-12-27T16:51:12.250 回答