2015-11-16 6 views
1

Я создал новый XmlResponseFormatter, и теперь я хочу изменить rootTag.Yii2 отсутствует требуемый параметр в конструкторе

class newXmlResponseFormatter extends XmlResponseFormatter 
{ 
    /** 
    * @var string the name of the root element. 
    * 
    */ 
    public $rootTag; 

    public function __construct($rootTag) {   
     parent::__construct(); 

     $this->rootTag = $rootTag;   
    } 
} 

От контроллера я установил, что значение:

$xmlFormater = new newXmlResponseFormatter('newRootTag'); 

В контроллере, что значение доступно, и устанавливает в $ rootTag но бросали следующее исключение:

исключение 'yii \ base \ InvalidConfigException' с сообщением «Отсутствует обязательный параметр« rootTag »при создании экземпляра« app \ components \ override \ newXmlResponseFormatter ». ' в /var/www/html/Admin/vendor/yiisoft/yii2/di/Container.php:451

Кто-нибудь знает, что может быть проблема? Спасибо заранее!

ответ

1

Первый параметр в XmlResponseFormatter - $config, потому что XmlResponseFormatter расширяет класс Object. Вы - violated liskov substitution principle.

Вы должны переписать конструктор так:

class newXmlResponseFormatter extends XmlResponseFormatter 
{ 
    /** 
    * @var string the name of the root element. 
    * 
    */ 
    public $rootTag; 

    /** 
    * newXmlResponseFormatter constructor. 
    * 
    * @param string $rootTag 
    * @param array $config 
    */ 
    public function __construct($rootTag, $config = []) 
    { 
     $this->rootTag = $rootTag; 

     parent::__construct($config); 
    } 
} 

В yii2 вы должны вызвать родительский конструктор после кода, и вызовите родителей initдо того кода.

$config потребность в простой модели конфигурирования, как это:

new newXmlResponseFormatter(['rootTag' => 'newRootTag']); 
+0

Я сделал это, как вы сказали: 'code' класс newXmlResponseFormatter расширяет XmlResponseFormatter { /** * @var строка на имя корневой элемент. * */ public $ rootTag; public function __construct ($ rootTag, $ config = []) { parent :: init(); $ this-> rootTag = $ rootTag; parent :: __ construct ($ config); } } 'code' Контроллер: ' code' $ xmlFormater = новый newXmlResponseFormatter ('newRootTag', []); 'code' Но я до сих пор та же ошибка, исключение ... – Lackeeee

+0

родитель' init' следует вызывать ** после ** конструктора в отдельной функции 'init'. Удалите его из конструктора, и он будет работать :) –

+0

Тем не менее не работает :( 'code' общественная функция __construct ($ rootTag, $ конфиг = []) { $ this-> rootTag = $ rootTag; родитель :: __ конструкт ($ конфигурации); } общественная функция инициализации() { родитель :: Init(); } 'code' – Lackeeee

Смежные вопросы