2017-02-13 3 views
1

Pour une raison quelconque, je ne pense pas que ma configuration 'service_manager' soit lue correctement. C'est la plupart du temps à peu près une caisse squelette tout neuf. Peut-être un jour de travail.Le service client et l'atelier de service ne s'enregistrent pas dans ZF3

J'ai fait un autre récemment et essayé de comparer. Je ne peux pas comprendre où je me suis trompé.

Sous la fonction anonyme pointée par Controller\DbBuilderController::class => function(ContainerInterface $container, $requestedName) { la ligne $userService = $container->get(\Application\Service\UserService::class); provoque une erreur: Unable to resolve service "Application\Service\UserService" to a factory; are you certain you provided it during configuration?

J'ai essayé de changer \Application\Service\UserService::class à court, idiot, chaînes littérales donc je suis confiant que le service ne soit pas en cours d'enregistrement.

Je ne sais pas pourquoi cela se produirait. N'importe quels preneurs?

<?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', 
    ), 
]; 

L'usine:

<?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; 
    } 

} 

Service:

<?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

bien .. il semble bon. Je veux dire le code. Avez-vous essayé d'appeler la classe DbBuilderController en usine? –

+0

Étant donné que vous n'avez pas partagé de détails sur la classe de fabrique elle-même, je ne peux pas demander plus: La classe d'usine '\ Application \ Service \ Factory \ UserServiceFactory :: class' est-elle référencée correctement? Il pourrait être mal nommé, pas dans le dossier que vous pointez ou d'une autre manière référencé incorrectement ... – Wilt

+0

Si elle a été référencé incorrectement, il y aurait une erreur. J'ai même essayé de le référencer à dessein à tort. Je vais l'inclure. – Bluebaron

Répondre

0

regardant le gestionnaire de services de ZF3 suggère qu'il ne peut pas charger la classe d'usine, à savoir class_exists('Application\Service\Factory\UserServiceFactory') est un échec.

Assurez-vous que le chargeur automatique est enregistré pour l'espace de noms Application, soit en utilisant la fonction getAutoloaderConfig en module.php ou en ajoutant dans le composer.json:

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

(évidemment avec le répertoire a changé si nécessaire), puis exécuter la mise à jour du compositeur

Peut-être également vérifier la structure de répertoire contenant UserServiceFactory pour les fautes de frappe si vous utilisez le Zend\Loader\StandardAutoloader.