* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfComponent. * * @package symfony * @subpackage action * @author Fabien Potencier * @version SVN: $Id: sfComponent.class.php 23922 2009-11-14 14:58:38Z fabien $ */ abstract class sfComponent { protected $moduleName = '', $actionName = '', $context = null, $dispatcher = null, $request = null, $response = null, $varHolder = null, $requestParameterHolder = null; /** * Class constructor. * * @see initialize() */ public function __construct($context, $moduleName, $actionName) { $this->initialize($context, $moduleName, $actionName); } /** * Initializes this component. * * @param sfContext $context The current application context. * @param string $moduleName The module name. * @param string $actionName The action name. * * @return boolean true, if initialization completes successfully, otherwise false */ public function initialize($context, $moduleName, $actionName) { $this->moduleName = $moduleName; $this->actionName = $actionName; $this->context = $context; $this->dispatcher = $context->getEventDispatcher(); $this->varHolder = new sfParameterHolder(); $this->request = $context->getRequest(); $this->response = $context->getResponse(); $this->requestParameterHolder = $this->request->getParameterHolder(); } /** * Execute any application/business logic for this component. * * In a typical database-driven application, execute() handles application * logic itself and then proceeds to create a model instance. Once the model * instance is initialized it handles all business logic for the action. * * A model should represent an entity in your application. This could be a * user account, a shopping cart, or even a something as simple as a * single product. * * @param sfRequest $request The current sfRequest object * * @return mixed A string containing the view name associated with this action */ abstract function execute($request); /** * Gets the module name associated with this component. * * @return string A module name */ public function getModuleName() { return $this->moduleName; } /** * Gets the action name associated with this component. * * @return string An action name */ public function getActionName() { return $this->actionName; } /** * Retrieves the current application context. * * @return sfContext The current sfContext instance */ public final function getContext() { return $this->context; } /** * Retrieves the current logger instance. * * @return sfLogger The current sfLogger instance */ public final function getLogger() { return $this->context->getLogger(); } /** * Logs a message using the sfLogger object. * * @param mixed $message String or object containing the message to log * @param string $priority The priority of the message * (available priorities: emerg, alert, crit, err, * warning, notice, info, debug) * * @see sfLogger */ public function logMessage($message, $priority = 'info') { if (sfConfig::get('sf_logging_enabled')) { $this->dispatcher->notify(new sfEvent($this, 'application.log', array($message, 'priority' => constant('sfLogger::'.strtoupper($priority))))); } } /** * Returns the value of a request parameter. * * This is a proxy method equivalent to: * * $this->getRequest()->getParameterHolder()->get($name) * * @param string $name The parameter name * @param mixed $default The default value if parameter does not exist * * @return string The request parameter value */ public function getRequestParameter($name, $default = null) { return $this->requestParameterHolder->get($name, $default); } /** * Returns true if a request parameter exists. * * This is a proxy method equivalent to: * * $this->getRequest()->getParameterHolder()->has($name) * * @param string $name The parameter name * @return boolean true if the request parameter exists, false otherwise */ public function hasRequestParameter($name) { return $this->requestParameterHolder->has($name); } /** * Retrieves the current sfRequest object. * * This is a proxy method equivalent to: * * $this->getContext()->getRequest() * * @return sfRequest The current sfRequest implementation instance */ public function getRequest() { return $this->request; } /** * Retrieves the current sfResponse object. * * This is a proxy method equivalent to: * * $this->getContext()->getResponse() * * @return sfResponse The current sfResponse implementation instance */ public function getResponse() { return $this->response; } /** * Retrieves the current sfController object. * * This is a proxy method equivalent to: * * $this->getContext()->getController() * * @return sfController The current sfController implementation instance */ public function getController() { return $this->context->getController(); } /** * Generates a URL for the given route and arguments. * * This is a proxy method equivalent to: * * $this->getContext()->getRouting()->generate(...) * * @param string The route name * @param array An array of parameters for the route * @param Boolean Whether to generate an absolute URL or not * * @return string The URL */ public function generateUrl($route, $params = array(), $absolute = false) { return $this->context->getRouting()->generate($route, $params, $absolute); } /** * Retrieves the current sfUser object. * * This is a proxy method equivalent to: * * $this->getContext()->getUser() * * @return sfUser The current sfUser implementation instance */ public function getUser() { return $this->context->getUser(); } /** * Gets the current mailer instance. * * @return sfMailer A sfMailer instance */ public function getMailer() { return $this->getContext()->getMailer(); } /** * Sets a variable for the template. * * If you add a safe value, the variable won't be output escaped * by symfony, so this is your responsability to ensure that the * value is escaped properly. * * @param string $name The variable name * @param mixed $value The variable value * @param Boolean $safe true if the value is safe for output (false by default) */ public function setVar($name, $value, $safe = false) { $this->varHolder->set($name, $safe ? new sfOutputEscaperSafe($value) : $value); } /** * Gets a variable set for the template. * * @param string $name The variable name * * @return mixed The variable value */ public function getVar($name) { return $this->varHolder->get($name); } /** * Gets the sfParameterHolder object that stores the template variables. * * @return sfParameterHolder The variable holder. */ public function getVarHolder() { return $this->varHolder; } /** * Sets a variable for the template. * * This is a shortcut for: * * $this->setVar('name', 'value') * * @param string $key The variable name * @param string $value The variable value * * @return boolean always true * * @see setVar() */ public function __set($key, $value) { return $this->varHolder->setByRef($key, $value); } /** * Gets a variable for the template. * * This is a shortcut for: * * $this->getVar('name') * * @param string $key The variable name * * @return mixed The variable value * * @see getVar() */ public function & __get($key) { return $this->varHolder->get($key); } /** * Returns true if a variable for the template is set. * * This is a shortcut for: * * $this->getVarHolder()->has('name') * * @param string $name The variable name * * @return boolean true if the variable is set */ public function __isset($name) { return $this->varHolder->has($name); } /** * Removes a variable for the template. * * This is just really a shortcut for: * * $this->getVarHolder()->remove('name') * * @param string $name The variable Name */ public function __unset($name) { $this->varHolder->remove($name); } /** * Calls methods defined via sfEventDispatcher. * * @param string $method The method name * @param array $arguments The method arguments * * @return mixed The returned value of the called method * * @throws sfException If called method is undefined */ public function __call($method, $arguments) { $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'component.method_not_found', array('method' => $method, 'arguments' => $arguments))); if (!$event->isProcessed()) { throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method)); } return $event->getReturnValue(); } }