热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

学习php时间较长,有近一年了,期间做了四个项目,有两个已上线运行,包括两个采用appcan打包的app安卓应用。当修改完各

学习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文件依次创建目录、文件、写入文件内容等。个人认为,加入临时锁文件是为了防止多人访问,同时写入应用目录及文件造成异常吧,个人理解为目录文件写入保护锁!


推荐阅读
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Laravel提供了很多辅助函数,有时候我们也需要创建自己的辅助函数。必须把所有的『自定义辅助函数』存放于bootstrap文件夹中。并在bootstrapapp.php文件的 ... [详细]
  • 傻瓜式apt-get安装的php不支持phpthreads,搜索好久得到的答案是:使用源码编译安装。下面开始:1.下载php源码和phpthread源码,然后解压.使用的ph ... [详细]
  • php现在一般用什么数据库可以这么说,php之所以强大就是因为数据库,当然还有其他的用处,php和mysql数据库连接一起就成为了目前最好的组合我们叫lamp,比如你注册的用户名密 ... [详细]
  • 首先,必须得说,慕课网是一个非常棒的网站,上面很多很好的视频教程,在此表示感谢!马上过年回家,因为家里没网,所以想把慕课上的视频下载下来在家里看,于是乎 ... [详细]
  • Laravel提供了很多辅助函数,有时候我们也需要创建自己的辅助函数。必须把所有的『自定义辅助函数』存放于bootstrap文件夹中。并在bootstrapapp.php文件的 ... [详细]
author-avatar
怪物-pp_912
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有