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;
}
}
gut .. es scheint gut. Ich meine den Code. Haben Sie versucht, die DbBuilderController-Klasse über Factory aufzurufen? –
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
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