智者一切求自己,愚者一切求他人 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

Yaf项目实战开发之第一天配置及扩展model

Yaf/Yar学习笔记 memory 发布于December 12, 2016 标签: PHP, Yaf

前几天装上了Yaf框架,折腾了一通,发现还不错哟!!!哈哈,于是乎准备用它折腾个小项目玩玩!!
因为yaf不带有model层的操作,这儿需要自己扩展,在此记录一下
application.ini

[common]
application.directory = APPLICATION_PATH  "/application"
application.ext       = "php"     ;php脚本后缀名
application.view.ext  = "html"      ;视图模板的后缀名
application.bootstrap = APPLICATION_PATH  "/application/Bootstrap.php"  ;Boostrap路径
application.library   = APPLICATION_PATH "/application/library" ;类库的绝对目录地址
application.dispatcher.defaultModule = "index" ;默认模型
application.dispatcher.defaultController = "index" ;默认控制器
application.dispatcher.defaultAction = "index" ;默认的动作
application.modules = Index,Api,Admin

;路由配置
routes.regex.type="regex"
routes.regex.match="#^/list/([a-z]+)[-]?(\d+)?(\.html)?$#"
routes.regex.route.controller=Index
routes.regex.route.action=page
routes.regex.map.1=page
routes.regex.map.2=page

;database config 数据库配置

database.db_driver = "mysqli"  ;选择不同的数据库DB 引擎,一般默认mysqli,或者mysql,pdo
;主库配置
database.default.db_type   = 1 ;0-单个服务器,1-读写分离,2-随机
database.default.0.host = 127.0.0.1
database.default.0.username = "root"
database.default.0.password = ""
database.default.0.database = "lvtao"
database.default.0.charset = "utf8"  ;数据库编码
database.default.0.pconnect = 0   ;是否持久链接
;从库配置
database.default.1.host = 127.0.0.1
database.default.1.username = "root"
database.default.1.password = ""
database.default.1.database = "lvtao"
database.default.1.charset = "utf8"  ;数据库编码
database.default.1.pconnect = 0   ;是否持久链接

;缓存memcache配置
memcache.0.host=127.0.0.1
memcache.0.port=11211
memcache.1.host=127.0.0.1
memcache.1.port=11211

;NoSQL
mongo.default.server     = 127.0.0.1
mongo.default.port       = 27017
mongo.default.option.connect = true
mongo.default.db_name    = "test"
mongo.default.username   = ""
mongo.default.password   = ""

redis.default.server     = 127.0.0.1
redis.default.port       = 6379

;开发环境
[develop : common]
application.showErrors = 1
application.throwException = 1
application.dispatcher.catchException = 1

;生产环境
[product : common]
application.showErrors = 0
application.throwException = 0

以上为我本地测试配置,其中数据库相关的部分因为准备采用InitPHP的类库,所以也按它的conf方式来配置

然后是 Bootstrap.php

class Bootstrap extends Yaf_Bootstrap_Abstract{
    private $_config;
    private $_request;
    public function _initConfig() {
        $this->_config = Yaf_Application::app()->getConfig();
        $this->_request =Yaf_Dispatcher::getInstance()->getRequest();
        Yaf_Registry::set('config',$this->_config);
        define('APP_PATH',$this->_config->application->directory);
        define('DATA_PATH',dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'data');
        define('UP_PATH',dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'upload');
    }

    public function _initPlugin(Yaf_Dispatcher $dispatcher) {

    }

    public function _initRoute(Yaf_Dispatcher $dispatcher) {
        $router = Yaf_Dispatcher::getInstance()->getRouter();
        $router->addConfig($this->_config->routes);
    }

    public function _initSession(Yaf_Dispatcher $dispatcher){
        Yaf_Session::getInstance()->start();
    }
    //注册自定义方法
    public function _initFunctions(){
        Yaf_Loader::import('Functions.php');
    }
}

接着我们在library目录下添加相关文件,
添加公用方法库 以下很多方法来自InitPHP框架,有兴趣可以去InitPHP官网阅读源码,在此特别对小朱同志表示感谢。
Functions.php

/***安全相关函数***/
/**
 * 安全过滤类-全局变量过滤
 * 在Controller初始化的时候已经运行过该变量,对全局变量进行处理
 * 使用方法:filter()
 * @return
 */
function filter() {
    if (is_array($_SERVER)) {
        foreach ($_SERVER as $k => $v) {
            if (isset($_SERVER[$k])) {
                $_SERVER[$k] = str_replace(array('<','>','"',"'",'%3C','%3E','%22','%27','%3c','%3e'), '', $v);
            }
        }
    }
    unset($_ENV, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_ENV_VARS);
    filter_slashes($_GET);
    filter_slashes($_POST);
    filter_slashes($_COOKIE);
    filter_slashes($_FILES);
    filter_slashes($_REQUEST);
}

/**
 * 安全过滤类-加反斜杠,放置SQL注入
 * 使用方法:filter_slashes(&$value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_slashes(&$value) {
    if (get_magic_quotes_gpc()) return false; //开启魔术变量
    $value = (array) $value;
    foreach ($value as $key => $val) {
        if (is_array($val)) {
            filter_slashes($value[$key]);
        } else {
            $value[$key] = addslashes($val);
        }
    }
}

/**
 * 安全过滤类-通用数据过滤
 * 使用方法:filter_escape($value)
 * @param string $value 需要过滤的变量
 * @return string|array
 */
function filter_escape($value) {
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            $value[$k] = filter_str($v);
        }
    } else {
        $value = filter_str($value);
    }
    return $value;
}

/**
 * 安全过滤类-字符串过滤 过滤特殊有危害字符
 * 使用方法:filter_str($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_str($value) {
    $value = str_replace(array("\0","%00","\r"), '', $value);
    $value = preg_replace(array('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/','/&(?!(#[0-9]+|[a-z]+);)/is'), array('', '&amp;'), $value);
    $value = str_replace(array("%3C",'<'), '&lt;', $value);
    $value = str_replace(array("%3E",'>'), '&gt;', $value);
    $value = str_replace(array('"',"'","\t",'  '), array('&quot;','&#39;','    ','&nbsp;&nbsp;'), $value);
    return $value;
}

/**
 * 安全过滤类-过滤javascript,css,iframes,object等不安全参数 过滤级别高
 * 使用方法:filter_script($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_script($value) {
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            $value[$k] = filter_script($v);
        }
        return $value;
    } else {
        $parten = array(
            "/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dblclick|move|reset|resize|submit)/i",
            "/<script(.*?)>(.*?)<\/script>/si",
            "/<iframe(.*?)>(.*?)<\/iframe>/si",
            "/<object.+<\/object>/isU"
        );
        $replace = array("\\2", "", "", "");
        $value = preg_replace($parten, $replace, $value, -1, $count);
        if ($count > 0) {
            $value = filter_script($value);
        }
        return $value;
    }
}

/**
 * 安全过滤类-过滤HTML标签
 * 使用方法:filter_html($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_html($value) {
    if (function_exists('htmlspecialchars')) return htmlspecialchars($value);
    return str_replace(array("&", '"', "'", "<", ">"), array("&amp;", "&quot;", "&#039;", "&lt;", "&gt;"), $value);
}

/**
 * 安全过滤类-对进入的数据加下划线 防止SQL注入
 * 使用方法:filter_sql($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_sql($value) {
    $sql = array("select", 'insert', "update", "delete", "\'", "\/\*",
        "\.\.\/", "\.\/", "union", "into", "load_file", "outfile");
    $sql_re = array("","","","","","","","","","","","");
    return str_replace($sql, $sql_re, $value);
}

/**
 * 私有路径安全转化
 * 使用方法:filter_dir($fileName)
 * @param string $fileName
 * @return string
 */
function filter_dir($fileName) {
    $tmpname = strtolower($fileName);
    $temp = array('://',"\0", "..");
    if (str_replace($temp, '', $tmpname) !== $tmpname) {
        return false;
    }
    return $fileName;
}

/**
 * 过滤目录
 * 使用方法:filter_path($path)
 * @param string $path
 * @return array
 */
function filter_path($path) {
    $path = str_replace(array("'",'#','=','`','$','%','&',';'), '', $path);
    return rtrim(preg_replace('/(\/){2,}|(\\\){1,}/', '/', $path), '/');
}

/**
 * 过滤PHP标签
 * 使用方法:filter_phptag($string)
 * @param string $string
 * @return string
 */
function filter_phptag($string) {
    return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $string);
}

/**
 * 安全过滤类-返回函数
 * 使用方法:str_out($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function str_out($value) {
    $badstr = array("&", '"', "'", "<", ">", "%3C", "%3E");
    $newstr = array("&amp;", "&quot;", "&#039;", "&lt;", "&gt;", "&lt;", "&gt;");
    $value  = str_replace($newstr, $badstr, $value);
    return stripslashes($value); //下划线
}

添加Controller.php 用作公用的Controller,继承Yaf_Controller_Abstract
Controller.php 以下中引入的cache、db、nosql均为InitPHP框架中的dao层操作类,我个人对小朱的这个框架使用较多,毕竟习惯了嘛,哈哈。。。

<?php
class Controller extends Yaf_Controller_Abstract {

    public function init(){
        $this->_session=Yaf_Session::getInstance();
        filter(); //安全过滤
    }
}

添加Model.php 用于Models中数据库相关操作

<?php
class Model{
    public $db = NULL;
    public $cache = NULL;
    public $nosql = NULL;

    final public function __construct(){
        //初始化数据库类并注册
        $this->run_db();
        //初始化缓存类并注册
        $this->run_cache();
        //初始化NOSQL类并注册
        $this->run_nosql();
    }
    /**
     * 运行数据库
     */
    public function run_db() {
        if ($this->db == NULL) {
            Yaf_Loader::import('db/db.init.php');
            $this->db = new dbInit();
            $this->db->init_db('');
        }
        return $this->db;
    }
    
    /**
     * 运行缓存模型
     */
    public function run_cache() {
        if ($this->cache == NULL) {
            Yaf_Loader::import('cache/cache.init.php');
            $this->cache = new cacheInit();
            $this->cache->db_handle = $this->db; //db对象,MYSQL缓存中需要用到
        }
        return $this->cache;
    }
    
    /**
     * 运行nosql
     * $this->getNosql()
     */
    public function run_nosql() {
        if ($this->nosql == NULL) {
            Yaf_Loader::import('nosql/nosql.init.php');
            $this->nosql = new nosqlInit();
        }
        return $this->nosql;
    }
     
}

这个使用也就非常简单啦
例如:models/user.php

<?php
class userModel extends Model {  //继承它

   public function getUser(){

     return $s1= $this->cache->get('test','MEM');  //这我就可以像InitPHP中一样使用$this->db  $this->cache   $this->nosql 啦~~~啦~~~啦~~~

   }

}

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1324篇
  • 用户评论:697条
  • 开博至今:3998天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • tomxuetao: 能个实例吗?
  • memory: 哈哈哈。。。话说也没毛病。
  • 硫酸亚铁: 看了文章觉得自己已经是松鼠癌了 东西总是先占着 反正我有 什么...
  • xl: 支持一下
  • iHerb海淘攻略: 感谢分享
  • memory: POINT
  • sunyunlin: 数据库应该建些什么字段?
  • pengcheng: 已解决
  • pengcheng: Oops! It seems that sphinx was b...
  • 券都有: 感谢分享
  • memory: 这是我3年前玩过一次,当时因为安装完后,发现日常办公还好,但是好...
  • sdf: 想问一下,激活工具激活后,后面会出现提示要再次重新激活吗?
  • memory: 你要用碗装我吗?还是要我把扔的扔进你碗里???!!! &^_^&
  • 薛才杰: 同感,快扔到我的碗里来。。。
  • memory: 要说明一下,在大陆及香港的云主机或VPS,都是不支持的。原因都懂...
  • 历史趣谈LishiQtan: 很好的文章,值得收藏
  • memory: 现在回头看,,,这么烂的代码,也是醉了.