Проблема с компонентами при расширении пользовательского класса 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, если вы хотите, чтобы они по-прежнему были доступны по умолчанию в ваших контроллерах.