Свежайшие Пирожки от CakePHP по-русски

Полнейшее руководство CakePHP 1.2 на русском языке, горячие новости и полезные статьи

MVC доступ к классам

Чтобы получить доступ к контроллеру из которого используется компонент, вам нужно описать метод initialize() или startup(). Эти особые методы автоматически вызываются при создании компонента и первым параметром принимают указатель на контроллер. Метод initialize вызывается перед методом контроллера beforeFilter() , метод startup() вызывается после метода контроллера beforeFilter(). Если вы по какой-то причине не хотите чтобы вызывался метод startup() при создании компонента контроллером, установите параметр $disableStartup в true.

Если вы хотите вставить некую логику перед вызовом метода beforeFilter() контроллера, вам будет необходимо использовать метод initialize() компонента.

Простой текст
  1. <?php
  2. class CheckComponent extends Object {
  3. //вызывается перед Controller::beforeFilter()
  4. function initialize(&$controller) {
  5. // сохраняем указатель на контроллер для дальнейшего использования
  6. $this->controller =& $controller;
  7. }
  8. //вызывается после Controller::beforeFilter()
  9. function startup(&$controller) {
  10. }
  11. function redirectSomewhere($value) {
  12. // использование метода контроллера
  13. $this->controller->redirect($value);
  14. }
  15. }
  16. ?>

Вы также имеете возможность использовать другие компоненты, внутри своего. Для это вам всего лишь необходимо создать переменную класса $components - массив с перечнем используемых компонентов.

Автоматически у подконтроллеров будет вызываться лишь метод initialize.

Простой текст
  1. <?php
  2. class MyComponent extends Object {
  3. // Этот компонент использует другие конпонеты
  4. var $components = array('Session', 'Math');
  5. function doStuff() {
  6. $result = $this->Math->doComplexOperation(1, 2);
  7. $this->Session->write('stuff', $result);
  8. }
  9. }
  10. ?>

Использовать модели в компонентах вообще-то не рекомедуется, но если очень надо, то это делается так:

Простой текст
  1. <?php
  2. class MathComponent extends Object {
  3. function doComplexOperation($amount1, $amount2) {
  4. return $amount1 + $amount2;
  5. }
  6. function doUberComplexOperation ($amount1, $amount2) {
  7. $userInstance = ClassRegistry::init('User');
  8. $totalUsers = $userInstance->find('count');
  9. return ($amount1 + $amount2) / $totalUsers;
  10. }
  11. }
  12. ?>