2017-02-13 18 views
1

По какой-то причине я не думаю, что моя конфигурация 'service_manager' читается правильно. Это, в основном, почти совершенно новый скелетный чек. Может быть, работа в течение нескольких дней.Завод по обслуживанию и обслуживанию клиентов, не зарегистрировавшийся в ZF3

Недавно я сделал еще один и попытался сравнить. Я не могу понять, где я ошибся.

Под анонимной функции, на которую указывает Controller\DbBuilderController::class => function(ContainerInterface $container, $requestedName) { линию $userService = $container->get(\Application\Service\UserService::class); вызывает ошибку: Unable to resolve service "Application\Service\UserService" to a factory; are you certain you provided it during configuration?

Я попытался изменить \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') не удается.

Убедитесь, что автозагрузчик зарегистрирован для Application пространства имен, либо используя getAutoloaderConfig функцию в module.php или путем добавления в composer.json:

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

(очевидно, с каталогом изменен в случае необходимости), а затем запустите обновление композитора.

Возможно, также проверьте структуру каталогов, содержащую UserServiceFactory для опечаток, если вы используете Zend\Loader\StandardAutoloader.