2016-06-21 15 views
0

ich zum Beispiel CategoriesController.php wie diese haben untererweitert __construct nicht funktioniert

class CategoriesController 
{ 
/** 
* Translator object. 
* 
* @var Translator $translator 
*/ 
private $translator; 

/** 
* Template engine. 
* 
* @var EngineInterface $templating 
*/ 
private $templating; 

/** 
* Session object. 
* 
* @var Session $session 
*/ 
private $session; 

/** 
* Routing object. 
* 
* @var RouterInterface $router 
*/ 
private $router; 

/** 
* Model object. 
* 
* @var ObjectRepository $model 
*/ 
private $model; 

/** 
* Form factory. 
* 
* @var FormFactory $formFactory 
*/ 
private $formFactory; 

/** 
* CategoriesController constructor. 
* 
* @param Translator $translator Translator 
* @param EngineInterface $templating Templating engine 
* @param Session $session Session 
* @param RouterInterface $router 
* @param ObjectRepository $model Model object 
* @param FormFactory $formFactory Form factory 
*/ 
public function __construct(
    Translator $translator, 
    EngineInterface $templating, 
    Session $session, 
    RouterInterface $router, 
    ObjectRepository $model, 
    FormFactory $formFactory 
) { 
    $this->translator = $translator; 
    $this->templating = $templating; 
    $this->session = $session; 
    $this->router = $router; 
    $this->model = $model; 
    $this->formFactory = $formFactory; 
} 

/** 
* Index action. 
* 
* @return Response A Response instance 
*/ 
public function indexAction() 
{ 
    $categories = $this->model->findAll(); 
    return $this->templating->renderResponse(
     'AppBundle:Categories:index.html.twig', 
     array('categories' => $categories) 
    ); 
} 

Klassen wie CategoriesControllel ich viel, so dass ich denke, ein Teil davon in einem default sein sollte, auf keinen Code zu kopieren. Und wenn ich meinen Code default wie folgt bewegen:

<?php 
/** 
* Default controller class. 
*/ 

namespace AppBundle\Controller; 

/** 
* Class DefaultController. 
*/ 
class DefaultController 
{ 
/** 
* Translator object. 
* 
* @var Translator $translator 
*/ 
private $translator; 

/** 
* Template engine. 
* 
* @var EngineInterface $templating 
*/ 
private $templating; 

/** 
* Session object. 
* 
* @var Session $session 
*/ 
private $session; 

/** 
* Routing object. 
* 
* @var RouterInterface $router 
*/ 
private $router; 

/** 
* Model object. 
* 
* @var ObjectRepository $model 
*/ 
private $model; 

/** 
* Form factory. 
* 
* @var FormFactory $formFactory 
*/ 
private $formFactory; 

/** 
* CategoriesController constructor. 
* 
* @param Translator $translator Translator 
* @param EngineInterface $templating Templating engine 
* @param Session $session Session 
* @param RouterInterface $router 
* @param ObjectRepository $model Model object 
* @param FormFactory $formFactory Form factory 
*/ 
public function __construct(
    Translator $translator, 
    EngineInterface $templating, 
    Session $session, 
    RouterInterface $router, 
    ObjectRepository $model, 
    FormFactory $formFactory 
) { 
    $this->translator = $translator; 
    $this->templating = $templating; 
    $this->session = $session; 
    $this->router = $router; 
    $this->model = $model; 
    $this->formFactory = $formFactory; 
} 
} 

und in CategoriesController:

<?php 
/** 
* Categories controller class. 
*/ 

namespace AppBundle\Controller; 

class CategoriesController extends DefaultController 
{ 

/** 
* Index action. 
* 
* @return Response A Response instance 
*/ 
public function indexAction() 
{ 
    $categories = $this->model->findAllWithAds(); 
    if (!$categories) { 
     throw new NotFoundHttpException(
      $this->translator->trans('categories.messages.categories_not_found') 
     ); 
    } 
    return $this->templating->renderResponse(
     'AppBundle:Categories:index.html.twig', 
     array('categories' => $categories) 
    ); 
} 

Nachdem es meine Anwendung ist gebrochen.

Wenn ich leerer Konstruktor in CategoriesController lasse, fand es keine Dienste in Form von privaten Variablen. Wie kann ich es beheben?

+1

Zunächst einmal, wenn die Kindklasse Zugriff auf die Eigenschaften in der Elternklasse benötigt (wie '$ this-> model' und' $ this-> translator'), müssen sie als 'protected' gesetzt werden (zugänglich für der Elternteil und seine Kinder). Wenn sie als "privat" festgelegt sind, kann nur die Elternklasse auf sie zugreifen. Zweitens sieht es (durch den Teil der Fehlermeldung, die ich sehen kann) aus, dass Sie dem Konstruktor den falschen Parameter hinzufügen. –

+0

Wie Instanziieren Sie den Controller? – topher

+0

... und was @mickadoo sagte in seiner Antwort. Wahrscheinlich müssen Sie alle Controller (untergeordnete Elemente von DefaultController, wie CategoriesController) in Ihrem Servicebehälter registrieren. Nicht das übergeordnete Element (DefaultController). –

Antwort

1

Ich denke, das Problem ist, dass Sie Ihren Controller nicht als Service in Ihrem services.yml registriert haben. Wenn Sie das nicht machen, wird Symfony behandelt wie ein regulärer Controller und versucht es mit den Standardargumenten zu instanziieren, was zu der Diskrepanz führt, die Sie in der Fehlermeldung gesehen haben.

Überprüfen Sie the docs für wie Sie Ihren Controller als Service definieren.

+0

Natürlich habe ich;) – jhondoe500

+0

Dann würde ich die anderen guten Vorschläge überprüfen, die pooler und magnus-eriksson gaben. Ich könnte auch Typhinweis mit TranslatorInterface anstelle eines konkreten Klassennamens vorschlagen. – mickadoo

Verwandte Themen