2016-06-21 105 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我有很多,所以我觉得它的一部分应该是一个DefaultController,不重复的代码。如果我在我的代码移到DefaultController这样的:

<?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'(可访问父母和孩子)。如果它们被设置为“private”,则只有父类可以访问它们。其次,它看起来(通过我可以看到的错误消息的一部分),你注入错误的参数给构造函数? –

+0

你如何实例化控制器? – topher

+0

......以及@mickadoo在他的回答中说了些什么。您可能需要在服务容器中注册所有控制器(DefaultController的子项,如CategoriesController)。不是父母(DefaultController)。 –

回答

1

我认为问题在于您没有在您的services.yml中将您的控制器注册为服务。如果你不这样做,Symfony将视为一个常规控制器,并尝试使用默认参数实例化它,导致错误消息中出现不匹配。

检查the docs了解如何将控制器定义为服务。

+0

当然我有;) – jhondoe500

+0

然后,我会检查pooler和magnus-eriksson给出的其他好建议。我也可能建议使用TranslatorInterface类型提示而不是具体的类名。 – mickadoo