1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
11: * @link http://cakephp.org CakePHP(tm) Project
12: * @package Cake.Controller
13: * @since CakePHP(tm) v 1.2
14: * @license http://www.opensource.org/licenses/mit-license.php MIT License
15: */
16:
17: App::uses('ComponentCollection', 'Controller');
18:
19: /**
20: * Base class for an individual Component. Components provide reusable bits of
21: * controller logic that can be composed into a controller. Components also
22: * provide request life-cycle callbacks for injecting logic at specific points.
23: *
24: * ## Life cycle callbacks
25: *
26: * Components can provide several callbacks that are fired at various stages of the request
27: * cycle. The available callbacks are:
28: *
29: * - `initialize()` - Fired before the controller's beforeFilter method.
30: * - `startup()` - Fired after the controller's beforeFilter method.
31: * - `beforeRender()` - Fired before the view + layout are rendered.
32: * - `shutdown()` - Fired after the action is complete and the view has been rendered
33: * but before Controller::afterFilter().
34: * - `beforeRedirect()` - Fired before a redirect() is done.
35: *
36: * @package Cake.Controller
37: * @link http://book.cakephp.org/2.0/en/controllers/components.html
38: * @see Controller::$components
39: */
40: class Component extends CakeObject {
41:
42: /**
43: * Component collection class used to lazy load components.
44: *
45: * @var ComponentCollection
46: */
47: protected $_Collection;
48:
49: /**
50: * Settings for this Component
51: *
52: * @var array
53: */
54: public $settings = array();
55:
56: /**
57: * Other Components this component uses.
58: *
59: * @var array
60: */
61: public $components = array();
62:
63: /**
64: * A component lookup table used to lazy load component objects.
65: *
66: * @var array
67: */
68: protected $_componentMap = array();
69:
70: /**
71: * Constructor
72: *
73: * @param ComponentCollection $collection A ComponentCollection this component can use to lazy load its components
74: * @param array $settings Array of configuration settings.
75: */
76: public function __construct(ComponentCollection $collection, $settings = array()) {
77: $this->_Collection = $collection;
78: $this->settings = $settings;
79: $this->_set($settings);
80: if (!empty($this->components)) {
81: $this->_componentMap = ComponentCollection::normalizeObjectArray($this->components);
82: }
83: }
84:
85: /**
86: * Magic method for lazy loading $components.
87: *
88: * @param string $name Name of component to get.
89: * @return mixed A Component object or null.
90: */
91: public function __get($name) {
92: if (isset($this->_componentMap[$name]) && !isset($this->{$name})) {
93: $settings = (array)$this->_componentMap[$name]['settings'] + array('enabled' => false);
94: $this->{$name} = $this->_Collection->load($this->_componentMap[$name]['class'], $settings);
95: }
96: if (isset($this->{$name})) {
97: return $this->{$name};
98: }
99: }
100:
101: /**
102: * Called before the Controller::beforeFilter().
103: *
104: * @param Controller $controller Controller with components to initialize
105: * @return void
106: * @link http://book.cakephp.org/2.0/en/controllers/components.html#Component::initialize
107: */
108: public function initialize(Controller $controller) {
109: }
110:
111: /**
112: * Called after the Controller::beforeFilter() and before the controller action
113: *
114: * @param Controller $controller Controller with components to startup
115: * @return void
116: * @link http://book.cakephp.org/2.0/en/controllers/components.html#Component::startup
117: */
118: public function startup(Controller $controller) {
119: }
120:
121: /**
122: * Called before the Controller::beforeRender(), and before
123: * the view class is loaded, and before Controller::render()
124: *
125: * @param Controller $controller Controller with components to beforeRender
126: * @return void
127: * @link http://book.cakephp.org/2.0/en/controllers/components.html#Component::beforeRender
128: */
129: public function beforeRender(Controller $controller) {
130: }
131:
132: /**
133: * Called after Controller::render() and before the output is printed to the browser.
134: *
135: * @param Controller $controller Controller with components to shutdown
136: * @return void
137: * @link http://book.cakephp.org/2.0/en/controllers/components.html#Component::shutdown
138: */
139: public function shutdown(Controller $controller) {
140: }
141:
142: /**
143: * Called before Controller::redirect(). Allows you to replace the URL that will
144: * be redirected to with a new URL. The return of this method can either be an array or a string.
145: *
146: * If the return is an array and contains a 'url' key. You may also supply the following:
147: *
148: * - `status` The status code for the redirect
149: * - `exit` Whether or not the redirect should exit.
150: *
151: * If your response is a string or an array that does not contain a 'url' key it will
152: * be used as the new URL to redirect to.
153: *
154: * @param Controller $controller Controller with components to beforeRedirect
155: * @param string|array $url Either the string or URL array that is being redirected to.
156: * @param int $status The status code of the redirect
157: * @param bool $exit Will the script exit.
158: * @return array|null Either an array or null.
159: * @link http://book.cakephp.org/2.0/en/controllers/components.html#Component::beforeRedirect
160: */
161: public function beforeRedirect(Controller $controller, $url, $status = null, $exit = true) {
162: }
163:
164: }
165: