2017-02-13 10 views
1

어떤 이유로 든 내 'service_manager' 구성이 제대로 읽히지 않았다고 생각합니다. 이것은 거의 새로운 스켈레톤 체크 아웃입니다. 어쩌면 하루 일할 수도 있습니다.고객 서비스 및 서비스 팩토리가 ZF3에 등록되지 않았습니다.

나는 최근에 다른 것을 한 번 비교해 보았습니다. 나는 내가 어디로 잘못 갔는지 알 수 없다. 나는 그래서 서비스가 등록되지 않을 것을 확신 부족, 바보, 리터럴 문자열에 \Application\Service\UserService::class 변경 시도 Unable to resolve service "Application\Service\UserService" to a factory; are you certain you provided it during configuration?

: 익명 함수에서

Controller\DbBuilderController::class => function(ContainerInterface $container, $requestedName) {에 의해 오류가 발생 $userService = $container->get(\Application\Service\UserService::class); 라인을 지적했다.

왜 이런 일이 일어날 지 모르겠습니다. 어떤 사람?

<?php 
namespace Application; 

use Zend\Mvc\Application; 
use Zend\Mvc\Controller\LazyControllerAbstractFactory; 
use Zend\Router\Http\Literal; 
use Zend\Router\Http\Segment; 
use Zend\ServiceManager\Factory\InvokableFactory; 
use Interop\Container\ContainerInterface; 

use Doctrine\ORM\Mapping\Driver\AnnotationDriver; 

return [ 
    'service_manager' => [ 
     'factories' => [ 
      \Application\Service\UserService::class => \Application\Service\Factory\UserServiceFactory::class 
     ], 
    ], 
    'doctrine' => [ 
     'driver' => [ 
      __NAMESPACE__ . '_driver' => [ 
       'class' => AnnotationDriver::class, 
       'cache' => 'array', 
       'paths' => [__DIR__ . '/../src/Entity'] 
      ], 
      'orm_default' => [ 
       'drivers' => [ 
        __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
       ] 
      ] 
     ] 
    ], 

    'router' => [ 
     'routes' => [ 
      'home' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'createUser' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/createuser/:username/:password', 
        'defaults' => [ 
         'controller' => Controller\DbBuilderController::class, 
         'action'  => 'createUser', 
         'username' => '', 
         'password' => '' 
        ], 
       ], 
      ], 
      'importTrades' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/importTrades', 
        'defaults' => [ 
         'controller' => Controller\DbBuilderController::class, 
         'action'  => 'importTrades', 
        ], 
       ], 
      ], 
      'createExchanges' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/createExchanges', 
        'defaults' => [ 
         'controller' => Controller\DbBuilderController::class, 
         'action'  => 'createExchanges', 
        ], 
       ], 
      ], 

     ], 
    ], 
    'controllers' => [ 
     'factories' => [ 
      Controller\IndexController::class => InvokableFactory::class, 
      Controller\DbBuilderController::class => function(ContainerInterface $container, $requestedName) { 
       $entityManager = $container->get('doctrine.entitymanager.orm_default'); 
       $userService = $container->get(\Application\Service\UserService::class); 
       return new Controller\DbBuilderController($entityManager, $userService); 
      }, 
     ], 

    ], 

    'view_manager' => [ 
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'doctype'     => 'HTML5', 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => [ 
      'layout/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
      'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ], 
     'template_path_stack' => [ 
      __DIR__ . '/../view', 
     ], 
    ], 
    'strategies' => array(
     'ViewJsonStrategy', 
    ), 
]; 

공장 :

<?php 

namespace Application\Service\Factory; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class UserServiceFactory implements FactoryInterface { 

    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $entityManager = $container->get('doctrine.entitymanager.orm_default'); 

     $user = new \Application\Service\UserService($entityManager); 
     return $user; 
    } 

} 

본 서비스 :

<?php 

namespace Application\Service; 

class UserService 
{ 
    protected $entityManager; 

    function __construct(\Doctrine\ORM\EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    public function createUser($username, $password) 
    { 
     $user = new \Application\Entity\User(); 
     $user->setUserKey($password); 
     $user->setUserName($username); 
     $user->setIsAdmin(true); 

     $this->entityManager->persist($user); 
     $this->entityManager->flush(); 

     return $user; 
    } 
} 
+0

잘하고있는 것 같습니다. 나는 코드를 의미한다. 공장을 통해 DbBuilderController 클래스를 호출하려고 했습니까? –

+0

팩토리 클래스 자체에 대한 세부 정보를 공유하지 않았으므로 더 이상 할 수 없습니다. 팩토리 클래스 '\ Application \ Service \ Factory \ UserServiceFactory :: class'가 올바르게 참조되어 있습니까? 잘못 가리킨 폴더 나 다른 방법으로 잘못 참조 된 폴더에 잘못 명명 될 수 있습니다 ... – Wilt

+0

잘못 참조 된 경우 오류가 발생합니다. 나는 그것을 잘못 의도적으로 참조하려했습니다. 나는 그것을 포함시킬 것이다. – Bluebaron

답변

0

ZF3 서비스 관리자에서 보면 그것은 즉 class_exists('Application\Service\Factory\UserServiceFactory')가 실패, 팩토리 클래스를로드 할 수 없습니다 제안합니다. 다음

"autoload": { 
    "psr-4": { 
     "Application\\": "module/Application/src/" 
    } 
}, 

(분명히 디렉토리와 필요에 따라 변경) :

자동 로더가 Application 네임 스페이스에 등록, 하나 Module.php에서 getAutoloaderConfig 기능을 사용하거나 composer.json에 추가하여되어 있는지 확인합니다 작곡가 업데이트를 실행하십시오.

Zend\Loader\StandardAutoloader을 사용하는 경우 UserServiceFactory이 포함 된 디렉토리 구조를 확인하십시오.