乐虎游戏|乐虎国际登录|欢迎你

ThinkPHP5

日期:2020-01-30编辑作者:计算机资讯

本篇,我们的目标有三个:

主要:

一、TP5的目录结构和规范

project 应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共(函数)文件
│ ├─config.php 应用(公共)配置文件
│ ├─database.php 数据库配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─route.php 路由配置文件
├─extend 扩展类库目录(可定义)
├─public WEB 部署目录(对外访问目录)
│ ├─static 静态资源存放目录(css,js,image)
│ ├─index.php 应用入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于 apache 的重写
├─runtime 应用的运行时目录(可写,可设置)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think Think 类库包目录
│ │ └─traits 系统 Traits 目录
│ ├─tpl 系统模板目录
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 基础定义文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件

  • 1、命名规范
    目录命名、配置参数、非类库文件名、表名、字段名:小写+下划线
    类文件名和其内的类名:驼峰,首字母大写,两者名字要一样
    函数、属性名:驼峰,首字母小写
    常量:大写字母+下划线
    类文件名:以.php结尾
    类文件的命名空间和类文件所在的路径一致
    以双下划线__开头的函数或方法为魔术方法
    应用的类库文件的命名空间,最顶级的统一为app
  • 2、公共模块common
    公共模块无法直接通过URL进行调用,可以在其他模块调用和继承。
    在common中编写公共类
<?php
    namespace appcommoncontroller;
    class User
    {
        public function showName($name='')
        {
            return "my name is {$name}";
        }
    }

在index控制器中新建User类继承common

<?php
    namespace appindexcontroller;
    use appcommonUser as commonUser;
    class User extends commonUser
    {
        public function demo()
        {
            return $this->showName("imooc"); 
        }
    }
  • 3、惯例配置(默认配置)
  • 1、在public->index.php中定义配置文件目录
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//定义配置文件目录
define('CONF_PATH', __DIR__ . '/../conf/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
  • 2、通过控制器打开管理配置(等同于thinkphp-> convention.php文件)
<?php
namespace appindexcontroller;
class Index
{
    public function index()
    {
        dump(config());//通过助手函数修改配置
    }
}
  • 4、应用配置
    开发过程中不允许改变框架的文件,改变后对后期的框架升级十分不便,项目难以维护,因此采用了应用配置,应用配置文件是应用初始化的时候首先加载的公共配置文件。通过将惯例配置文件中的部分内容写在应用配置文件中进行执行。
    在app文件夹下新建一个conf文件夹,在其中新建配置文件config.php,并添加内容,内容自动添加到convention.php中
<?php
    return [
        'app_email' => '2783947274@qq.com',
        'app_author' => 'imooc',
        'app_debug' =>'false'
    ];

如果存在相同的key,后面的会将前面的替换掉

public function index()
    {
        //var_dump(config());
        $conf1=[
            'username'=>'yunlong'
        ];
        conf2=[
            'username'=>'along'
        ];
        var_dump(array_merge($conf1,$conf2));
    }
  • 5、扩展配置
    在conf下新建extra文件夹(必须是此名),然后新建一个配置文件,写入内容,内容会自动添加到convention.php中。主要用于数据库配置更改,数据库配置文件可以新建在extra同级目录下。
  • 6、场景配置:不同办公环境中,使用不同配置
    config下新建不同办公环境配置文件,eg:设置在家办公环境home.php;公司办公环境office.php; 在config.php设置组‘app_status’=>'home'/'office'
    如果需要在不同环境中配置不同的数据库设置,需要把整个数据库的设置拷贝到数组下
  • 7、模块配置
    在conf先新建一个文件夹,文件夹名字必须与模块名一致,在文件夹下新建config.php(必须此名),该配置文件只对该模块有效。
  • 8、动态配置
<?php
    namespace appindexcontroller;
    class Index
    {   public function __construct()
        {
            config('before','beforeAction');//对当前控制器有效
        }
         public function demo()
                {
                    config('demoAction','demo'); //只对当前demo方法有效
                    dump(config());
                }
        public function index()
        {
            config('indexAction','index');//只对当前index方法有效
            dump(config());
        }
    }
  • 9、config类
    该类存在thinkphp->library->think->Config.php中
    range()方法:设置配置参数的作用域
    parse()方法:解析配置文件或内容
    load()方法:加载配置文件(PHP格式)
    has()方法:检测配置是否存在
    get()方法:获取
    set()方法:设置
    reset()方法:重置配置
    调用Cofig类中方法的三种方式:
    1.加载助手类,并使用框架助手函数 use thinkConfig; $res=Config::get();
    2.全路径指向类,并使用框架助手函数 $res=thinkConfig::get();
    3.助手函数(不一定是框架助手类)$res=config();dump($res);
    默认助手函数路径:thinkphp->helper.php
  • 调整项目结构
  • 加载配置类
  • 添加日志类
  1. 整理框架
  2. 建库建表
  3. 配置文件类
  4. 错误日志记录

二、URL和路由

  • 1、入口文件
    单入口文件:通过携带不同的参数来将请求分配到不同的控制器中,不同控制器执行不同的功能实现功能
    单入口文件优势:安全监测、请求过滤
  • 2、public->index.php中的常量定义,可以在thinkphp->base.php中找到
  • 3、隐藏入口文件
    打开E:WAMPServerwamp64binapacheapache2.4.23conf下的httpd.con文件,打开LoadModule rewrite_module modules/mod_rewrite.so,在路径设置下更改AllowOverride all
  • 4、绑定模块
    方法一:在入口文件添加要绑定的模块,以后会直接跳转到该模块
// 定义应用目录
define('APP_PATH', __DIR__ . '/../app/');
//定义配置文件目录
define('CONF_PATH', __DIR__ . '/../conf/');
//绑定模块
define('BIND_MODULE', 'admin');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

define('BIND_MODULE','adminindex');//绑定admin模块index.php文件(只能传递方法),URL:localhostUserindex会报错adminindex.php中没有User->index方法

方法二:在public下新建一个api.php,书写以下内容,自动跳转到api绑定的模块。

<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../app/');
//定义配置文件目录
define('CONF_PATH', __DIR__ . '/../conf/');
define('BIND_MODULE', 'api');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

方法三:将convention.php中的auto_bind_module设置为true,系统会自动寻找与api.php名字相同的模块进行绑定。

  • 5、路由
    Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);
    确认convention.php中的url_route_on为true,在conf新建一个route.php文件,添加以下内容
<?php
    return[
        'new/:id'  =>  'index/index/info'
    ];

在不添加路由时访问info方法,应该在浏览器中输入localhost/index/index/info/id/5,设置路由后直接访问localhost/news/5.html即可

<?php
namespace appindexcontroller;
class Index
{
    public function index()
    {
        return "index Index index";
    }
    //访问localhost/index/index/info/id/5
    //localhost/news/5.html
    echo url('index/index/info','[id]'=>10."<br/>")//url助手函数,直接输出页面的路由
    public function info($id)
    {
        return "{$id}";
    }
    public function demo()
    {
        return "demo";
    }
}

如果将url_route_must设置为true,则所有的控制器都之能通过路由来访问,无法直接在浏览器上输入url进行访问。

三、请求与相应

  • 1、获取请求对象
    方法一:直接通过request函数获取
<?php
namespace appindexcontroller;
class Index
{
    public function index()
    {
        $request=request();
        dump($request);
    }
}

方法二:使用think下的request类获取

<?php
namespace appindexcontroller;
use thinkRequest;
class Index
{
    public function index()
    {
        $request=Request::instance();
        dump($request);
    }
}

方法三:直接在方法中传递Request对象

<?php
namespace appindexcontroller;
use thinkRequest;
class Index
{
    public function index(Request $request)
    {
        dump($request);
    }
}
  • 2、请求对象参数获取
    方法在thinkphp->library->think->Request.php中
<?php
namespace appindexcontroller;
use thinkRequest;
class Index
{
    public function index(Request $request)
    {
        //整个urlhttp://localhost/public/index/Index/index/type/5.html?id=10
        //获取域名,浏览器输入框的值http://localhost
        dump($request->domain());
        //获取index/Index/index/type/5.html
        dump($request->pathinfo());
        //获取index/Index/index/type/5
        dump($request->path());
        //请求类型
        dump($request->method());
        //判断是否为GET请求
        dump($request->isGet());
        dump($request->isPost());
        dump($request->isAjax());
        //获取请求参数,无法获取pathinfo中的值
        dump($request->get());
        //获取pathinfo中的值
        dump($request->param());
        dump($request->post());
        /*
        想要启用session必须将convention.php中的session配置的后两项删除
        */
        //session('name','along');
        dump($request->session());
        cookie('email','239424@qq.com');
        dump($request->cookie());
        dump($request->param('type'));
        //获取模块 控制器 操作
        dump($request->module());
        dump($request->controller());
        dump($request->action());
    }
}
  • 3、input助手函数
<?php
namespace appindexcontroller;
use thinkRequest;
class Index
{
    public function index(Request $request)
    {
        dump($request->param());
        $res=input('get.id');
        //input助手函数输出结果和下面语句一致
        dump($request->get('id'));
        //获取get、post、param、session
        session('email','238323424@qq.com');
        dump(input ('session'));
        dump($res);
    }
}
vkphp├─app│ ├─ctrl│ ├─model│ ├─smarty│ └─view├─config├─core├─lib├─log└─public
--------------本篇后文件结构:--------------------------------------blog├─App│  ├─Model 模型目录│  ├─View 视图目录│  │  ├─Admin后台目录│  │  └─Home前台目录│  ├─Common 配置目录│  │  └─config.php  配置文件│  ├─Log 日志目录│  │  └─log.txt  日志文件│  ├─Controller 控制器│  │  ├─Admin后台│  │  │  └─DemoController.class.php 测试控制器│  │  └─Home前台├─Public   静态公共文件(js,css,images)│  ├─Plugins 插件│  ├─Back后台│  └─Home前台├─Frame 公共使用的类│   ├─BaseModel.class.php 数据库连接类│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)│   ├─FactoryModel.class.php  模型工厂类│   ├─Log.class.php  日志厂类│   ├─Config.class.php  配置文件读取类│   ├─Init.class.php  初始化应用类│   └─MySQLDB.class.php 数据库操作工具类└─index.php  入口文件-----------------------------------------------------------------------------------------------------
  • app内包含控制器、数据库model、smarty模板、普通渲染模板。
  • config内包含全局配置文件。
  • core内包含框架的核心文件。
  • lib内包含第三方库。
  • log内存放日志文件。
  • public包含静态资源文件。

我们之前的路由配置、数据库配置都是写在程序中的,修改起来不方便,下面我们把这些配置都放在配置文件中。

利用上篇中搭建好的mvc框架结构,正式开始开发博客项目。首先建立数据表,然后开始搭建后台,数据前台展示,完成博客主要模块展示。

在core目录中,新建conf.php,内容如下:

下载查看该项目源码

<?phpnamespace core;class conf{ public function get($name,$file){ /** * 1、判断文件是否存在 * 2、判断配置是否存在 */ $file_path = CONFIG.'/'.$file.'.php'; if(is_file($file_path)){ $conf = include $file_path; if(isset($conf[$name])){ return $conf[$name]; }else{ throw new Exception('没有配置项'.$name); } }else{ throw new Exception('找不到配置文件'.$file); } } public function all{ $file_path = CONFIG.'/'.$file.'.php'; if(is_file($file_path)){ $conf = include $file_path; return $conf; }else{ throw new Exception('找不到配置文件'.$file); } }}

整理框架

本文由乐虎游戏发布于计算机资讯,转载请注明出处:ThinkPHP5

关键词:

《Thinkphp5入门体系课程》第十三课:Migration(二)

Thinkphp5视频教程 cmd操作mysql方式:   表的方法 列的方法 自定义主键名 自定义时间戳字段名 增加软删除 softDelete 字段...

详细>>

Yolo系列其三:Yolo_v3

相信SSD的横空出世委实给了Yolo许多压力。在目标检测准确性上Yolo本来就弱于Faster-RCNN,它的提出之初就主打其能保持...

详细>>

应用预先练习互联网和脾气抽出大力进步图像识别率

大家在前几节介绍过卷积网络的运算原理,以致通过代码实施,体验到了卷积网络对图纸信息抽出的灵光。以往三个...

详细>>

CRNN论文翻译——中英文对照

CTC 的工作原理 概述 文章作者:Tyan 博客:noahsnail.com | CSDN |  简书 背景 在实际的序列学习场景中经常会遇到从没有...

详细>>