学习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 一堆字符串。整个文件改成如下:
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 . ']不可写,目录无法自动生成!
请手动生成项目目录~', 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文件依次创建目录、文件、写入文件内容等。个人认为,加入临时锁文件是为了防止多人访问,同时写入应用目录及文件造成异常吧,个人理解为目录文件写入保护锁!