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

あなたが説明したことから、グローバル定数を使用する代わりに receive を使用するサービスを作成することをお勧めしHOSTますUSERPASSWORDつまり、その情報を parameters.yml に保存し、バンドルの service.yml にこれらのパラメーターを使用してサービスを作成し、最後に基本的にodbc呼び出しをラップするサービスクラスを作成します。

このようにして、symfony のドキュメントで提案されているように parameters.yml を追跡していないと仮定して、機密データ (ユーザー、パスワード) を git-repo から遠ざけることができ、サービスにアクセスできる場所ならどこからでも簡単にサービスにアクセスできます。このようなコンテナ:

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

parameters.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 に答える