yaf-example

蒋子宁
• 阅读 6305

yaf是鸟哥用C语言编写的一个PHP框架,yaf文档地址:http://yaf.laruence.com/manual/

其实很早之前就接触yaf了,但只是学习学习,没有深入的去了解和使用,但由于最近在重构一个项目,而重构所用到的框架就是yaf框架,正好趁此机会好好地使用了下yaf框架。本篇文章其实主要给一个yaf的例子,就是扩展了下yaf,因为yaf的东西本身就简单,所以快。鸟哥也给了两个例子,laruence/yaf-examples,一个是在yaf里使用Smarty的例子,还有一个是在yaf里加了DB和Log操作的包的例子。我给的yaf例子地址是:https://github.com/jsyzchen/chen-yaf

配置

首先,你得安装yaf,文档里有,http://php.net/manual/zh/yaf.installation.php
安装完之后,编辑php.ini文件,配置yaf:

extension=yaf.so
yaf.use_namespace=1 ;开启命名空间
yaf.use_spl_autoload=1 ;开启自动加载

chen-yaf主要添加了:

先编辑conf/application.ini文件

[common]
application.directory = APP_PATH  "/application"
application.view.ext = "html"
application.view.engine = "twig"

;user
user.default_filter = 'trim,addslashes,htmlspecialchars'

[product : common]
;twig
twig.cache = APP_PATH "/storage/twig/cache"

;database
database.driver = 'mysql'
database.read.host = '127.0.0.1'
database.write.host = '127.0.0.1'
database.port = '3306'
database.database = 'test'
database.username = 'root'
database.password = '123456'
database.charset = 'utf8'
database.collation = 'utf8_unicode_ci'
database.prefix = ''
database.strict = false

[develop : common]
application.dispatcher.catchException = TRUE

;twig
twig.debug = true

;socketlog
socketlog.enable = true
socketlog.host = 'localhost'
socketlog.optimize = true
socketlog.show_included_files = true
socketlog.error_handler = true
socketlog.force_client_ids = ''
socketlog.allow_client_ids = 'slog_78de03'

;database
database.driver = 'mysql'
database.host = '127.0.0.1'
database.port = '3306'
database.database = 'test'
database.username = 'root'
database.password = '123456'
database.charset = 'utf8'
database.collation = 'utf8_unicode_ci'
database.prefix = ''
database.strict = false

database为MySql数据库的配置,socketlog为socketlog的配置,twig为twig模板引擎的配置

因为chen-yaf使用的是composer包,首先你得安装composer,然后在项目目录下建一个composer.json文件,内容如下:

{
    "require": {
        "php": ">=5.5.9",
        "illuminate/database": "5.1.*",
        "illuminate/events": "5.1.*",
        "symfony/debug": "2.6.*",
        "symfony/var-dumper": "2.6.*",
        "twig/twig": "^1.26"
    },
  
    "autoload": {
      "psr-4": {
        "App\\Models\\": "application/models"
      }
    }
}

然后记得

composer install  

编辑Bootstrap.php文件

/**
 * 加载vendor下的文件
 */
public function _initLoader()
{
    \Yaf\Loader::import(APP_PATH . '/vendor/autoload.php');
}

/**
 * 配置
 */
public function _initConfig()
{
    $this->config = \Yaf\Application::app()->getConfig();//把配置保存起来
    \Yaf\Registry::set('config', $this->config);
}

Eloquent ORM

Eloquent ORM是Laravel框架里的ORM。

yaf里是没有数据库操作类的,可以自己写一个DAO层,或者直接使用第三方包,推荐MedooEloquent ORM,chen-yaf里面是使用的Eloquent ORM
编辑Bootstrap.php文件,添加_initDefaultDbAdapter方法

/**
 * 初始化数据库分发器
 * @function _initDefaultDbAdapter
 * @author   jsyzchenchen@gmail.com
 */
public function _initDefaultDbAdapter()
{
    //初始化 illuminate/database
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($this->config->database->toArray());
    $capsule->setEventDispatcher(new \Illuminate\Events\Dispatcher(new \Illuminate\Container\Container));
    $capsule->setAsGlobal();
    //开启Eloquent ORM
    $capsule->bootEloquent();

    class_alias('\Illuminate\Database\Capsule\Manager', 'DB');
}

然后在application/model下建一个Model基类,EloquentModel.php

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class EloquentModel extends Model
{

}

然后所有的Model类都继承EloquentModel,这样就可以像在Laravel里操作数据库了,另外DB也是能使用的,和Laravel里的DB facade使用方法一样。文档:https://laravel-china.org/docs/5.1/eloquent , https://laravel-china.org/docs/5.1/database

twig

twig是Symfony框架里的模板引擎,当然它也可以单独使用。模板引擎也可以使用Smarty,如果你想拥有页面缓存的功能,请用Smarty。

编辑Bootstrap.php文件,添加_initTwig方法

/**
 * Twig View
 * @param \Yaf\Dispatcher $dispatcher
 */
public function _initTwig(\Yaf\Dispatcher $dispatcher)
{
    $twig = new \Twig\Adapter(APP_PATH . "/application/views/", $this->config->get("twig")->toArray());
    $dispatcher->setView($twig);
}

这样就可以在html文件里使用twig模板引擎了

SocketLog

SocketLog是ThinkPHP框架核心开发者“罗飞”开发的一个调试的工具,使用过ThinkPHP5框架的应该很熟悉。更多的介绍可以阅读我的另一篇文章:日志服务

我把SocketLog相关的文件放在library/Common/Logger目录下了,当你安装完SocketLog并配置好,在Bootstrap.php添加_initLogger方法。

/**
 * 日志
 * @param \Yaf\Dispatcher $dispatcher
 */
public function _initLogger(\Yaf\Dispatcher $dispatcher)
{
    //SocketLog
    if (Yaf\ENVIRON === 'develop') {
        if ($this->config->socketlog->enable) {
            //载入
            \Yaf\Loader::import('Common/Logger/slog.function.php');
            //配置SocketLog
            slog($this->config->socketlog->toArray(),'config');
        }
    }
}

然后就可以在Chrome里调试你的代码了。

其他

chen-yaf引入了一些函数,放在library/Common/functions.php里了,都是一些常用的函数,如果你的项目中有其他的函数往里面加就行了。编辑Bootstrap.php,添加_initFunction方法。

/**
 * 公用函数载入
 */
public function _initFunction()
{
    \Yaf\Loader::import('Common/functions.php');
}

总结

chen-yaf只是一个很简单的yaf例子,加了Eloquent ORM和twig。实际项目中,还需要不断地往里面添加东西。既然我们使用了composer包,那么我们在做自己的项目时就可以很方便的使用第三方包,避免我们重复造轮子。
推荐一些第三方包吧,也是我们在重构项目里所用到的。
1.carbon:对于时间日期的操作。
2.php-resque:队列的操作。
3.sokil/php-mongo:mongodb的操作。
4.monolog:日志的操作。

为了更好的交流,可以加QQ群:415183844

码字不容易,转载请注明原地址,Jsyz Chen的博客:http://jsyzchen.com/2016/10/22/yaf-example/ 谢谢!

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这