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;
}
}
bien .. il semble bon. Je veux dire le code. Avez-vous essayé d'appeler la classe DbBuilderController en usine? –
É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
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