2017-02-13 3 views
1

Aus irgendeinem Grund glaube ich nicht, dass meine 'service_manager' Konfig richtig gelesen wird. Dies ist meist ein brandneues Skelett-Checkout. Vielleicht ein Tag Arbeit.Kundendienst und Service Fabrik nicht in ZF3 registrieren

Ich habe kürzlich eine andere und versuchte zu vergleichen. Ich kann nicht herausfinden, wo ich falsch gelaufen bin.

Unter der anonymen Funktion, auf die durch Controller\DbBuilderController::class => function(ContainerInterface $container, $requestedName) { die Linie $userService = $container->get(\Application\Service\UserService::class); einen Fehler verursacht: Unable to resolve service "Application\Service\UserService" to a factory; are you certain you provided it during configuration?

ich versucht habe \Application\Service\UserService::class zu kurz, dumm, Literalzeichenfolgen verändert sich so sicher, dass ich bin, dass der Dienst nicht registriert.

Ich bin nicht sicher, warum das passieren würde. Irgendwelche Abnehmer?

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

Die Fabrik:

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

} 

Der 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

gut .. es scheint gut. Ich meine den Code. Haben Sie versucht, die DbBuilderController-Klasse über Factory aufzurufen? –

+0

Da Sie keine Angaben zur Factory-Klasse selbst gemacht haben, kann ich nicht mehr tun, als zu fragen: Wird die Factory-Klasse '\ Application \ Service \ Factory \ UserServiceFactory :: class' korrekt referenziert? Es könnte falsch benannt werden, nicht in dem Ordner, auf den Sie zeigen, oder auf andere Weise falsch referenziert ... – Wilt

+0

Wenn es falsch referenziert wurde, würde es einen Fehler werfen. Ich habe sogar versucht, es absichtlich falsch zu bezeichnen. Ich werde es aufnehmen. – Bluebaron

Antwort

0

am ZF3 Service Manager vermuten lässt er nicht die Factory-Klasse geladen werden kann, das heißt class_exists('Application\Service\Factory\UserServiceFactory') ausfällt.

Sicherstellen, dass der Autoloader für die Application Namespace registriert ist, entweder mit der getAutoloaderConfig Funktion in module.php oder durch Tauchen in die composer.json Zugabe:

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

(offensichtlich mit dem Verzeichnis geändert, wie notwendig), dann führe das Composer Update aus

Vielleicht überprüfen Sie auch die Verzeichnisstruktur mit UserServiceFactory für Tippfehler, wenn Sie die Zend\Loader\StandardAutoloader verwenden.

Verwandte Themen