Symfony 2 odbc组件

时间:2013-03-09 13:05:25

标签: php symfony odbc teradata

只需将我的标准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堆栈中如何以及在何处实现它...也许是一个单独的服务?

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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

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

parameters.yml:

parameters:
    teradata_host:     localhost
    teradata_user:     username
    teradata_password: password

的Acme \ DemoBundle \资源\配置\ services.yml:

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

的Acme \ DemoBundle \服务\ TeradataService:

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

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

的Acme \ DemoBundle \资源\配置\ 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。