2016-06-21 4 views
0

У меня есть, например, CategoriesController.php, как это нижепродлен __construct не работает

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) 
    ); 
} 

классов, как CategoriesControllel у меня много, так что я думаю, что часть его должна находиться в одном контроллере по умолчанию, чтобы не дублировать код. И если я двигаю код контроллера по умолчанию, как это:

<?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; 
} 
} 

И в 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) 
    ); 
} 

После этого мое приложение разбито.

(!) Catchable fatal error: Argument 1 passed to AppBundle\Controller\DefaultController::__construct() must be an instance of AppBundle\Controller\Translator, instance of... 

Когда я оставить пустой конструктор в CategoriesController, он не нашел каких-либо услуг в виде частных переменных. Как я могу это исправить?

+1

Прежде всего, если дочерний класс нуждается в доступе к свойствам родительского класса (например, '$ this-> model' и' $ this-> translator'), их необходимо установить как 'protected' (доступно для родителя и его детей). Если они установлены как «частные», к ним может обращаться только родительский класс. Во-вторых, он выглядит (со стороны сообщения об ошибке, которое я вижу), что вы введете неправильный параметр в конструктор? –

+0

Как вы создаете экземпляр контроллера? – topher

+0

... и что @mickadoo сказал в своем ответе. Вероятно, вам необходимо зарегистрировать все контроллеры (дочерние элементы DefaultController, такие как CategoriesController) в вашем контейнере службы. Не родительский (DefaultController). –

ответ

1

Я думаю, проблема в том, что вы не зарегистрировали свой контроллер как услугу в своем services.yml. Если вы не сделаете этого, то Symfony будет рассматривать как обычный контроллер и попробуйте создать его с аргументами по умолчанию, что приведет к несоответствию, которое вы видели в сообщении об ошибке.

Отметьте the docs, как определить ваш контроллер как услугу.

+0

Конечно, у меня есть;) – jhondoe500

+0

Тогда я бы посмотрел другие хорошие предложения, которые дал пул и магнат-эрикссон. Я мог бы также предложить тип намека с TranslatorInterface вместо конкретного имени класса. – mickadoo