thinkphp5初体验,个人使用问题和优缺点

浏览:17175 发布日期:2015/12/12 分类:心情闲聊 关键字: th5 thinkphp5
昨天晚上发布了tp5 beta版本,终于来了心中想要的类型了,不想去搞大写目录的愿望终于实现了。但是,最终体验效果,却不如人意,不过是beta版嘛,可以等待,手册也是莫名奇妙。

个人感觉:tp5访问速度上和结构上,确实漂亮,过多的没有发现,大神们使用一下,给大家分享一下。
基本上3.2.3的能用的也能用,唯一蛋疼的就是:数据赋值模板问题,文档上写着/ 实例化视图类
$view = new Think\View();
$view->assign('name','ThinkPHP');
$view->assign('email','thinkphp@qq.com');
 // 或者批量赋值
$view->assign(['name'=>'ThinkPHP','email'=>'thinkphp@qq.com']);
 // 模板输出
$view->display();
我搞了一下,提示没有方法,一看源码,确实没有这个方法,这不是忽悠人?<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace think;

class View
{
    // 模板引擎实例
    protected $engine = null;
    // 模板主题名称
    protected $theme = '';
    // 模板变量
    protected $data = [];
    // 视图参数
    protected $config = [
        'theme_on'          => false,
        'auto_detect_theme' => false,
        'var_theme'         => 't',
        'default_theme'     => 'default',
        'http_cache_id'     => null,
        'view_path'         => '',
        'view_suffix'       => '.html',
        'view_depr'         => '/',
        'view_layer'        => VIEW_LAYER,
        'parse_str'         => [],
        'engine_type'       => 'think',
    ];

    public function __construct(array $config = [])
    {
        $this->config($config);
        $this->engine($this->config['engine_type']);
    }

    /**
     * 模板变量赋值
     * @access public
     * @param mixed $name  变量名
     * @param mixed $value 变量值
     */
    public function assign($name, $value = '')
    {
        if (is_array($name)) {
            $this->data = array_merge($this->data, $name);
            return $this;
        } else {
            $this->data[$name] = $value;
        }
    }

    /**
     * 设置视图参数
     * @access public
     * @param mixed $config 视图参数或者数组
     * @param string $value 值
     * @return View
     */
    public function config($config = '', $value = '')
    {
        if (is_array($config)) {
            foreach ($this->config as $key => $val) {
                if (isset($config[$key])) {
                    $this->config[$key] = $config[$key];
                }
            }
        } else {
            $this->config[$config] = $value;
        }
        return $this;
    }

    /**
     * 设置当前模板解析的引擎
     * @access public
     * @param string $engine 引擎名称
     * @param array $config 引擎参数
     * @return View
     */
    public function engine($engine, array $config = [])
    {
        $class        = '\\think\\view\\driver\\' . ucwords($engine);
        $this->engine = new $class($config);
        return $this;
    }

    /**
     * 设置当前输出的模板主题
     * @access public
     * @param  mixed $theme 主题名称
     * @return View
     */
    public function theme($theme)
    {
        if (true === $theme) {
            // 自动侦测
            $this->config['theme_on']          = true;
            $this->config['auto_detect_theme'] = true;
        } elseif (false === $theme) {
            // 关闭主题
            $this->config['theme_on'] = false;
        } else {
            // 指定模板主题
            $this->config['theme_on'] = true;
            $this->theme              = $theme;
        }
        return $this;
    }

    /**
     * 解析和获取模板内容 用于输出
     * @access public
     *
     * @param string $template 模板文件名或者内容
     * @param array  $vars     模板输出变量
     * @param string $cache_id 模板缓存标识
     * @param bool   $renderContent
     *
     * @return string
     * @throws Exception
     */
    public function fetch($template = '', $vars = [], $cache_id = '', $renderContent = false)
    {
        if (!$renderContent) {
            // 获取模板文件名
            $template = $this->parseTemplate($template);
            // 模板不存在 抛出异常
            if (!is_file($template)) {
                throw new Exception('template file not exists:' . $template, 10700);
            }
        }
        $vars = $vars ? $vars : $this->data;
        // 页面缓存
        ob_start();
        ob_implicit_flush(0);
        if ($this->engine) {
            // 指定模板引擎
            $this->engine->fetch($template, $vars, $cache_id);
        } else {
            // 原生PHP解析
            extract($vars, EXTR_OVERWRITE);
            is_file($template) ? include $template : eval('?>' . $template);
        }
        // 获取并清空缓存
        $content = ob_get_clean();
        // 允许用户自定义模板的字符串替换
        if (!empty($this->config['parse_str'])) {
            $replace = $this->config['parse_str'];
            $content = str_replace(array_keys($replace), array_values($replace), $content);
        }
        return $content;
    }

    /**
     * 渲染内容输出
     * @access public
     * @param string $content 内容
     * @param array  $vars    模板输出变量
     * @return mixed
     */
    public function show($content, $vars = [])
    {
        return $this->fetch($content, $vars, '', true);
    }

    /**
     * 自动定位模板文件
     * @access private
     * @param string $template 模板文件规则
     * @return string
     */
    private function parseTemplate($template)
    {
        if (is_file($template)) {
            return $template;
        }
        $depr     = $this->config['view_depr'];
        $template = str_replace(':', $depr, $template);

        // 获取当前模块
        $module = MODULE_NAME;
        if (strpos($template, '@')) {
            // 跨模块调用模版文件
            list($module, $template) = explode('@', $template);
        }
        // 获取当前主题的模版路径
        defined('THEME_PATH') || define('THEME_PATH', $this->getThemePath($module));

        // 分析模板文件规则
        if ('' == $template) {
            // 如果模板文件名为空 按照默认规则定位
            $template = CONTROLLER_NAME . $depr . ACTION_NAME;
        } elseif (false === strpos($template, $depr)) {
            $template = CONTROLLER_NAME . $depr . $template;
        }
        return THEME_PATH . $template . $this->config['view_suffix'];
    }

    /**
     * 获取当前的模板主题
     * @access private
     * @return string
     */
    private function getTemplateTheme($module)
    {
        if ($this->config['theme_on']) {
            if ($this->theme) {
                // 指定模板主题
                $theme = $this->theme;
            } elseif ($this->config['auto_detect_theme']) {
                // 自动侦测模板主题
                $t = $this->config['var_theme'];
                if (isset($_GET[$t])) {
                    $theme = $_GET[$t];
                } elseif (Cookie::get('think_theme')) {
                    $theme = Cookie::get('think_theme');
                }
                if (!is_dir(APP_PATH . $module . '/' . $this->config['view_layer'] . '/' . $theme)) {
                    $theme = $this->config['default_theme'];
                }
                Cookie::set('think_theme', $theme, 864000);
            } else {
                $theme = $this->config['default_theme'];
            }
            return $theme . '/';
        }
        return '';
    }

    /**
     * 获取当前的模板路径
     * @access protected
     * @param  string $module 模块名
     * @return string
     */
    protected function getThemePath($module = MODULE_NAME)
    {
        // 获取当前主题名称
        $theme = $this->getTemplateTheme($module);
        // 获取当前主题的模版路径
        $tmplPath = $this->config['view_path']; // 模块设置独立的视图目录
        if (!$tmplPath) {
            // 定义TMPL_PATH 则改变全局的视图目录到模块之外
            $tmplPath = defined('TMPL_PATH') ? TMPL_PATH . $module . '/' : APP_PATH . $module . '/' . $this->config['view_layer'] . '/';
        }
        return $tmplPath . $theme;
    }

}
最佳答案
评论( 相关
后面还有条评论,点击查看>>