DB.

Symfony2でのDB接続方法.

PDOでのデータベース接続

Symfony2ではDoctrineと呼ばれるライブラリが利用可能.

ただし大変メモリを食うらしいので、今回はPDOでの接続を紹介.

前提条件として適当なデータベースとユーザーを用意.

本稿ではtnsnames.oraで以下のように定義.

ユーザー名:user、パスワード:pass

new_verify =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xxx.yyy)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = srsdev)
    )
  )      

データベース定義情報の設定

Symfony2ディレクトリのapp/config配下にparameters.ymlがある.

ymlファイルにドライバ、データベース名、ユーザー、パスワードを設定.

parameters:
    database_driver: oci8
    database_host: 
    database_port:
    database_name: new_verify
    database_user: user
    database_password: pass

tnsnames.oraの定義名とymlのデータベース名を一致させる必要がある.

今回の場合はnew_verify。tnsnames.oraを使わない場合、database_hostの設定が必要.

DB接続コネクションロジック実装

Symfony2ディレクトリのsrc配下にデータベース接続バンドル作成.

namespace DataBaseBundle\Repository;

use Symfony\Component\DependencyInjection\ContainerInterface;
use PDO;

class DataBaseRepository
{

    protected $_container;

    /**
     * @var \Doctrine\DBAL\Connection
     */
    protected $_conn = null;

    /**
     * コンストラクタ
     */
    function __construct(ContainerInterface $container)
    {
        $this->_container = $container;
    }

    /**
     * Setter
     */
    public function setConnection($conn)
    {
        $this->_conn = $conn;

        return $this;
    }

    /**
     * Getter
     */
    protected function getConnection()
    {
        if (is_null($this->_conn)) {
            $this->_conn = $this->_container->get('database_connection');
        }

        return $this->_conn;
    }

}

コンテナからdatabase_connectionを取得.

簡単なSQL処理実行ロジック実装

DataBaseRepositoryを継承し、SQL実行時はgetConnectionでコネクション取得.

namespace DatabaseBundle\Repository;

use DatabaseBundle\Repository\DataBaseRepository;

class TestDbRepository extends DataBaseRepository
{

    public function update($servicecd)
    {
        $sql = <<<EOF
UPDATE 
    TEST_TABLE
SET
    STATUSCD = 100
WHERE
    SERVICECD = :servicecd
EOF;
        $conn = $this->getConnection();
        return $conn->executeUpdate($sql, array('servicecd' => $servicecd));
    }

}

作成したSQL実行クラスを呼び出すためにymlにも定義.

argumentsを定義し、クラス呼び出し時にコンテナがコンストラクタに渡される設定.

parameters:
    db.repository.test.class: DataBundle\Repository\TestDbRepository

services:
    db.repository.test_repository:
        class: "%db.repository.test.class%"
        arguments: ["@database_connection"]

コントローラ経由で呼び出す

かなり細かいところは省いて説明したがザックリとこんな感じ↓↓↓

//SQL実行クラス呼び出しコントローラ
class CallDbController extends Controller
{
    public function executeAction($serviceCd)
    {
        $db = $this->get('db.repository.test_repository');
        if ($db-> update($serviceCd) === false) {
            //エラー処理
            $conn->rollBack();
            $conn->close();
        }
        //レスポンスを返す処理
    }
}
Fin.