欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Yaf入门

程序员文章站 2024-02-15 19:26:05
...

基础

  • 官方手册
  • 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, 并实现了异常链
相关标签: 学习笔记 php