2017-08-26 3 views
0

J'utilise Symfony DIC, le routage et ControllerResolver dans mon projet suivant Create your own PHP Frameworkautonome Symfony DIC dans mes contrôleurs

Je ne comprends pas comment je peux transférer correctement les services au constructeur de mon contrôleur sans utiliser le composant Config ou définir le conteneur dans le contrôleur? Routage:

$routes->add('mycontroller', new Routing\Route('/', ['_controller' => 'controller.mycontroller::indexAction'])); 

Controller:

class MyController implements ContainerAwareInterface 
    { 
     use ContainerAwareTrait; 

     protected $entityManager; 

     public function __construct(Doctrine $doctrine) 
     { 
      $this->entityManager = $doctrine->entityManager; 
     } 

     public function indexAction() 
     { 
      ... 
     } 
    } 

Container et poignée:

$container = new DependencyInjection\ContainerBuilder(); 
$container->register('context', Routing\RequestContext::class); 
$container->register('matcher', Routing\Matcher\UrlMatcher::class) 
      ->setArguments([$routes, new Reference('context')]); 
$container->register('doctrine', Doctrine::class) 
      ->setArguments($db); 
... 
$container->register('controller.mycontroller',MyController::class) 
      ->setArguments([new Reference('doctrine')]); 

$request = Request::createFromGlobals(); 

/** 
* @var \Symfony\Component\HttpKernel\HttpKernel $kernel 
*/ 
$kernel = $container->get('base'); 
/** 
* @var \Symfony\Component\HttpFoundation\Response $response 
*/ 
$response = $kernel->handle($request); 

$response->send(); 
+0

Typiquement, vous définissez le contrôleur comme un service qui prendrait soin d'injecter ce dont vous avez besoin. À un certain moment pendant le routage, vous retirez le contrôleur du conteneur. – Cerad

+0

@Cerad Je ne comprends pas comment Router devrait comprendre qu'il devrait utiliser un conteneur. Si je définis maintenant le contrôleur en tant que service et transmets le nom de service au routeur, il ne trouve pas la classe et renvoie une erreur. Je regarde le code ControllerResolver et il me semble qu'il n'accède pas aux services. – HouseInTheForest

+0

C'est le travail du framework, c'est-à-dire votre code. Le résolveur de contrôleur lui-même ne sait rien du conteneur. Tout ce que je peux suggérer est d'installer le framework Symfony actuel et de voir comment il le fait. – Cerad

Répondre