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);
	}
}
?>
  1. <?php
  2. class CheckComponent extends Object {
  3. //llamado antse de Controller::beforeFilter()
  4. function initialize(&$controller) {
  5. // salvando la referencia al controlador para uso posterior
  6. $this->controller =& $controller;
  7. }
  8. //llamado tras Controller::beforeFilter()
  9. function startup(&$controller) {
  10. }
  11. function redirectSomewhere($value) {
  12. // ulizando un método de controlador
  13. $this->controller->redirect($value);
  14. }
  15. }
  16. ?>

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);
	}

}
?>
  1. <?php
  2. class MyComponent extends Object {
  3. // Este componente usa otros componentes
  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. ?>

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;
	}
}
?>
  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. ?>