2017-11-10 2 views
0

In meinem Bündel Ich brauche meine Lehre Manager-Klasse initialisiert werden (als Dienst und mit ManagerRegistry) in Konstruktor-Controller, aber symfony wirft immer noch diese Ausnahme:Lehre Managerklasse Injektion Controller funktioniert nicht

Type error: Too few arguments to function AdminBundle\Controller\RegistraceController::__construct(), 0 passed in C:\apache\htdocs\mujProjekt\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Controller\ControllerResolver.php on line 198 and exactly 1 expected

Controller:

namespace AdminBundle\Controller; 

use AdminBundle\Manager\AdminManager; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

/** 
* Class DefaultController 
* @package AdminBundle\Controller 
* @Route("/registrace") 
*/ 
class RegistraceController extends Controller 
{ 
    /** 
    * @var AdminManager 
    */ 
    private $manager; 

    public function __construct(AdminManager $manager) 
    { 
     $this->manager = $manager; 
    } 

    ... 

Adminmanager:

namespace AdminBundle\Manager; 

use AdminBundle\Entity\Uzivatel; 
use Doctrine\Common\Persistence\ManagerRegistry; 

class AdminManager 
{ 
    private $em; 

    public function __construct(ManagerRegistry $Doctrine) 
    { 
     $this->em = $Doctrine->getManager('default'); 
    } 

... 

AdminBundle \ Resour ces \ config \ services.yml:

services: 
# admin.example: 
#  class: AdminBundle\Example 
#  arguments: ["@service_id", "plain_value", "%parameter%"] 
    admin.admin_manager: 
     class: AdminBundle\Manager\AdminManager 
     arguments: 
      ["@doctrine"] 

Ich habe versucht, den Cache zu löschen, aber keinen Erfolg. Die services.yml von AdminBundle ist korrekt in config.yml enthalten.

orm config in config.yml:

orm: 
    auto_generate_proxy_classes: '%kernel.debug%' 
    default_entity_manager: default 
    entity_managers: 
     default: 
      connection: default 
      mappings: 
       AdminBundle: ~ 

Ich bin mit Symfony 3.3 und PHP 7.1.

+0

Da Sie mit S3.3 sind + Sie vielleicht einen Blick nehmen, um Ihre Admin Service direkt in die Aktion zu injizieren: http://symfony.com/doc/current/controller.html#controller-accessing-services Das ist alles neue Sachen, also wenn Sie älteren Tutorials folgen, dann wird es leicht sein, verwirrt zu werden. – Cerad

+0

Danke Cerad für deinen Tipp! Es ist eine nützliche Funktion und funktioniert jetzt gut in meinem Controller. – AtT0mX

Antwort

0

So denke ich Ihren Service yml Bedarf so aussehen zu:

services: 
    admin.admin_manager: 
     class: AdminBundle\Manager\AdminManager 
     arguments: ["@doctrine"] 
    admin.admin_controller: 
     class: AdminBundle\Controller\RegistraceController 
     arguments: ["@admin.admin_manager"] 

up Schau mal hier Symfony Service Container

Hoffe, es hilft!

Grüße :)

1

, wenn Sie Ihre Adminmanager in Ihrem RegistraceController zu injizieren, haben Sie die RegistraceController als Dienst zu definieren. Schauen Sie sich https://symfony.com/doc/current/controller/service.html an. Es gibt einige Nachteile dieses Ansatzes, da Sie nicht von Symfonys Basiscontroller erben. Also müssen Sie den Router und die Template Engine ebenfalls einspeisen, wenn Sie sie brauchen. Aber ich mag es, meinen Controller als Dienste zu definieren. Es ist viel sauberer, wenn Sie Abhängigkeiten sehen.

Statt dessen können Sie den Symfony Container in Ihrem Controller als Inversion des Controll Containers verwenden und Ihren Service mit $ this-> get ('admin.admin_manager') erhalten; von innerhalb Ihrer Aktion.

+0

Sie können ihre Aufmerksamkeit auf das Serviceargument in der annotierten Routendefinition richten: @Route (service = "admin.admin_manager"), das benötigt wird, um dem Routingsystem mitzuteilen, dass es den Controller aus dem Container holen soll. – Cerad

+0

Sie haben sich bei der @Route-Definition vertippt. Es sollte @Route sein (service = "name_of_controller_service") und nicht der Servicename des Dienstes, den er tatsächlich in den Controller injizieren würde. Abgesehen davon hast du absolut recht. – marein

0

Vielen Dank für Ihre Antworten. Glücklicherweise habe ich mein Problem gelöst, indem ich das zu den Diensten in app/config/services.yml hinzugefügt habe.

AdminBundle\Controller\: 
    resource: '%kernel.project_dir%/src/AdminBundle/Controller' 
    public: true 
    tags: ['controller.service_arguments'] 
Verwandte Themen