yaf 学习

转自 http://blog.congcong.us/archives/283.html

框架的存在主要意义就是提高程序员的开发效率,同时也带来性能上的一部分损失。
当前开发面向对象已经成为主流,同时为了规范开发使用MVC模式已经成为了一种趋势,当前市面上的框架非常之多,大部分也是MVC模式,但是相对来说对于PHP性能都一定的损失。

那么有没有一种框架既能满足开发效率,又尽可能少的减少性能的损失呢?于是Yaf框架面世。

Yaf是以PHP插件的形式出现,所以少了编译加载等步骤,加强了性能。提供MVC模式,有一定的路由规则,一定的错误处理机制,有一定的触发器。
同时也伴之有不足之处比如说缺少ORM等形式

Yaf的框架搭建的时候目录结构:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public

     index.php

     .htaccess

     css

     img

     js

conf

     application.ini

applciation

     controllers

          Index.php

     views

          index

               index.phtml

     modules

     library

     models

     plugins

Yaf的启动


1

2

$app new Yaf_Application(App_PATH."/CONF/APPLICATION.INI");

$app->run();

配置Yaf的路由规则 开启URL重写


1

2

3

4

5

6

7

8

9

10

11

12

13

14

RewriteEngine On

RewriteCond ${REQUEST_FILENAME} !-f

RewriteRule .* index.php

server{

     listen ***;

     server_name domain.com

     root document_root;

     index index.php index.html index.htm

     if(!-e $request_filename){

          rewrite ^/(.*) /idnex.php/$1 last;

     }

}

SAE下的重写


1

2

3

4

name:your_app_name

version:1

handle:

     -rewrite:if(!is_dir() && !is_file() && path ~ "^(.*)$"goto "/index.php"

输出HelloWorld


1

2

3

4

5

6

7

<?php

class IndexController extends Yaf_Controller_Abstract{

     public function indexAction(){

          $this->getView()->assign("content","Hello world");

     }

}

?>


1

2

[product]

     application.driectory = APP_PATH."/application/"

创建demo


1

yaf_cg sample

配置文件 至少一个application.directory
其他可选:


1

2

3

4

5

6

7

8

9

10

11

12

application.ext php脚本的扩展名

application.bootstrap Bootstrap路径

application.library 类库的绝对目录地址

application.baseUri 在路由中需要忽略的路径前缀

applciation.dispatcher.defaultModule 默认的模块

applciation.dispatcher.throwException 出错的时候抛出异常

applciation.dispatcher.catchException 使用默认的异常捕获Controller

application.dispatcher.defaultController 默认控制器

application.dispatcher.defaultAction 默认动作

appcation.view.ext 视图模板扩展名

appcation.modules 声明存在的模块名,注意如果要定义这个值一定要定义Index Module

application.system.* 通过这个属性,可以修改yaf的runtime configure 比如application.system.lowcase_path,但是请注意只有PHP_INI_ALL的配置项才可以在这里被修改,此选项从2.2.0开始引入

自动加载器
Autoloader 目录映射加载MVC类
非框架MVC类 Yaf支持全局类和自身类的两种加载方式 支持大小写敏感和大小写不敏感两种方式

全局类和自身类(本地类)
全局类:指有产品之间共享的类,这些类库的路径是通过ap.library在php.ini
本地类:产品自身的类库,这些类库的路径是通过在产品的配置文件中,通过ap.library配置的
在yaf中,通过调用Yaf_Loader的regiterLocalNamespace方法,来申明那些类前缀是本地类,即可

类加载规则
下划线分割目录信息,Yaf按照目录信息完成自动加载


1

2

$loader = Yaf_Loader::Instance(0);

$loader->registerLocalNamespace(array("Foo","Local"));

Bootstrap 引导程序 提供一个全局配置的入口


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

$app new Yaf_Application("conf.ini");

$app->bootstrap()->run();

// _init开头

//这些方法都接受一个参数:Yaf_Dispatcher $dispatcher

//调用顺序按照声明顺序

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支持的Hook
routerStartup
routerShutdown

dispatchLoopStartup
preDispatch
posDispatch
dispatchLoopShutdown

自定义插件(可接受两个参数 Yaf_Request_Abstract 和 Yaf_Response_Abstract)


1

2

3

4

5

<?php

class UserPlugin extends Yaf_Plugin_Abstract{

     public function routerStartup(Yaf_Request_Abstract $request,Yaf_Response_Abstract $response){}

     public function routerShutdown(Yaf_Request_Abstract $request,Yaf_Response_Abstract $response){}

}

Yaf插件 必须继承自Yaf_Plugin_Abstract plugins目录

路由和路由协议
路由组件有两个部分:路由器(Yaf_Router)和路由协议(Yaf_Route_Abstract).
路由注册的顺序很重要,最后注册的路由协议,最先尝试路由,这就有个陷阱,请注意。

默认情况下路由器是Yaf_Router 默认路由协议 Yaf_Route_Static 基于Http路由的,他期望一个请求时Http请求并且请求对象是使用yaf_Request_Http


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<?php

     //路由器实例

     $router = Yaf_Dispatcher::getInstance()->getRouter();

     //路由器协议

     $router->addRoute(‘myRoute‘,$route);

在配置文件中定义:

[common]

;自定义路由 顺序很重要

routes.regex.type= "regex"

routes.regex.match =

routes.regex.route.controller = Index

routes.regex.route.action = action

routes.regex.map.1 = name

routes.regex.map.2 = value

;添加一个名为simple的路由协议

routes.simple.type="simple"

routes.simple.controller = c

routes.simple.module = m

routes.simple.action = a

;添加一个名为supervar的路由协议

routes.supervar.type = "supervar"

routes.supervar.varname = r

[product:common]

;product节是Yaf默认关心的节,添加一个名为rewrite的路由协议

routes.rewrite.type = "rewrite"

routes.rewrite.match = "/product/:name/:value"

<?php

class Bootstrap extends Yaf_Bootstrap_Abstract{

     public function _initRoute(Yaf_Dispatcher $dispatcher){

          $router = Yaf_Dispatcher::getInstance()->getRouter();

          //添加配置中的路由

          $router->addConfig(Yaf_Registry::get("config")->routes);

     }

}

//其实路由器也提供给我们不同的方法来得到和设置包含在它内部的信息,一些重要的方法如下:
getCurrentRoute() //在路由结束以后, 获取起作用的路由协议
getRoute(), getRoutes();//看函数基本意思也就知道.

自定义路由器:申明你的路由协议实现了Yaf_Route_Interface接口即可

异常和错误

application.dispatcher.throwException 打开的情况下 会抛异常,否则会触发错误


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

class ErrorController extends Yaf_Controller_Abstract{

     publi function errorAction($exception){

     //NO1.

     assert($exception === $exception->getCode());

     $this->getView()->assign("code",$exceptioon->getCode());

     $this->getView()->assign("message",$exception->getMessage());

     //NO.2

      $exception $this->getRequest()->getException();

  try {

    throw $exception;

  catch (Yaf_Exception_LoadFailed $e) {

    //加载失败

  catch (Yaf_Exception $e) {

    //其他错误

  }

     }

}

时间: 2024-10-06 02:00:30

yaf 学习的相关文章

Yaf学习

Yaf是一个PHP框架,类似于Zend Framework.ThinkPHP的框架.Yaf是使用C语言写成的PHP扩展,通过在php.ini文件中配置安装Yaf. 1,Yaf安装 windows环境中安装Yaf: yaf有TS(Thread Safe 线程安全)和NTS(Not Thread Safe)版本,先查看下自己php的版本,用phpinfo()查看下thread safety项,如果为enabled的话,选择TS版本,反之选择NTS版本 打开yaf下载地址,点击DLL,然后根据选择对应

Lnmp上安装Yaf学习(二)

上一节主要实践了在Lnmp上安装Yaf扩展,那么这一节将测试 Yaf 的一个简单demo的运行. 一.通过Lnmp 创建 vhost 文件 [[email protected] yaf-3.0.6]# lnmp vhost add +-------------------------------------------+ | Manager for LNMP, Written by Licess | +-------------------------------------------+ |

yaf学习 从头开始

一.入口文件 入口文件是所有请求的入口, 一般都借助于rewrite(正则)规则, 把所有的请求都重定向( 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置)到这个入口文件. 例 3.2. 一个经典的入口文件public/index.php <?php define("APP_PATH", realpath(dirname(__FILE__) . '/../')); /* 指向public的上一级 */ //定义常量 APP_PATH 指向publ

Yaf零基础学习总结3-Hello Yaf

Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Yaf,目标只要能得到“Hello Yaf”就可以了,不多说,下面开始了.(注:需要读者有一定的MVC知识基础,最好用过一些其他简单的框架) 1.组织目录结构 对于使用过框架的来说这点很好理解,对于没使用过框架的来说建议先别在这死磕,先记着吧,简单点就是对于我们的文件结构做一些规定,让自己和别人都能看

Yaf零基础学习总结2-Yaf框架的安装

接着上一篇文章<Yaf零基础学习总结1-Yaf框架简介>我们对Yaf框架有那么一个大概的了解了,但是对于程序员来说,那些文字都是表面的,他们最想的就是开始敲代码了.当然这也是学习Yaf框架最有效的方法,敲得越多肯定学得越快,对于任何语言来说也是一样的,在写代码之前我们得把Yaf框架安装上. 相比于其它PHP框架,Yaf是作为PHP的一个扩展发行的,我们也知道他是基于C语言实现的,我们看不到它的PHP代码,当然有C语言背景的人可以去看下他的C源码.知道安装PHP扩展的人基本可以略过本文了,因为Y

yaf零基础学习总结6-学习使用Yaf中的插件

Bootstrap, 也叫做引导程序. 它是Yaf提供的一个全局配置的入口, 在Bootstrap中, 你可以做很多全局自定义的工作.在一个Yaf_Application被实例化之后, 运行(Yaf_Application::run)之前, 可选的我们可以运行Yaf_Application::bootstrap [php] view plaincopy <?php $app = new Yaf_Application("conf.ini"); $app ->bootstra

《Yaf零基础学习总结》系列技术文章整理收藏

<Yaf零基础学习总结>系列技术文章整理收藏 Yaf零基础学习总结系列整理了Yaf的基础知识,对于Yaf入门的学习有很大的参考借鉴,收藏在这里,自己用到Yaf的时候随时查阅 1关于Yaf的一些说明[转Yaf作者]http://www.lai18.com/content/407120.html 2Yaf零基础学习总结1-Yaf框架简介http://www.lai18.com/content/407123.html 3Yaf零基础学习总结2-Yaf框架的安装http://www.lai18.com

Yaf零基础学习总结5-Yaf类的自动加载

Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次. 具体的目录映射规则如下: 对于控制器 Controller 默认模块下为{项目路径}/controllers/, 否则为{项目路径}/mod

Yaf零基础学习总结4-Yaf的配置文件

在上一节的hello yaf当中我们已经接触过了yaf的配置文件了, Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置项都以ap开头. Yaf的核心必不可少的配置项只有一个(其实, 这个也可以有默认参数, 但是作者觉得完全没有配置, 显得太寒酸了). Yaf通过在不同的环境中, 选取不同的配置节, 再结合配置可继承, 来实现一套配置适应多种环境(线上,测试,开发). yaf一个必不可少的配置项,也就是配置应用项目的