当前位置: 首页 > 文档资料 > Yaf 用户手册 >

11.9. The Yaf_Controller_Abstract class

优质
小牛编辑
115浏览
2023-12-01
简介

Yaf_Controller_Abstract是Yaf的MVC体系的核心部分. MVC是指Model-View-Controller, 是一个用于分离应用逻辑和表现逻辑的设计模式.

Yaf_Controller_Abstract体系具有可扩展性, 可以通过继承已有的类, 来实现这个抽象类, 从而添加应用自己的应用逻辑.

对于Controller来说, 真正的执行体是在Controller中定义的一个一个的动作, 当然这些动作也可以定义在Controller外:参看Yaf_Controller_Abstract::$action

与一般的框架不同, 在Yaf中, 可以定义动作的参数, 这些参数的值来自对Request的路由结果中的同名参数值. 比如对于如下的控制器:

例 11.44. Yaf_Controller_Abstract参数动作 的例子

  <?php
 class IndexController extends Yaf_Controller_Abstract {
public function indexAction($name, $value) {
}
 }
 ?>
 

在使用默认路由的情况下, 对于请求http://domain.com/index/index/name/a/value/2我们知道会在Request对象中生成俩个参数name和value,而注意到动作indexAction的参数, 与此同名, 于是在indexAction中, 可以有如下两种方式来获取这俩个参数:

例 11.45. Yaf_Controller_Abstract参数动作 的例子

  <?php
 class IndexController extends Yaf_Controller_Abstract {
public function indexAction($name, $value) {
//直接获取参数;
echo $name, $value; //a2
//通过Request对象获取
echo $this->getRequest()->getParam("name"); //a
}
 }
 ?>
 

注意
需要注意的是, 这些参数是来自用户请求URL, 所以使用前一定要做安全化过滤. 另外, 为了防止PHP抛出参数缺失的警告, 请尽量定义有默认值的参数.

在PHP5.3之后, 打开yaf.use_namespace的情况下, 也可以使用Yaf\Controller_Abstract.

 
  abstract 
  Yaf_Controller_Abstract
{
  
  protected 
  array 
 actions

   ;
  
  protected 
  Yaf_Request_Abstract 
 _request

   ;
  
  protected 
  Yaf_Response_Abstract 
 _response

   ;
  
  protected 
  Yaf_View_Interface 
 _view

   ;
  
  protected 
  string 
 _script_path

   ;
private void 
 __construct ( void  );
public void 
 init ( void  );
public string 
 getModuleName ( void  );
public Yaf_Request_Abstract 
 getRequest ( void  );
public Yaf_Response_Abstract 
 getResponse ( void  );
public Yaf_View_Interface 
 getView ( void  );
public Yaf_View_Interface 
 initView ( void  );
public boolean 
 setViewPath ( string  $view_directory );
public string 
 getViewPath ( void  );
public Yaf_Response_Abstract 
 render ( string  $action_name ,
  array  $tpl_vars = NULL );
public boolean 
 display ( string  $action_name ,
 array  $tpl_vars = NULL );
public boolean 
 forward ( string  $action ,
 array  $invoke_args = NULL );
public boolean 
 forward ( string  $controller ,
 string  $action ,
 array  $invoke_args = NULL );
public boolean 
 forward ( string  $module ,
 string  $controller ,
 string  $action ,
 array  $invoke_args = NULL );
public boolean 
 redirect ( string  $url );
}
属性说明
actions

有些时候为了拆分比较大的Controller, 使得代码更加清晰和易于管理, Yaf支持将具体的动作分开定义. 每个动作都需要实现 Yaf_Action_Abstract 就可以通过定义Yaf_Controller_Abstract::$actions来指明那些动作对应于具体的那些分离的类. 比如:

  <?php
class IndexController extends Yaf_Controller_Abstract {
  public $actions = array (
 "index" => "actions/Index.php",
  );
} 

这样, 当路由到动作Index的时候, 就会加载APPLICATION_PATH . "/actions/Index.php", 并且在这个脚本文件中寻找IndexAction(可通过yaf.name_suffix和yaf.name_separator来改变具体命名形式), 继而调用这个类的execute方法.

注意
在yaf.st_compatible打开的情况下, 会产生额外的查找逻辑.
_request

当前的请求实例, 属性的值由Yaf_Dispatcher保证, 一般通过Yaf_Controller_Abstract::getRequest来获取此属性.

_response

当前的响应对象, 属性的值由Yaf_Dispatcher保证, 一般通过Yaf_Controller_Abstract::getResponse来获取此属性.

_view

视图引擎, Yaf才会延时实例化视图引擎来提高性能, 所以这个属性直到显示的调用了Yaf_Controller_Abstract::getView或者Yaf_Controller_Abstract::initView以后才可用

_script_path

视图文件的目录, 默认值由Yaf_Dispatcher保证, 可以通过Yaf_Controller_Abstract::setViewPath来改变这个值.

参见
Yaf_Action_Abstract