Zend Framework教程之动作的基类Zend_Controller_Action详解
发布时间:2020-05-23 15:55:28 所属栏目:PHP 来源:互联网
导读:这篇文章主要介绍了Zend Framework教程之动作的基类Zend_Controller_Action的用法,结合实例形式详细分析了动作的基类Zend_Controller_Action具体功能,使用方法与相关注意事项,需要的朋友可以参考下
|
本文实例讲述了Zend Framework教程之动作的基类Zend_Controller_Action。分享给大家供大家参考,具体如下: Zend_Controller_Action的实现Zend Framework的动作控制器需要继承Zend_Controller_Action,Zend_Controller_Action提供了动作控制器的基本功能,具体参考如下代码: Zend_Controller_Action_InterfaceZend_Controller_ActionsetRequest($request)
->setResponse($response)
->_setInvokeArgs($invokeArgs);
$this->_helper = new Zend_Controller_Action_HelperBroker($this);
$this->init();
}
public function init()
{
}
public function initView()
{
if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
return $this->view;
}
require_once 'Zend/View/Interface.php';
if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) {
return $this->view;
}
$request = $this->getRequest();
$module = $request->getModuleName();
$dirs = $this->getFrontController()->getControllerDirectory();
if (empty($module) || !isset($dirs[$module])) {
$module = $this->getFrontController()->getDispatcher()->getDefaultModule();
}
$baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views';
if (!file_exists($baseDir) || !is_dir($baseDir)) {
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")');
}
require_once 'Zend/View.php';
$this->view = new Zend_View(array('basePath' => $baseDir));
return $this->view;
}
public function render($action = null,$name = null,$noController = false)
{
if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
return $this->_helper->viewRenderer->render($action,$name,$noController);
}
$view = $this->initView();
$script = $this->getViewScript($action,$noController);
$this->getResponse()->appendBody(
$view->render($script),$name
);
}
public function renderScript($script,$name = null)
{
if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
return $this->_helper->viewRenderer->renderScript($script,$name);
}
$view = $this->initView();
$this->getResponse()->appendBody(
$view->render($script),$name
);
}
public function getViewScript($action = null,$noController = null)
{
if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {
$viewRenderer = $this->_helper->getHelper('viewRenderer');
if (null !== $noController) {
$viewRenderer->setNoController($noController);
}
return $viewRenderer->getViewScript($action);
}
$request = $this->getRequest();
if (null === $action) {
$action = $request->getActionName();
} elseif (!is_string($action)) {
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Invalid action specifier for view render');
}
if (null === $this->_delimiters) {
$dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
$wordDelimiters = $dispatcher->getWordDelimiter();
$pathDelimiters = $dispatcher->getPathDelimiter();
$this->_delimiters = array_unique(array_merge($wordDelimiters,(array) $pathDelimiters));
}
$action = str_replace($this->_delimiters,'-',$action);
$script = $action . '.' . $this->viewSuffix;
if (!$noController) {
$controller = $request->getControllerName();
$controller = str_replace($this->_delimiters,$controller);
$script = $controller . DIRECTORY_SEPARATOR . $script;
}
return $script;
}
public function getRequest()
{
return $this->_request;
}
public function setRequest(Zend_Controller_Request_Abstract $request)
{
$this->_request = $request;
return $this;
}
public function getResponse()
{
return $this->_response;
}
public function setResponse(Zend_Controller_Response_Abstract $response)
{
$this->_response = $response;
return $this;
}
protected function _setInvokeArgs(array $args = array())
{
$this->_invokeArgs = $args;
return $this;
}
public function getInvokeArgs()
{
return $this->_invokeArgs;
}
public function getInvokeArg($key)
{
if (isset($this->_invokeArgs[$key])) {
return $this->_invokeArgs[$key];
}
return null;
}
public function getHelper($helperName)
{
return $this->_helper->{$helperName};
}
public function getHelperCopy($helperName)
{
return clone $this->_helper->{$helperName};
}
public function setFrontController(Zend_Controller_Front $front)
{
$this->_frontController = $front;
return $this;
}
public function getFrontController()
{
// Used cache version if found
if (null !== $this->_frontController) {
return $this->_frontController;
}
// Grab singleton instance,if class has been loaded
if (class_exists('Zend_Controller_Front')) {
$this->_frontController = Zend_Controller_Front::getInstance();
return $this->_frontController;
}
// Throw exception in all other cases
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Front controller class has not been loaded');
}
public function preDispatch()
{
}
public function postDispatch()
{
}
public function __call($methodName,$args)
{
require_once 'Zend/Controller/Action/Exception.php';
if ('Action' == substr($methodName,-6)) {
$action = substr($methodName,strlen($methodName) - 6);
throw new Zend_Controller_Action_Exception(sprintf('Action "%s" does not exist and was not trapped in __call()',$action),404);
}
throw new Zend_Controller_Action_Exception(sprintf('Method "%s" does not exist and was not trapped in __call()',$methodName),500);
}
public function dispatch($action)
{
// Notify helpers of action preDispatch state
$this->_helper->notifyPreDispatch();
$this->preDispatch();
if ($this->getRequest()->isDispatched()) {
if (null === $this->_classMethods) {
$this->_classMethods = get_class_methods($this);
}
// If pre-dispatch hooks introduced a redirect then stop dispatch
// @see ZF-7496
if (!($this->getResponse()->isRedirect())) {
// preDispatch() didn't change the action,so we can continue
if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action,$this->_classMethods)) {
if ($this->getInvokeArg('useCaseSensitiveActions')) {
trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"');
}
$this->$action();
} else {
$this->__call($action,array());
}
}
$this->postDispatch();
}
// whats actually important here is that this action controller is
// shutting down,regardless of dispatching; notify the helpers of this
// state
$this->_helper->notifyPostDispatch();
}
public function run(Zend_Controller_Request_Abstract $request = null,Zend_Controller_Response_Abstract $response = null)
{
if (null !== $request) {
$this->setRequest($request);
} else {
$request = $this->getRequest();
}
if (null !== $response) {
$this->setResponse($response);
}
$action = $request->getActionName();
if (empty($action)) {
$action = 'index';
}
$action = $action . 'Action';
$request->setDispatched(true);
$this->dispatch($action);
return $this->getResponse();
}
protected function _getParam($paramName,$default = null)
{
$value = $this->getRequest()->getParam($paramName);
if ((null === $value || '' === $value) && (null !== $default)) {
$value = $default;
}
return $value;
}
protected function _setParam($paramName,$value)
{
$this->getRequest()->setParam($paramName,$value);
return $this;
}
protected function _hasParam($paramName)
{
return null !== $this->getRequest()->getParam($paramName);
}
protected function _getAllParams()
{
return $this->getRequest()->getParams();
}
final protected function _forward($action,$controller = null,$module = null,array $params = null)
{
$request = $this->getRequest();
if (null !== $params) {
$request->setParams($params);
}
if (null !== $controller) {
$request->setControllerName($controller);
// Module should only be reset if controller has been specified
if (null !== $module) {
$request->setModuleName($module);
}
}
$request->setActionName($action)
->setDispatched(false);
}
protected function _redirect($url,array $options = array())
{
$this->_helper->redirector->gotoUrl($url,$options);
}
}
Zend_Controller_Action提供了动作和视图的render功能,以及注册请求和响应对象,常用助手等等。 动作控制器的常用方法在动作控制器中常用的方法和属性如下: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
