yaf

https://github.com/elad-yosifon/php-yaf-doc
https://github.com/laruence/yaf
https://php.net/manual/en/book.yaf.php

下载完成后解压,在解压目录下面只需要依次执行以下几个步骤 :1.phpize
侦测环境(phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件),建立一个configure文件。必须在一个目录下去运行phpize。那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下。



2../configure –with-php-config=/data/php/bin/phpize/php-config
3.make & make install
4.修改php.ini 配置文件,添加 extension=yaf.so



yaf生成目录



  • .htaccess // Rewrite rules

  • public
    | - index.php // Application entry
    | + css
    | + js
    | + img

  • conf
    | - application.ini // Configure

  • application/

    • Bootstrap.php // Bootstrap

    • controllers

      • Index.php // Default controller



    • views

      |+ index

      - index.phtml // View template for default controller

    • library

    • models // Models

    • plugins // Plugins





DocumentRoot
You should set DocumentRoot to application/public, thus only the public folder can be accessed by user



index.php
index.php in the public directory is the only way in of the application, you should rewrite all request to it(you can use .htaccess in Apache+php mod)



<?php
define(“APPLICATION_PATH”, dirname(dirname(FILE)));



$app = new Yaf_Application(APPLICATION_PATH . “/conf/application.ini”);
$app->bootstrap() //call bootstrap methods defined in Bootstrap.php
->run();
Rewrite rules
Apache
#.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php
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;
}
}
Lighttpd
$HTTP[“host”] =~ “(www.)?domain.com$” {
url.rewrite = (
“^/(.+)/?$” => “/index.php/$1”,
)
}
application.ini
application.ini is the application config file



[product]
;CONSTANTS is supported
application.directory = APPLICATION_PATH “/application/”
Alternatively, you can use a PHP array instead:



<?php
$config = array(
“application” => array(
“directory” => application_path . “/application/”,
),
);



$app = new yaf_application($config);
….



default controller
In Yaf, the default controller is named IndexController:



<?php
class IndexController extends Yaf_Controller_Abstract {
// default action name
public function indexAction() {

$this->getView()->content = “Hello World”;
}
}



入口文件内容:
<?php
//指向public的上一级
define(“APP_PATH”, realpath(dirname(FILE) . ‘/../’));



//加载框架的配置文件
$app = new Yaf\Application(APP_PATH . “/conf/application.ini”);



//加载bootstrap配置内容启动
$app->bootstrap()->run();



.htacess文件内容如下:
该文件实现对路由的重写功能,每个url请求都会经过index.php入口文件。



RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php



application.ini配置文件默认内容:
此文件用于定义自己的常量,具体使用接下来用到会进行说明。



[yaf]
;APP_PATH is the constant defined in index.php
application.directory=APP_PATH “/app”
application.ext=”php”
application.view.ext=”phtml”
application.modules=”Index,Admin”
application.library=APP_PATH “/lib”
application.library.directory=APP_PATH “/lib”
application.library.namespace=””

application.bootstrap=APP_PATH “/app” “/Bootstrap.php”
application.baseUri=””
application.dispatcher.defaultRoute=””
application.dispatcher.throwException=1
application.dispatcher.catchException=1
application.dispatcher.defaultModule=”index”
application.dispatcher.defaultController=”index”
application.dispatcher.defaultAction=”index”
;custom settings
application.layout.directory=APP_PATH “/app” “/views” “/layouts”
application.protect_from_csrf=1
application.encoding=UTF-8
;product section inherit from yaf section
[product:yaf]
; user configuartions list here
database.mysql.host=localhost
database.mysql.port=3306
database.mysql.user=
database.mysql.password=
database.mysql.database=
database.mysql.charset=utf8



bootstrap文件内容:
实际的初始化方法按照自己的实际需要进行添加:
<?php
use Yaf\Bootstrap_Abstract;
use Yaf\Dispatcher;
/**



  • 所有在Bootstrap类中, 以_init开头的方法, 都会被Yaf调用,

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

  • 调用的次序, 和申明的次序相同
    */



class Bootstrap extends Bootstrap_Abstract
//加载应用初始化配置
public function _initConfig() {
$config = Yaf\Application::app()->getConfig();
Yaf\Registry::set(“config”, $config);
}



//定义应用默认模块和默认的控制器及方法
public function _initDefaultName(Dispatcher $dispatcher) {
$dispatcher->setDefaultModule("Index")->setDefaultController("index")->setDefaultAction("index");
}

//初始化应用的总的路由配置
public function _initRoute(Dispatcher $dispatcher)
{
$config = new Yaf\Config\Ini(APP_PATH . '/conf/routing.ini');
$dispatcher->getRouter()->addConfig($config);
}

//初始化模块自己专属的配置
public function _initModules(Yaf\Dispatcher $dispatcher)
{
$app = $dispatcher->getApplication();

$modules = $app->getModules();
foreach ($modules as $module) {
if ('index' == strtolower($module)) continue;

require_once $app->getAppDirectory() . "/modules" . "/$module" . "/_init.php";
}
} }


相应的,模块新增方法如下:
//往conf/application.ini文件中加入下列代码
application.modules=”index,admin,test”



这里表明应用采用index模块,admin模块和test模块。相应的,需要添加对应的目录如下:




  • public
    |- index.php //入口文件
    |- .htaccess //重写规则

    |+ css
    |+ img
    |+ js

  • conf
    |- application.ini //配置文件

  • application
    |+ controllers
    |+Backend
    |-Index.php //控制器文件
    |- Index.php //默认控制器
    |+ views

    |+ index //控制器
    |- index.phtml //默认视图
    |+ modules //其他模块
    |+Admin
    |+config
    |-routes.ini //模块路由规则
    |+controller //模块控制器文件目录
    |-Index.php
    |-Test.php
    |+views //模块视图文件目录
    |-_init.php //加载模块的路由规则
    |+Test
    |+config
    |-routes.ini
    |+controller
    |+views
    |-_init.php
    |+ library //本地类库
    |+ models //model目录
    |+ plugins //插件目录



路由配置:
配置默认模块路由:



;默认模块中的backend目录的路由配置
backend_index.type=”rewrite”
backend_index.match=”/(backend|backend/)$”
backend_index.route.module=”index”
backend_index.route.controller=”backend_index”
backend_index.route.action=”index”
backend_post_index.type=”rewrite”
backend_post_index.match=”/Backend/(posts|posts/)$”
backend_post_index.route.module=”index”
backend_post_index.route.controller=”backend_posts”
backend_post_index.route.action=”index”



此时可以通过访问下面的url,访问index模块的backend目录下的Index.php的Backend_IndexController控制器中的index方法(默认方法)。



http://www.yaftest.io/backend/
错误示范:刚开始把backend_index这个控制器改为index,结果每次都会跑index默认模块目录下的index控制器而不是backend目录下的index控制器。原因在于这些控制器都没有使用命名空间,因此,改成index时,只能被判断成是访问前者。



配置其他模块路由:



//第一步:编辑routes.ini文件,配置路由规则
;Admin routes
admin.admin_index.type=”rewrite”
admin.admin_index.route.module=”admin”



//此处可以匹配到admin模块中的Index控制器
admin.admin_index.match=”/(admin|admin/)$”
admin.admin_index.route.controller=”index”
admin.admin_index.route.action=”index”



//此处可以匹配到admin模块中的Test控制器
//错误写法:admin.admin_index.match=”/admin/test”(无法匹配到test控制器里面的方法)
admin.admin_index.match=”/(admin/test/)$”
admin.admin_index.route.controller=”test”
admin.admin_index.route.action=”index”



//第二步:配置_init.php文件,将当前模块的路由规则加入应用生效
<?php
$dis=Yaf\Dispatcher::getInstance();



//Initialize Routes for Admin module
$routes = new Yaf\Config\Ini(DIR . “/config” . “/routes.ini”);
$dis->getRouter()->addConfig($routes->admin);



此时可以通过访问下面的url,访问test控制器中的test方法,其中后一个test为控制器的方法名,直接通过修改即可更改对方法的访问。



http://www.yaftest.io/admin/test/test



7、控制器简单模板:
编辑application/controllers/backend/index.php文件:



<?php
use Yaf\Controller_Abstract;
use Yaf\Dispatcher;
class Backend_IndexController extends Controller_Abstract
{
public function indexAction()
{//默认Action
$this->getView()->assign(“content”, “I am in application/controllers/Backend/Index/indexAction”);
}



public function testAction(){ //        $this->getView()->assign("testcontent", "test hello");
Dispatcher::getInstance()->disableView(0);
echo 'Great,It Works!';
} } 8、视图文件模板: 默认模块的视图文件位于application/views下的对应文件目录中,而其他模块对应的视图文件位于模块各自的views文件目录中。




My first yaf app






随着PHP的发展, PHP框架层出不穷, 但到底用不用PHP框架, 还存在很大的争论, 反对者认为使用框架会降低性能, 经常举例的就是Zend Framework. 而支持者则认为,采用框架能提高开发效率, 损失点性能也是值得的.
而这些也正是公司内框架种类繁多的一个原因, 有的项目组为了性能而选择某些框架, 而另外一些项目组, 则为了更好的封装选择了另外的框架
那, 有没有俩全的办法呢? 也就是说, 有没有那么一个框架, 既不会有损性能, 又能提高开发效率呢.
Yaf, 就是为了这个目标而生的.
Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和Zend Framework的对比中, Yaf的性能是Zend Framework的50-60倍.



可以看出,Yaf框架一个最大的优势就是快,他是用C语言写的,和原生PHP一样,速度快,接近原生的PHP,如同作者而言,剑的三层境界:一是手中有剑,心中亦有剑;二是手中无剑,心中有剑;三是手中无剑,心中亦无剑,在和其他用PHP写的PHP框架来比的话, Yaf就是剑的第二层境界. 框架不在你手中, 而在PHP的”心”中.



官方文档对Yaf的优点做了以下总结




  1. 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销.

  2. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存.

  3. 更短的内存周转周期, 提高内存利用率, 降低内存占用率.

  4. 灵巧的自动加载. 支持全局和局部两种加载规则, 方便类库共享.

  5. 高性能的视图引擎.

  6. 高度灵活可扩展的框架, 支持自定义视图引擎, 支持插件, 支持自定义路由等等.

  7. 内建多种路由, 可以兼容目前常见的各种路由协议.

  8. 强大而又高度灵活的配置文件支持. 并支持缓存配置文件, 避免复杂的配置结构带来的性能损失.

  9. 在框架本身,对危险的操作习惯做了禁止.

  10. 更快的执行速度, 更少的内存占用


Category php