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,
],