Проблема с компонентами при расширении пользовательского класса AppController

У меня есть пользовательская структура в моем приложении CakePHP, которая выглядит следующим образом:

class AppController extends Controller // default

class ExtendedAppController extends AppController

class ChildController extends ExtendedAppController

Компоненты, которые я объявляю в ExtendedAppController, стираются, когда я объявляю компоненты в классе ChildController. Я думаю, у меня будет такая же проблема и с помощниками. Как мне объединить массивы, чтобы избежать этого?

1 ответ

Решение

Cake объединяет переменные текущего контроллера только с ОДНИМ родительским классом, который по умолчанию установлен в переменной $_mergeParent = 'AppController'; в ядре Controller учебный класс.

Вы можете переопределить эту переменную в вашем ChildController, определив:

class ChildController extends ExtendedAppController {

    protected $_mergeParent = 'ExtendedAppController';

}

Однако при этом будут игнорироваться все помощники и компоненты, определенные в AppController, поэтому скопируйте компоненты и помощники из вашего AppController в свой ExtendedAppController. Это должно ответить на ваш вопрос, я полагаю, так как вы сможете использовать компоненты ExtendedAppController из вашего ChildController, а другие контроллеры, расширяющие AppController, будут использовать компоненты AppController.

Это способ, которым метод Controller::_mergeControllerVars() записывается в ядре. Именно поэтому в книге говорится:

HtmlHelper, FormHelper и SessionHelper доступны по умолчанию, как и SessionComponent. Но если вы решите определить свой собственный массив $helpers в AppController, обязательно включите HtmlHelper и FormHelper, если вы хотите, чтобы они по-прежнему были доступны по умолчанию в ваших контроллерах.

Другие вопросы по тегам