当前位置: 首页 > 工具软件 > Yaf > 使用案例 >

Yaf入门

张姚石
2023-12-01

基础

  • 官方手册
  • Yaf是一个C语言编写的PHP框架
  • 依赖SPL和PCRE扩展,一般PHP默认启用

优点

  • 性能开销小
  • 框架类在启动PHP时加载,常驻内存
  • 高性能的视图引擎
  • 可自定义视图引擎,支持插件,支持自定义路由

Hello World

结构

+ public
  |- index.php //入口文件
  |- .htaccess //重写规则    
  |+ css
  |+ img
  |+ js
+ conf
  |- application.ini //配置文件   
+ application
  |- Bootstrap.php
  |+ controllers
     |- Index.php //默认控制器
  |+ views    
     |+ index   //控制器
        |- index.phtml //默认视图
  |+ modules //其他模块
  |+ library //本地类库
  |+ models  //model目录
  |+ plugins //插件目录

入口文件

<?php
define("APP_PATH",  realpath(dirname(__FILE__) . '/../')); /* 指向public的上一级 */
$app  = new Yaf_Application(APP_PATH . "/conf/application.ini");
$app
->bootstrap()// 可选
->run();

重写规则

  • 每种server都要特别设置重写规则
  • 重写所有请求到入口文件
  • nginx为例
server {
  listen ****;
  server_name  domain.com;
  root   document_root;
  index  index.php index.html index.htm;

  if (!-e $request_filename) {
    rewrite ^/(.*)  /index.php/$1 last;
  }
}

配置文件

  • 可以直接使用php中已定义的常量
  • 配置文件支持继承, 支持分节
  • 默认节是product
[product]
application.directory=APP_PATH "/application/"

引导程序

  • yaf提供的一个全局配置的入口, 可以做很多全局自定义的工作
class Bootstrap extends Yaf_Bootstrap_Abstract{

}

默认控制器

  • 默认控制器为IndexController
  • 默认Action为IndexAction
<?php
class IndexController extends Yaf_Controller_Abstract {
   public function indexAction() {//默认Action
       $this->getView()->assign("content", "Hello World");
   }
}

默认视图文件

  • yaf支持简单的视图引擎
  • 默认视图文件为views/index/index.phtml
<html>
 <head>
   <title>Hello World</title>
 </head>
 <body>
  <?php echo $content;?>
 </body>
</html>

Bootstrap

  • Bootstrap类中, 所有以_init开头的方法, 都会被Yaf按申明次序自动调用
  • 这些方法, 都可接受一个参数:Yaf_Dispatcher $dispatcher
  • erp中在这里进行用户登录状态校验、注册特殊规则的路由
class Bootstrap extends Yaf_Bootstrap_Abstract{
    public function _initConfig() {
        $config = Yaf_Application::app()->getConfig();
        Yaf_Registry::set("config", $config);
    }

    public function _initDefaultName(Yaf_Dispatcher $dispatcher) {
        $dispatcher->setDefaultModule("Index")
            ->setDefaultController("Index")
            ->setDefaultAction("index");
    }
}

插件

  • 用户可以自定义插件类
  • 插件类需要继承Yaf_Plugin_Abstract
  • 定以后需要向Yaf_Dispatcher注册,所以一般插件注册都放在Bootstrap中进行

路由

  • 路由负责解析请求,交给指定的module/controller/action处理
  • 路由规则可以自定义
  • 路由组件有两个部分:路由器(Yaf_Router)和路由协议(Yaf_Route_Abstract)
    • 路由器负责管理和运行路由链
    • 路由协议负责匹配预先定义好的规则
    • 路由器根据路由协议栈倒叙遍历路由协议,匹配则成功,即后注册的协议会先被匹配
  • 路由将解析得到的信息传递给请求对象(Yaf_Request_Abstract)
    • 信息包括moduel、controller、action、用户params等
    • 派遣器(Yaf_Dispatcher)就会按照这些信息派遣正确的控制器动作
  • 默认路由器是Yaf_Router
  • 默认路由协议是Yaf_Route_Static
  • 默认请求对象Yaf_Request_Http

默认路由协议

  • 默认的路由协议为Yaf_Route_Static
  • 根据"/"对request_uri分段, 依次得到Module,Controller,Action
  • 根据Yaf_Application::$modules来判断Module是否合法,若不合法则把原Module当做Controller, 原Controller当做Action
/**
      * 对于请求request_uri为"/ap/foo/bar/dummy/1"
      * base_uri为"/ap"
      * 则最后参加路由的request_uri为"/foo/bar/dummy/1"
      * 然后, 通过对URL分段, 得到如下分节
      * foo, bar, dummy, 1
      * 然后判断foo是不是一个合法的Module, 如果不是, 则认为结果如下:
      */
      array(
        'module'     => '默认模块',
        'controller' => 'foo',
        'action'     => 'bar',
        'params'     => array(
             'dummy' => 1,
        )
     )

     /**
      * 而如果在配置文件中定义了ap.modules="Index,Foo",
      * 则此处就会认为foo是一个合法模块, 则结果如下
      */
      array(
        'module'     => 'foo',
        'controller' => 'bar',
        'action'     => 'dummy',
        'params'     => array(
             1 => NULL,
        )
     )

其他路由协议

  • Yaf_Route_Simple
  • Yaf_Route_Supervar
  • Yaf_Route_Map
  • Yaf_Route_Rewrite
  • Yaf_Route_Regex
// 用正则匹配路由,交给指定的控制器动作处理
$route = new Yaf_Route_Regex(
    'product/(.*)/(.*)',
    [
        'controller' => 'products',
        'action' => 'view'
    ],
    [
        1 => 'foo',
        2 => 'bar',
    ]
);

// 正则匹配部分可以利用正则的反向引用,从缓冲区读取为参数
// 控制器中获取参数
$foo = $this->getRequest()->getParam('foo');
$bar = $this->getRequest()->getParam('bar');
  • 自定义路由协议:实现Yaf_Route_Interface接口

添加路由协议

//通过派遣器得到默认的路由器
$router = Yaf_Dispatcher::getInstance()->getRouter();
$router->addRoute('myRoute', $route);

内建类

Yaf_Application

  • Yaf_Application代表一个产品/项目, 是Yaf运行的主导者, 真正执行的主体.
  • 负责接收请求, 协调路由, 分发, 执行, 输出
  • final,单例

Yaf_Bootstrap_Abstract

  • 引导程序,用来定制Yaf_Application
  • 用户可继承并任意添加方法,其中以_init开头的方法都会在Yaf_Application::Bootstrap()时自动执行
  • 所有_init方法都可以接受一个Yaf_Dispatcher对象作为参数

Yaf_Registry

  • 对象注册表(或称对象仓库),相当于一种全局存储
  • 是用于在整个应用空间(application space)内存储对象和值的容器
  • 该类是一个数组对象,你可以使用数组形式来访问其中的类方法
  • 主要方法
    • Yaf_Registry::set(string $name,mixed $value):Yaf_Registry
    • Yaf_Registry::get(string $name):mix/false
    • Yaf_Registry::has(string $name):bool
    • Yaf_Registry::del(string $name):bool

Yaf_Config_Abstract

  • 用于简化访问和使用配置数据
  • 配置数据可能来自于各种支持等级结构数据存储的媒体
  • 实现了Countable, ArrayAccess 和 Iterator 接口
  • Yaf_Config_INI:Ini文件适配器
    • ini配置文件通过[]申明节,通过[foo:bar]申明foo节继承bar节
    • ini配置文件通过句点.分离键值foo.a=1 foo.b=2
    • ini配置文件使用;定义注释
    [base]
    app_name = Yaf
    [production:base]
    application.directory = /usr/local/www/production
    ;数据库配置
    db.host = 67.89.8.10
    db.username = root
    [dev:production]
    ;开发环境配置继承生产环境,然后重写配置
    db.host = 127.0.0.1
    
  • Yaf_Config_Simple:PHP数组适配器
  • 获取配置内容
$config = Yaf_Application::app()->getConfig();
$host = $config->db->host;// 对象形式
$host = $cofig['db']['host'];// 数组形式

Yaf_Controller_Abstract

  • 控制器基类,用户自定义的控制器类需继承该抽象类
  • 一个自定义的控制器类可以包含多个Action方法,Action方法是路由的最终执行者
  • Action方法可以定义参数,路由器将尝试将路由参数赋值给同名的方法参数
// http://domain.com/index/index/name/a/value/2
public function indexAction($name, $value) {
    //直接获取参数;
    echo $name;// a 
    echo $value; // 2
}
  • 主要方法
    • Yaf_Controller_Abstract::getModuleName():string/null
    • Yaf_Controller_Abstract::getRequest():Yaf_Request_Abstract
    • Yaf_Controller_Abstract::getResponse():Yaf_Response_Abstract
    • Yaf_Controller_Abstract::initView():Yaf_View_Interface//初始化视图引擎
    • Yaf_Controller_Abstract::getView():Yaf_View_Interface
    • Yaf_Controller_Abstract::setViewPath(string $view_directory):Yaf_Controller_Abstract/false // 设置视图模板目录
    • Yaf_Controller_Abstract::getViewPath():string/null
    • Yaf_Controller_Abstract::render(string $action,array $tpl_vars=null):Yaf_Response_Abstract // 渲染视图,返回渲染结果
    • Yaf_Controller_Abstract::display(string $action,array $tpl_vars=null):bool //渲染视图并直接输出渲染结果
    • Yaf_Controller_Abstract::forward(…):Yaf_Controller_Abstract/false // 将当前请求转给另外一个action处理(本action还是要执行完毕的)
    • Yaf_Controller_Abstract::redirect(string $url):Yaf_Controller_Abstract/false // 重定向请求到新的路径

Yaf_Action_Abstract

  • 为了使得代码清晰, 分离一些大的控制器, action可以采用单独定义Yaf_Action_Abstract来实现
  • 包含一个抽象方法execute()
// 在Controller类中添加属性
public $actions = [
    "index" => "actions/Index.php",
];
// 则index动作将交由actions/Index类处理,执行其中的execute方法
// actions/Index.php中
class IndexAction extends Yaf_Action_Abstract{
    public function excute(){}
}

Yaf_View_Interface

  • 视图引擎接口
  • 接口方法
    • Yaf_View_Interface::__set — 为视图引擎分配一个模板变量
    • Yaf_View_Interface::__get — 获取视图引擎的一个模板变量值
    • Yaf_View_Interface::assign — 为视图引擎分配一个模板变量
    • Yaf_View_Interface::display — 渲染一个视图模板, 并直接输出给请求端
    • Yaf_View_Interface::render — 渲染一个视图模板,返回结果
    • Yaf_View_Interface::getScriptPath — 获取当前的模板目录
    • Yaf_View_Interface::setScriptPath — 设置模板的基目录,默认APPLICATION_PATH . “/views”
  • 模板中通过 n a m e 或 name或 namethis->_tpl_vars[$name]获取模板变量值
  • Yaf_View_Simple自带的视图引擎,模板为普通的php脚本

Yaf_Request_Abstract

  • 代表了一个实际请求,Yaf_Application在run以后会自动根据当前请求实例它
  • 主要方法
    • Yaf_Request_Abstract::getEnv — 取得ENV变量的值
    • Yaf_Request_Abstract::getLanguage — The getLanguage purpose
    • Yaf_Request_Abstract::getServer — 返回SERVER变量的值
    • Yaf_Request_Abstract::getBaseUri — The getBaseUri purpose
    • Yaf_Request_Abstract::getRequestUri — The getRequestUri purpose
    • Yaf_Request_Abstract::getModuleName — The getModuleName purpose
    • Yaf_Request_Abstract::getControllerName — The getControllerName purpose
    • Yaf_Request_Abstract::getActionName — The getActionName purpose
    • Yaf_Request_Abstract::getParam — The getParam purpose
    • Yaf_Request_Abstract::getParams — The getParams purpose
    • Yaf_Request_Abstract::getException — The getException purpose
    • Yaf_Request_Abstract::isCli — The isCli purpose
    • Yaf_Request_Abstract::isDispatched — The isDispatched purpose
    • Yaf_Request_Abstract::isRouted — The isRouted purpose
    • Yaf_Request_Abstract::getMethod — The getMethod purpose
    • Yaf_Request_Abstract::isGet — The isGet purpose
    • Yaf_Request_Abstract::isPost — The isPost purpose
    • Yaf_Request_Abstract::isPut — The isPut purpose
    • Yaf_Request_Abstract::isHead — The isHead purpose
    • Yaf_Request_Abstract::isOptions — The isOptions purpose
    • Yaf_Request_Abstract::isXmlHttpRequest — The isXmlHttpRequest purpose
    • Yaf_Request_Abstract::setBaseUri — The setBaseUri purpose
    • Yaf_Request_Abstract::setRequestUri — The setRequestUri purpose
    • Yaf_Request_Abstract::setModuleName — The setModuleName purpose
    • Yaf_Request_Abstract::setControllerName — The setControllerName purpose
    • Yaf_Request_Abstract::setActionName — The setActionName purpose
    • Yaf_Request_Abstract::setParam — The setParam purpose
    • Yaf_Request_Abstract::setDispatched — The setDispatched purpose
    • Yaf_Request_Abstract::setRouted — The setRouted purpose
  • Yaf_Request_Http处理http请求
  • Yaf_Request_Simple处理请求

Yaf_Response_Abstract

  • 响应对象
  • 主要方法
    • Yaf_Response_Abstract::__construct — The __construct purpose
    • Yaf_Response_Abstract::__clone — The __clone purpose
    • Yaf_Response_Abstract::__destruct — The __destruct purpose
    • Yaf_Response_Abstract::__toString — The __toString purpose
    • Yaf_Response_Abstract::setBody — 设置响应的Body
    • Yaf_Response_Abstract::appendBody — 往已有的响应body后附加新的内容
    • Yaf_Response_Abstract::prependBody — 往已有的响应body前插入新的内容
    • Yaf_Response_Abstract::getBody — 获取已经设置的响应body
    • Yaf_Response_Abstract::clearBody — 清除已经设置的响应body
    • Yaf_Response_Abstract::clearHeaders — The clearHeaders purpose
    • Yaf_Response_Abstract::setAllHeaders — The setAllHeaders purpose
    • Yaf_Response_Abstract::setHeader — The setHeader purpose
    • Yaf_Response_Abstract::getHeader — The getHeader purpose
    • Yaf_Response_Abstract::response — send response
    • Yaf_Response_Abstract::setRedirect — The setRedirect purpose
  • Yaf_Response_Http Web响应
  • Yaf_Response_Cli 命令行响应

Yaf_Router

  • 路由器,负责分析请求中的request uri, 得出目标模板, 控制器, 动作
  • 主要方法
    • Yaf_Router::__construct — Yaf_Router constructor
    • Yaf_Router::addConfig — 向Router中添加配置文件中定义的路由
    • Yaf_Router::addRoute — 往Router中添加新的路由
    • Yaf_Router::getCurrentRoute — 在路由结束以后, 获取路由匹配成功, 路由生效的路由协议名
    • Yaf_Router::getRoute — 获取当前路由器的路由协议栈中名为$name的协议
    • Yaf_Router::getRoutes — 获取当前路由器中的所有路由协议
    • Yaf_Router::route — 路由一个请求, 本方法不需要主动调用, Yaf_Dispatcher::dispatch会自动调用本方法

Yaf_Route_Interface

  • 路由协议的标准接口

Yaf_Loader

  • 提供自动加载功能

Yaf_Dispatcher

  • 协调路由来的请求, 并分发和执行发现的动作, 并收集动作产生的响应, 输出响应给请求者, 并在整个过程完成以后返回响应
  • 它由Yaf_Application负责初始化, 然后由Yaf_Application::run启动

Yaf_Session

  • 用来操作session
  • 实现了Iterator, ArrayAccess, Countable接口

Yaf_Exception

  • 处理异常, 继承自Exception, 并实现了异常链
 类似资料: