質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework 2

Zend Framework 2は、PHP 5.3以上に対応している MVCフレームワークとコンポーネントライブラリーの集合です。

Q&A

1回答

2687閲覧

zendFramework3でdbアダプタをグローバルで持ちたい

ms5025

総合スコア292

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Zend Framework 2

Zend Framework 2は、PHP 5.3以上に対応している MVCフレームワークとコンポーネントライブラリーの集合です。

0グッド

0クリップ

投稿2018/09/21 03:14

編集2018/09/21 03:23

言語:PHP
フレームワーク:zendFramework3

前提・実現したいこと

zendFramework3で一般的なMVCアプリケーションの開発をしています。
形としてはzendが推奨するスケルトンプロジェクトと同様のつくりと考えていただいて構わないと思います。

トランザクション処理を行うため、
dbアダプタやコネクションをグローバルで持ちたいでのすが
このやり方がスマートなのかどうかわかりません。

できればfuelPHPのDBクラスのような動きにしたいのですが
もっとこうした方がいいなどのアドバイスやヒントがあれば教えて頂きたいです。

現在割と早い段階で呼ばれているModule.php内で
GlobalAdapterFeatureというクラスにスタティック変数としてデータベース接続アダプターを設定しています。
しかしトランザクション開始の部分が少し冗長だなと感じています。
できればfuelのように
DB::start_transaction();
の一文ですませたいのですが、そのような動きにするには別でDBクラスなどを作らなくてはならないのでしょうか?
もっとこうした方がいいよ、などがありましたらヒントをお願いしたいです。

該当のソースコード

PHP

1class Module { 2 3 public function onBootstrap($e) 4 { 5 $eventManager = $e->getApplication()->getEventManager(); 6 $moduleRouteListener = new ModuleRouteListener(); 7 $moduleRouteListener->attach($eventManager); 8 $this->createDbAdapter($e); 9 } 10 11 protected function createDbAdapter($e) 12 { 13 $config = $e->getApplication()->getConfig(); 14     //global.phpのdb設定でアダプタ作成 15 $adapter = new \Zend\Db\Adapter\Adapter($config['db']); 16 GlobalAdapterFeature::setStaticAdapter($adapter); 17 } 18 public function getConfig() { 19 20 return include __DIR__ . '/../../../config/module.config.php'; 21 } 22 23}

PHP

1 2 use \Zend\Db\TableGateway\Feature\GlobalAdapterFeature as DB; 3 4 try { 5 6 7 $connection = DB::getStaticAdapter()->getDriver()->getConnection(); 8 $connection->beginTransaction(); 9 // トランザクション開始 10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

私の場合は下記の様なクラスを作成しています。
中身の説明は割愛致します。

PHP

1<?php 2namespace Dao; 3 4class StaticAdapter 5{ 6 //静的アダプター 一度取得したアダプターを静的に保持 7 public static $aryAdapter =array(); 8 9 /* 10 * 静的アダプターを取得 11 * 12 * @params String $strDatabaseName データベース名 13 * @return Adapter or NULL 14 */ 15 public static function getAdapter($strDatabaseName = null) 16 { 17 if(isset(self::$aryAdapter[$strDatabaseName])) 18 return self::$aryAdapter[$strDatabaseName]; 19 elseif(isset(self::$aryAdapter['default'])) 20 return self::$aryAdapter['default']; 21 else 22 return self::createAdapter($strDatabaseName); 23 } 24 25 /* 26 * 静的アダプターをセット 27 * 28 * @params String $strDatabaseName データベース名 29 * @return void 30 */ 31 public static function setAdapter($strDatabaseName, \Zend\Db\Adapter\Adapter $adapter) 32 { 33 self::$aryAdapter[$strDatabaseName] = $adapter; 34 } 35 36 /* 37 * アダプターを生成し、取得 38 * 39 * @params String $strDatabaseName データベース名 40 * @return $adapter 41 */ 42 public static function createAdapter($strDatabaseName = null) 43 { 44 //configを取得 45 $config = new \Zend\Config\Config(include './app/config/autoload/global.php'); 46 //アダプターを取得 47 if(is_null($strDatabaseName) && isset($config->toArray()['db']['default']) && $config->toArray()['db']['default'] != "") 48 { 49 //デフォルトのデータベース名が指定されていれば、デフォルトのDBを設定 50 $strDefaultDatabaseName = $config->toArray()['db']['default']; 51 //アダプターを生成 52 $adapter = new \Zend\Db\Adapter\Adapter($config->db->$strDefaultDatabaseName->toArray()); 53 //アダプターを静的に保存 54 self::setAdapter('default', $adapter); 55 self::setAdapter($strDefaultDatabaseName, $adapter); 56 } 57 else if(!is_null($strDatabaseName)) 58 { 59 //データベース名を指定してアダプターを生成 60 $adapter = new \Zend\Db\Adapter\Adapter($config->db->$strDatabaseName->toArray()); 61 //アダプターを静的に保存 62 self::setAdapter($strDatabaseName, $adapter); 63 } 64 else 65 { 66 //アダプターを生成 67 $adapter = new \Zend\Db\Adapter\Adapter($config->db->toArray()); 68 //アダプターを静的に保存 69 self::setAdapter('default', $adapter); 70 } 71 72 return $adapter; 73 } 74}

configの値はこの様になっています。

PHP

1<?php 2return array( 3 'db' => array( 4 'default' => 'master', 5 'master' => array( 6 'driver' => 'Pdo', 7 'dsn' => 'mysql:dbname=hoge;host=localhost', 8 'username' => 'hoge', 9 'password' => 'hoge', 10 'driver_options' => array( 11 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 12 ), 13 ), 14);

使用方法はこの様になります。

PHP

1//アダプターを取得 2$adapter = \Dao\StaticAdapter::getAdapter(); 3$connection = $adapter->getDriver()->getConnection(); 4$connection->beginTransaction(); 5try 6{ 7 //処理... 8 $connection->commit(); 9} 10catch(\Exception $e) 11{ 12 $connection->rollback(); 13}

投稿2018/11/16 07:30

shingoalpha

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問