3.6.2.2 Acceso a clases MVC dentro de componentes
Para acceder a la instancia del controlador desde tu recien creado componente, necesitarás implementar el método initialize() o el startup(). Estos métodos especiales llevan una referencia al controlador como primer parámetro y son llamados automáticamente. El método initialize() es llamado antes del método beforeFilter(), y el método startup() después del método beforeFilter. Si por algún motivo no deseas que el método startup() sea llamado cuando el controlador está inicializando cosas, dale el valor true a la variable $disableStartup.
Si deseas insertar algún código de lógica antes de que el controlador beforeFilter() sea llamado, necesitarás usar el método initialize() del componente.
<?php
class CheckComponent extends Object {
//llamado antse de Controller::beforeFilter()
function initialize(&$controller) {
// salvando la referencia al controlador para uso posterior
$this->controller =& $controller;
}
//llamado tras Controller::beforeFilter()
function startup(&$controller) {
}
function redirectSomewhere($value) {
// ulizando un método de controlador
$this->controller->redirect($value);
}
}
?> <?phpclass CheckComponent extends Object {//llamado antse de Controller::beforeFilter()function initialize(&$controller) {// salvando la referencia al controlador para uso posterior$this->controller =& $controller;}//llamado tras Controller::beforeFilter()function startup(&$controller) {}function redirectSomewhere($value) {// ulizando un método de controlador$this->controller->redirect($value);}}?>
También podrias querer utilizar otros componentes dentro del componente a medida. Para ello, simplemente crea una variable de clase $components (tal como lo harías en un controlador ) como un array que contenga los nombres de los componentes que quieres utilizar.
<?php
class MyComponent extends Object {
// Este componente usa otros componentes
var $components = array('Session', 'Math');
function doStuff() {
$result = $this->Math->doComplexOperation(1, 2);
$this->Session->write('stuff', $result);
}
}
?> <?phpclass MyComponent extends Object {// Este componente usa otros componentesvar $components = array('Session', 'Math');function doStuff() {$result = $this->Math->doComplexOperation(1, 2);$this->Session->write('stuff', $result);}}?>
No es muy recomendable acceder o usar un modelo en un componente, pero si tras sopesar las posibilidades eso es lo que quieres hacer, tendrás que instanciar tu clase modelo y usarla manualmente. Aquí tienes un ejemplo:
<?php
class MathComponent extends Object {
function doComplexOperation($amount1, $amount2) {
return $amount1 + $amount2;
}
function doUberComplexOperation ($amount1, $amount2) {
$userInstance = ClassRegistry::init('User');
$totalUsers = $userInstance->find('count');
return ($amount1 + $amount2) / $totalUsers;
}
}
?> <?phpclass MathComponent extends Object {function doComplexOperation($amount1, $amount2) {return $amount1 + $amount2;}function doUberComplexOperation ($amount1, $amount2) {$userInstance = ClassRegistry::init('User');$totalUsers = $userInstance->find('count');return ($amount1 + $amount2) / $totalUsers;}}?>
