0

只需将我的标准 Symfony2 版本配置为与 odbc 驱动程序一起使用。我需要 Teradata 连接。

我完全不需要任何 ORM 工具,我只会用它来返回 Teradata 存储过程或复杂查询的结果。

目前,它通过以下几个简单的步骤在程序 PHP 代码中工作:

 - $conn   = odbc_connect(HOST, USER, PASSWORD)
 - $stmt   = odbc_prepare($conn, $query)
 - $params = array(1, 2, 3)
 - odbc_execute($stmt, $params)
 - next just fetch results using odbc_fetch_array($stmt)

现在想想如何以及在哪里根据 Sf2 最佳实践在 Symfony2 MVC 堆栈中实现这一点......也许是一个单独的服务?

只会提到新开发人员的易用性是首要任务。

提前感谢您的帮助!

4

1 回答 1

2

根据您的描述,我建议创建一个服务,而不是使用全局常量接收HOSTUSERPASSWORD通过服务容器,即您将该信息存储在您的 parameters.yml 中,在您的 bundle 的 service.yml 中使用这些参数创建一个服务,最后您创建您的服务类,它基本上只是包装您的 odbc 调用。

通过这种方式,您可以将敏感数据(用户、密码)排除在您的 git-repo 之外,假设您没有按照 Symfony 文档中的建议跟踪 parameters.yml,并且您可以从可以访问服务的任何地方轻松访问您的服务像这样的容器:

$this->getContainer()->get('acme_demo.teradata_service')

参数.yml:

parameters:
    teradata_host:     localhost
    teradata_user:     username
    teradata_password: password

Acme\DemoBundle\Resources\config\services.yml:

services:
    acme_demo.teradata_service:
        class: Acme\DemoBundle\Service\TeradataService
        arguments:
            - %teradata_host%
            - %teradata_user%
            - %teradata_password%

Acme\DemoBundle\Service\TeradataService:

class TeradataService
{
    public function __construct($host, $user, $password) 
    ...
}

您甚至可以更进一步,在您的 service.yml 中将 teradata 服务设为私有,然后创建访问您的 TeradataService 的其他服务。通过这种方式,您可以确保 deleopers 不会直接干扰服务,而只能通过 ObjectManagers 干扰。

Acme\DemoBundle\Resources\config\services.yml:

services:
    acme_demo.teradata_service:
        public: false
        class:  Acme\DemoBundle\Service\TeradataService
        arguments:
            - %teradata_host%
            - %teradata_user%
            - %teradata_password%

    acme_demo.another_service:
        class: Acme\DemoBundle\Service\ServiceAccessingTeradata
        arguments:
            - @acme_demo.teradata_service

这样,您的服务就不会直接绑定到您的 teradata 连接,这使得用其他东西替换 Acme\DemoBundle\Service\TeradataService 变得更容易。

于 2013-03-09T15:41:30.393 回答