从今日起开始我thinkphp5.0rc4个人使用总结之旅001------自动生成应用目录及相应文件

学习php时间较长,有近一年了,期间做了四个项目,有两个已上线运行,包括两个采用appcan打包的app安卓应用。当修改完各种bug递交给客户时,不得不说我是有些欣喜的,然而,仅过几天,又开始限于低落的情绪。原因是感觉自己的项目写得比较烂,一开始没有跟客户进行充分的沟通,导致客户一而再、再而三的反复提出需求,当然也有自己考虑不周到产生的各种bug。另一个原因就是没有合理分离数据处理和业务逻辑处理,将二者都放在控制器进行,导致后期修改时,查阅代码十分不便(幸亏从头到尾都是我一人写的,十分熟悉!否则,一个控制器近一千行的代码改起来确实费劲!)此后几周,则进入IOS学习ing。前两天同事问我有关tp用那个版本框架好,我随口说了一句tp5.0,这个是重构的版本,据说性能有大幅提高,采用了惰性加载技术。于是,他就下了一个版本,但他发现并不能很好上手。于是找我去给看看,我也是好几月前偶尔看过介绍,仅知道目录结构,测试过控制器而已。当我看他报错时,报的是找不到控制器,于是我居然改了3-4分钟也没改好,其它同事催着吃中饭,只好作罢。吃饭那会功夫,翻开手机看了一下tp5.0的手册,回去才给他改好。当时那个出糗啊!

这之后,也一直忙于IOS学习中,boolean类型我在php中居然无脑的打成YES或者NO,我擦。。。。。这个啊!

今早,起得早,想起这事,觉得当初tp3.2.2自己都没怎么掌握好,仅是会用而已。莫不如学习这个类似lavarel风格的全新架构的tp5,于是下了一个版本,居然到rc4了。官网说距离正式发行不远了。我这想,这必须掌握先机啊。痛定思痛,决定在这个好久不上的csdn上开博客吧!作为自己成长的见证!废话不多说了,直接上代码

define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';


###################  1 ####################注意,该段代码必须位于require __DIR__ . '/../thinkphp/start.php';下,因为需要加载think的Build类

 // 自动生成admin模块
// \think\Build::module('admin');


###################  2 ####################注意事项同上

// 读取自动生成定义文件
$build = require '../build.php';
// 运行自动生成
\think\Build::run($build,'app',false);

这个 是tp5.o的入口文件的内容,井号下面都是我参考手册加的内容。

#1的地方是为应用增加一个admin模块。 

#2的地方是在bulid.php文件形成一个文档结构,然后再首次运行时自动给你生成,注意:如果该目录或文件已存在,系统则会跳过,默认的并不会覆盖!

我的build.php文件内容如下:

return [
    // 生成应用公共文件
    '__file__' => ['common.php', 'config.php', 'database.php'],


    // 定义demo模块的自动生成 (按照实际定义的文件名生成)
    'index'     => [
        '__file__'   => ['common.php'],
        '__dir__'    => ['behavior', 'controller', 'model', 'view'],
        'controller' => ['Index', 'Test', 'UserType'],
        'model'      => ['User', 'UserType'],
        'view'       => ['index/index'],
    ],
    // 其他更多的模块定义
    'user'      =>  [
        '__file__'  =>  ['common.php','functions.php','config.php','route.php','.htaccess'],
        '__dir__'   =>  ['behavior','controller','model','view','data','logic'],
        'controller' => ['Index', 'Test', 'UserType'],
        'model'     =>  ['User','UserType','UserGroup'],
        'view'      =>  ['Index/user','UserType/userType','UserGroup/userGroup'],
    ],
];

该文件位于应用的根目录,你可以将它移至application下,仅需修改入口文件$build = require APP_PATH.DS.'build.php';即可。

然后在浏览器输入localhost/thinkphp5.0rc4/public即可运行。加上public原因是tp5.0的入口文件默认位于应用根目录下的public文件夹内。

完整的访问地址是:localhost/thinkphp5.0rc4/public/index.php/index/index/index.html,看到这里有没有很熟悉?index.php/index/index/index.html,哈哈!

接着再来访问:http://localhost/thinkphp5.0rc4/public/index.php/user/index/index.html,运行看看,什么?报找不到模板错误?那是必须的啊,之前build.php的view目录是Index/user嘛!我们去应用根目录下的application目录,进入user模块,进入controller控制器目录打开Index.php,删掉系统自动生成的 return 一堆字符串。整个文件改成如下:

<?php
namespace app\user\controller;

class Index
{
    public function index(){
    $view = new \think\View();
    return $view->fetch('user');
    }
}

ctrl+s保存,再刷新刚才的url,看,是不是一个空白页出来了?

我们再来看看tp5.0手册给出的自动生成目录样例

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
// 读取自动生成定义文件
$build = include 'build.php';
// 运行自动生成
\think\Build::run($build,'application',true);
如果你直接复制拿过来运行(前提是不修改原有目录结构),你将会遇到两种错误!

1.找不到build.php文件.为什么?因为默认的build.php位于框架根目录下,即是index.php的父级目录。

因此,因该改成:  $build = include '../build.php';

2.访问http://localhost/thinkphp5.0rc4/public/index.php/user/index/index.html,找不到控制器。即便是你修改成http://localhost/thinkphp5.0rc4/public/index.php/user/indexController/index.html依然找不到控制器,为什么?

因为系统加载应用配置文件application/config.php默认的命名空间是

// 应用命名空间
    'app_namespace'          => 'app',

而你build的时候是‘application’,系统默认application目录下所有控制器的命名空间皆为app而不是application,

所以,要么,你将框架自带的控制器、model文件的命名空间手动改为application,要么就删掉刚才所建的目录和文件,改入口文件的build::run参数

\think\Build::run($build,'app',false);
最后,我们看看Build类的静态方法run
public static function run(array $build = [], $namespace = 'app', $suffix = false)
{
        // 锁定
        $lockfile = APP_PATH . 'build.lock';
        if (is_writable($lockfile)) {
            return;
        } elseif (!touch($lockfile)) {
            throw new Exception('应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~', 10006);
        }
        foreach ($build as $module => $list) {
            if ('__dir__' == $module) {
                // 创建目录列表
                self::buildDir($list);
            } elseif ('__file__' == $module) {
                // 创建文件列表
                self::buildFile($list);
            } else {
                // 创建模块
                self::module($module, $list, $namespace, $suffix);
            }
        }
        // 解除锁定
        unlink($lockfile);
    }
首先是判断临时锁文件是否可写,如果可写,则创建临时锁文件。然后根据自定义的build.php文件依次创建目录、文件、写入文件内容等。个人认为,加入临时锁文件是为了防止多人访问,同时写入应用目录及文件造成异常吧,个人理解为目录文件写入保护锁!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值