用脑思考,用心琢磨,用行动证实 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

Yaf系列使用之CMS系统基础搭建

Yaf/Yar学习笔记 memory 发布于January 17, 2018 标签: PHP, Yaf

此文仅适合有一定基础的朋友看看.

说是CMS,其实最初想做的是个小论坛,然后又变成了一个文章管理,与其说是CMS,不如说是个小新闻系统或企业站撒的,话虽这么说,我也是假装客气客气。咱先写个小的,思路有了,再想其它的...所以你现在就当我们在用Yaf写一个小企业站

Yaf的优势不多说啦,我在搭建系统的时候,因为不是为了做一个小站,所以比较折腾,当然如果你只是用它写个小站,也没必要折腾Yaf了不是。

至于Yaf的环境配置撒的一些基础的,可以看我之前博客,然后就是使用中不明白的还是多看看鸟哥的官方文档。还是那句话,我写的只是我现在用的。。。甚至可能不是最优方案。我们就当入门

目录结构

app   //应用目录
cache //缓存目录
conf  //配置文件
www   //前台目录

在www目录下创建index.php

<?php
header('Content-Type:text/html;charset=utf-8');
define('APPLICATION_PATH', dirname(__DIR__));
$application = new Yaf_Application(APPLICATION_PATH . "/conf/application.ini", "devel"); //pro devel
$application->bootstrap()->run();

在conf下创建配置文件application.ini

[common]
application.directory = APPLICATION_PATH  "/app"
application.bootstrap = APPLICATION_PATH "/app/Bootstrap.php"  ;Boostrap路径
application.library   = APPLICATION_PATH "/app/library" ;类库的绝对目录地址
application.dispatcher.defaultModule     = "index" ;默认模型
application.dispatcher.defaultController = "index" ;默认控制器
application.dispatcher.defaultAction     = "index" ;默认的动作
application.modules = Index

;全局配置
wwwurl    = 'http://www.lvtao.net/'
staticurl = 'http://www.lvtao.net/static/'
dataurl   = 'http://www.lvtao.net/data/'
taocms    = 'TaoCMS'
version   = '1.0.1'

;上传配置
upload.images.max = 1024      ;1M
upload.file.max   = 102400    ;100M
upload.video.max  = 1024000   ;1G
upload.audio.max  = 102400    ;100M

;缓存配置
cache.type = 'file'
memcache.0.host = 127.0.0.1
memcache.0.port = 11211

medoo.type = mysql
medoo.log  = true
medoo.mysql.server   = 127.0.0.1
medoo.mysql.port     = 3306
medoo.mysql.name     = demo
medoo.mysql.username = memory
medoo.mysql.password = 1233211234567
medoo.mysql.charset  = utf8
medoo.mysql.prefix   = lt_

[routes]
routes.help.type = "regex"
routes.help.match = "#^/help/([a-z-_]+)?$#"
routes.help.route.controller = Index
routes.help.route.action = help
routes.help.map.1 = route

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

;生产环境
[pro : common : routes]
application.showErrors = 0

在app目录下创建Bootstrap.php

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract
{
    private $_config;

    /**
     * @access public
     * @return void
     */
    public function _initBootstrap()
    {
        date_default_timezone_set('PRC');
        $this->_config = Yaf_Application::app()->getConfig();
        Yaf_Registry::set('config', $this->_config);
        define('APP_PATH', $this->_config->application->directory);
        define('DS', DIRECTORY_SEPARATOR);
        define('DATA_PATH', APPLICATION_PATH . DS . 'data');
        define('CACHE_PATH', APPLICATION_PATH . DS . 'cache');
        define('TaoCMS',  $this->_config->taocms);
        define('VERSION', $this->_config->version);

        define('WWW_URL', $this->_config->wwwurl);//主域名
        define('STATIC_URL', $this->_config->staticurl);//静态资源域名
        define('DATA_URL', $this->_config->dataurl);//附件域名
        define('CACHE', $this->_config->cache->type);//缓存方式
    }

    /**
     * @param Yaf_Dispatcher $dispatcher
     *
     * @access public
     * @return void
     */
    public function _initRoute(Yaf_Dispatcher $dispatcher)
    {
        $router = $dispatcher->getRouter();
        $router->addConfig(Yaf_Registry::get("config")->routes);
    }

    /**
     * @param Yaf_Dispatcher $dispatcher
     *
     * @access public
     * @return void
     */
    public function _initSession(Yaf_Dispatcher $dispatcher)
    {
        Yaf_Session::getInstance()->start();
    }

    /**
     * @param Yaf_Dispatcher $dispatcher
     *
     * @access public
     * @return void
     */
    public function _initFunctions(Yaf_Dispatcher $dispatcher)
    {
        Yaf_Loader::import('Functions.php');
    }

    /**
     * @param Yaf_Dispatcher $dispatcher
     *
     * @access public
     * @return void
     */
    public function _initDB(Yaf_Dispatcher $dispatcher)
    {
        Yaf_Loader::import('db/Medoo.php');
        $db = $database = new \Medoo\Medoo([
            'database_type' => $this->_config->medoo->type,
            'database_name' => $this->_config->medoo->mysql->name,
            'server'        => $this->_config->medoo->mysql->server,
            'username'      => $this->_config->medoo->mysql->username,
            'password'      => $this->_config->medoo->mysql->password,
            'charset'       => $this->_config->medoo->mysql->charset,
            'port'          => $this->_config->medoo->mysql->port,
            'prefix'        => $this->_config->medoo->mysql->prefix,
            'logging'       => $this->_config->medoo->log,
            'option'        => [PDO::ATTR_CASE => PDO::CASE_NATURAL],
        ]);
        Yaf_Registry::set('_db', $db);

        Yaf_Loader::import('cache/cache.php');
        $cache= new cache();
        Yaf_Registry::set('_cache', $cache);
    }

}

到这儿基本的配置完了。

然后我们开始写一个必要的文件
例如/app/library目录下,创建functions.php,里面放一些你常用的公共方法
/app/library目录下,创建Controller.php,做公共的Controller继承对象

<?php
class Controller extends Yaf_Controller_Abstract
{
    protected $_session;        //session
    protected $_config;         //配置文件
    protected $_controller;     //类名
    protected $_module;         //模型
    protected $_action;         //类方法
    protected $_cache;          //缓存
    private static $instance = array();

    public function init()
    {
        $this->_session = Yaf_Session::getInstance();
        $this->_session->start();
        $this->_config  = Yaf_Registry::get('config');
        $this->_cache   = Yaf_Registry::get('cache');

        $this->_module     = strtolower($this->_module);
        $this->_controller = strtolower($this->_request->controller);
        $this->_action     = strtolower($this->_request->action);

        //对所有的Controller中的请求进行过滤
        filter(); //在Functions.php中定义一个过滤方法
    }

    /**
     * $_FILE 上传
     * $upinfo = $this->upload('images', tradeNo(), $path);
     *
     * @param $type
     * @param $name
     * @param $path
     *
     * @return array
     */
    protected function upload($type = 'images', $name, $path = '')
    {
        $upload = $this->uploadInstance();
        //开始上传类的调用 ......
    }

    protected function assign($key, $value)
    {
        $this->getView()->$key = $value;
    }

    private function uploadInstance()
    {
        if(@self::$instance['upload'] == null)
        {
            Yaf_Loader::import('lib/upload.php');
            self::$instance['upload'] = new upload();
        }
        return self::$instance['upload'];
    }
}

有了这个文件,在app/controllers目录下,创建的控制文件,就可以直接继承这个类啦
例如/app/controllers/Index.php

<?php
class IndexController extends Controller
{
    public function indexAction()
    {

    }
}

至于权限或其它的想法,可以通过这个类去扩展啦,比如我将上传写在了公共的Controller文件中,在其它控制文件中直接$this->upload()就可以了...

现在我们来写app/library下的Model.php
此文件的作用是Model层用来继承它的.

<?php
class Model extends Yaf_Bootstrap_Abstract
{
    protected      $db;
    protected      $cache;
    protected      $_config;
    protected      $_session;
    private static $instance = array();

    public function __construct()
    {
        $this->cache    = $this->CACHE();
        $this->db       = $this->DB();
        $this->_config  = Yaf_Registry::get('config');
        $this->_session = Yaf_Session::getInstance();
    }

    protected function DB()
    {
        if(@self::$instance['db'] == null)
        {
            self::$instance['db'] = Yaf_Registry::get('_db');
        }
        return self::$instance['db'];
    }

    protected function CACHE()
    {
        if(@self::$instance['cache'] == null)
        {
            self::$instance['cache'] = Yaf_Registry::get('_cache');
        }
        return self::$instance['cache'];
    }
}

然后我们在app/library下建立cachedb目录,用来存放Bootstrap.php中指定的medoocache类文件

db目录下的Medoo.php,具体文件可以在官方下载,使用参考中文手册
cache目录下,建立cache.php文件,在此文件中实现文件缓存和Memcached缓存的工厂方法即可。

然后在app/library下建议lib文件夹,用来放常用类,比如上面Controller.php提到的upload.php文件类
上传类就是普通的,大家自己折腾。

模板文件中,我配置了一个common目录,是为了放公共头部和底部,在视图文件中,不要使用include加载,使用yaf提供的Yaf_View_Simple::render来加载渲染即可.
例如views/index/index.phtml

<?php echo Yaf_View_Simple::render('common/header.phtml'); ?>
首页的模板啦...
<?php echo Yaf_View_Simple::render('common/footer.phtml'); ?>

最终项目的目录和文件如下了

相关推荐

添加新评论

全部评论:已有 4 条评论

  1. 小小

    博主 ,可有写好的

    1. memory

      有内部使用的,开源的过段时间放个出来。

  2. 亚克力浴缸

    看晕了,头大

    1. memory

      哈哈。写的太2了,将就着吧。我自己看也晕了...

网站状态

  • 栏目分类:49个
  • 发布文章:1534篇
  • 用户评论:751条
  • 开博至今:4127天

正则速查

[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 只匹配最近的一个字符串;不重复匹配

最新回复

  • hyvm.net: 好文章,点赞
  • 新闻头条: 文章不错非常喜欢
  • 志志: 折腾了半天 感谢大神
  • Smithk464: Hey very nice blog!! Man .. Exce...
  • memory: 我已投奔phpstrom.哈哈
  • 逆风飘扬: 原来是这样!!!!!!!用惯了VS的来用zend studio没...
  • NS: 请问我这么写之后抛出了一个 javax.crypto.BadPa...
  • memory: 有内部使用的,开源的过段时间放个出来。
  • 小小: 博主 ,可有写好的
  • 111: 我看不懂唉,好多内容
  • memory: 咧,难道我手误了,回头看下官方文档去...
  • 阿东: 进入镜像的 后面 /bin/bash 是错的 你应该用的是/b...
  • memory: 帝国的安全性来说,比phpcms和dede要好的多啦.
  • 西点师培训班: 现在帝国用的少了,开源的不太会改,老被黑
  • yiyiyizoe: 谢谢~
  • memory: 不好意思呀,这个也是13年的时候,安装过淘宝的这个开源系统,做的...
  • yiyiyizoe: 实在抱歉,如果可以回答的话,只需要看这个问题:ldb支持批量导入...