多くの開発者がZendフレームワーク2の研究を開始し、ほとんどの場合、データベースに永続的なアダプターを使用するという問題に直面しました。 この問題の解決に役立った興味深い記事を共有したいと思います。
問題は、サービスロケーターを介してではなく、TableGatewayインスタンスを直接取得することです。
TableGatewayオブジェクトでは、コンストラクタゲートウェイに渡されるdbAdapterオブジェクトを構成する必要があります。
次の解決策は、この問題の解決に役立ちます。
1. dbAapterの静的ストレージとしてGlobalAdaperFeatureを使用します。
use Zend\Db\TableGateway\Feature; $feature = new Feature\GlobalAdapterFeature();
2.ブートストラップメソッドをモジュール構成ファイルに追加します。
public function onBootstrap($e) { // set static adapter for all module table gateways $serviceManager = $e->getApplication()->getServiceManager(); $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter'); Feature\GlobalAdapterFeature::setStaticAdapter($dbAdapter); }
3.これで、TableGatewayコンストラクターで既にロードされたdbAdapterオブジェクトにアクセスできます。
public function __construct() { $this->featureSet = new Feature\FeatureSet(); $this->featureSet->addFeature(new Feature\GlobalAdapterFeature()); $this->initialize(); }
したがって、コンストラクタのゲートウェイにdbAdapterが埋め込まれています。 もちろん、これはベストプラクティスではありませんが、アプリケーションに柔軟性を追加することができますが、いずれにしても、dbAdapterオブジェクトはサービスロケーターを使用して作成されましたが、ブートモジュールレベルのすべてのtableGatewaysのシングルトンメソッドとして作成されました。