2

Zend Framework は初めてです。アクティブなコントローラーから別のモジュールにあるモデル クラス テーブルにアクセスする方法はありますか? ZF3 の bye bye サービス ロケーターとして、他のモジュールにあるモデル クラス テーブルにアクセスできません。

以前は ZF2 コントローラーで

private configTable;

public function getConfigTable()
{
    if (!$this->configTable) {
        $sm = $this->getServiceLocator();
        $this->configTable = $sm->get('Config\Model\ConfigTable'); // <-- HERE!
    }
    return $this->configTable;
}

public function indexAction(){
     $allConfig = $this->getConfigTable()->getAllConfiguration();
    ......

}

サービスロケーターとして、コントローラーから別のモジュールにあるモデルクラスに関数を呼び出すのに十分でした。サービスロケーターなしでZF3で同様のことを達成する方法はありますか?

よろしくお願いします。さよなら!

4

1 に答える 1

7

ZF3のさようならサービスロケーター

サービスロケータは ZF3 から削除されていません。ただし、フレームワークの新しいバージョンでは、コントローラー/サービスにサービス マネージャーを挿入したり、サービス マネージャーに依存したりした場合に、既存のコードが壊れるいくつかの変更が導入されています。ServiceLocatorAwareInterface

ZF2では、デフォルトのアクションコントローラーはこのインターフェースを実装し、開発者は例のようにコントローラー内からサービスマネージャーを取得できました。変更の詳細については、移行ガイドをご覧ください。

これに対する推奨される解決策は、サービス ファクトリ内のコントローラーのすべての依存関係を解決し、それらをコンストラクターに注入することです。

まず、コントローラーを更新します。

namespace Foo\Controller;

use Config\Model\ConfigTable; // assuming this is an actual class name

class FooController extends AbstractActionController
{
    private $configTable;

    public function __construct(ConfigTable $configTable)
    {
        $this->configTable = $configTable;
    }

    public function indexAction()
    {
        $config = $this->configTable->getAllConfiguration();
    }

    // ...
}

次に、構成テーブルの依存関係をコントローラーに注入する新しいサービス ファクトリーを作成します (新しい ZF3 ファクトリー インターフェイスを使用) 。

namespace Foo\Controller;

use Foo\Controller\FooController;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\FactoryInterface;

class FooControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $configTable = $container->get('Config\Model\ConfigTable');

        return new FooController($configTable);
    }
}

次に、新しいファクトリを使用するように構成を更新します。

use Foo\Controller\FooControllerFactory;

'factories' => [
    'Foo\\Controller\\Foo' => FooControllerFactory::class,
],
于 2016-08-01T15:57:59.607 に答える