Служба поддержки клиентов и завод по обслуживанию не регистрируются в ZF3

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

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

В анонимной функции, на которую указывает 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;
    }
}

person Bluebaron    schedule 13.02.2017    source источник
comment
ну.. вроде неплохо. я имею в виду код. Вы пытались вызвать класс DbBuilderController через фабрику?   -  person Mehmet SÖĞÜNMEZ    schedule 13.02.2017
comment
Поскольку вы не поделились какими-либо подробностями о самом фабричном классе, я не могу ничего сделать, кроме как спросить: правильно ли указан фабричный класс \Application\Service\Factory\UserServiceFactory::class? Он может быть неправильно назван, не в той папке, на которую вы указываете, или каким-либо другим образом неправильно указан...   -  person Wilt    schedule 13.02.2017
comment
Если бы на него ссылались неправильно, это выдавало бы ошибку. Я даже пытался намеренно ссылаться на него неправильно. Я включу это.   -  person Bluebaron    schedule 13.02.2017
comment
Перезагрузить веб-сервер? Opcache может быть болью.   -  person bishop    schedule 13.02.2017
comment
Используете ли вы кеш настроек модуля?   -  person Mehmet SÖĞÜNMEZ    schedule 14.02.2017
comment
@MehmetSÖĞÜNMEZ Не специально. Я так не думаю. Это машина разработки из Vagrantfile, снабженная каркасным приложением, которое я также использую.   -  person Bluebaron    schedule 14.02.2017
comment
Я перезапустил всю машину, но это есть на github, и у моих товарищей по команде такая же проблема.   -  person Bluebaron    schedule 14.02.2017
comment
Скелетное приложение @Bluebaron по умолчанию использует кеш настроек модуля. Наверно в этом проблема. Он кэширует класс модуля после запуска и больше не читает его. Вы должны очистить папку кеша, чтобы приложение снова прочитало ее. Вы можете установить ключи module_map_cache_enabled и config_cache_enabled в false для неактивного кеша в вашем файле конфигурации.   -  person Mehmet SÖĞÜNMEZ    schedule 14.02.2017
comment
Они оба отключены в режиме разработки по умолчанию. Однако я активировал их в единственном другом месте, которое смог найти, и это все равно не сработало.   -  person Bluebaron    schedule 14.02.2017


Ответы (1)


Глядя на сервис-менеджер ZF3, можно предположить, что он не может загрузить заводской класс, т.е. class_exists('Application\Service\Factory\UserServiceFactory') не работает.

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

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

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

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

person avy    schedule 15.02.2017