2

例えば見出されたIは、コントローラクラスをUserController循環依存はZend Frameworkの2、</p> <p>で `UserService`

  • UserControllerを有するUserService
  • UserServiceに依存するUserChangedListener
  • に依存しています
  • UserChangedListenerは、SomeOtherClass
  • SomeOtherClassUserControllerSomeOtherClassUserServiceに依存しているので、ここでUserService

に依存しています。

私は取得していますエラー:

LazyServiceLoaderため

循環依存関係は、インスタンス UserService

上記のエラーが見つかりました

(すなわちLazyServiceLoader用循環依存)私は UserChangedListener

SomeOtherClassを注射した場合に発生

と私は持っています

"zendframework/zend-servicemanager": "^ 2.7.5 ||^3.0.3" 、

UserControllerFactory.php

class UserControllerFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $container = $container->getServiceLocator(); 

     return new UserController(
      $container->get(UserService::class) 
     ); 
    } 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     return $this($serviceLocator, UserController::class); 
    } 

} 

UserServiceFactory.php

class UserServiceFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $service = new UserService(
      $container->get(UserRepository::class) 
     ); 

     $eventManager = $service->getEventManager(); 
     $eventManager->attach($container->get(UserChangedListener::class)); 

     return $service; 
    } 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     return $this($serviceLocator, UserService::class); 
    } 
} 

UserChangedListenerFactory.php

あなたは UserServiceと合法的な循環依存関係を持っているように10

SomeOtherClassFactory.php

class SomeOtherClassFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $rootLocator = $serviceLocator->getServiceLocator(); 

     return new SomeOtherClass(
      $rootLocator->get(UserService::class) 
     ); 
    } 
} 

答えて

0

が見えます。エラーメッセージはUserServiceなしでUserServiceを作成できないことを示しています。

これは、実際には、__constructメソッドによる依存性注入を使用することの良い習慣によって導入された問題です。これにより、ZF2は複雑なネストされたリレーションシップを持つ関連する 'サービス'が多数ある場合、循環依存性を持つようにバインドされたときに、非常に大きなオブジェクトグラフをメモリにロードします。eager

ZF2は、特定のオブジェクトのインスタンス化を遅らせるためのソリューションとしてLazy Servicesを提供しています。これは、開発者がどのようなものを決定する必要があるか(UserChangedListenerです)。代わりにあなたのコードを更新する

、あなたはUserServiceFactoryの外とModule::onBootstrap()方法にリスナーコードの登録を移動することができます。

これは、「集約」リスナーを使用している場合に必要です。単純なイベントリスナーの場合は、上記の例でUserServiceをロードするオーバーヘッドを防ぐことができるSharedEventManagerを使用することもできます。

0
  • UserService UserChangedListener
  • SomeOtherClassを通じてSomeOtherClassに依存しているので、基本的に創造UserServiceのためにあなたが最初SomeOtherClassインスタンスを作成する必要がありますが、それを作成するためにあなたがするUserServiceインスタンスが必要UserService

に依存していますすでに作成されています。

あなたのアーキテクチャはわかりませんが、クラス名によると、UserChangedListenerUserServiceに添付すると間違っています。 おそらくUserServiceはイベントを発生させるだけで、このイベントのリスナーについては何も知ってはいけません。しかし、もう一度 - ちょうどアイデア、そして良い答えのためには、この依存関係をもっと説明する必要があります。