没有比思考更复杂的享受了,因此我们乐此不疲

URL解析

TP的框架很多操作都是通过URL来实现的:

http://hostname/index.php/模块/控制器/操作/值….;

模块在application目录下默认有一个index目录,就是一个模块

image-20210830000053261

这是一个controller模块

Index.php控制器的类名也必须是class Index, 否则错误

操作就是控制器class Index里面的方法,比如:index或者hello

在最基础的控制器中只有一个方法

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ad_bd568ce7058a1091"></think>';
    }
}

就是首页。

image-20210830000637662

在该文件中添加一个hello方法

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ad_bd568ce7058a1091"></think>';
    }
    public function hello($name = 'ThinkPHP5')
    {
        return 'hello, ' .$name;
    }
}

进行访问/idnex.php/index/index/hello

image-20210830001404907

传参:/index.php/index/index/hello/name/m0re

image-20210830001455572

创建test目录,来进行进一步解析。application/test/controller/Abc.php

<?php
//注意编码UTF-8
namespace app\test\controller;

class Abc
{
    public function eat($who = '隔壁老王')
    {
        return $who. '吃饭!';
    }
}

url解析——>http://127.0.0.1/index.php/test/Abc/eat

返回==隔壁老王吃饭==

解析——>http://127.0.0.1/index.php/test/Abc/eat/who/m0re

返回==m0re吃饭==

前提:环境开启url伪静态,如果没有开启,则ThinkPHP不支持url重写

如果没有开启url伪静态,则需使用PATH_INFO模式如下

index.php?s=test/Abc/eat/who/m0re

打开apache2的配置文件, 加载mod_rewrite.so去掉前面的#即可开启。

模块设计

默认模块

config.php中有一些默认模块,事提前设置好的

// 默认模块名
   'default_module'         => 'index',
   // 禁止访问模块
   'deny_module_list'       => ['common'],
   // 默认控制器名
   'default_controller'     => 'Index',
   // 默认操作名
   'default_action'         => 'index', 
   // 默认验证器
   'default_validate'       => '',
   // 默认的空控制器名
   'empty_controller'       => 'Error',
   // 操作方法后缀
   'action_suffix'          => '',
   // 自动搜索控制器
   'controller_auto_search' => false,

所以在访问index.php时,无需输入index.php即可访问到主页,是因为这个默认模块的存在。

单一模块

首先在config.php中先将多模块关闭,也就是设置'app_multi_module' => false,

然后就可以值设置一个目录controller/

在其下方编写首页代码

<?php
namespace app\controller;//注意这里也是需要修改,原namespace app\index\controller;

class Index
{
    public function index()
    {
        return '单一模块!';
    }
}

环境变量

Env库中获取环境变量。Env::get('app_path')

image-20210831004909216

控制器定义

控制器,即controller,控制器文件存放在controller目录下

类名和文件名大小写保持一致,并采用驼峰式(首字母大写)

use think\Controller;
class Index extends Controller;

继承控制器基类。可以更方便使用功能,但不是必须的

路由

路由的作用就是让url地址更加的规范和优雅,或者说更加简洁

==路由默认开启,没有配置开关,不需要手动配置==

\think\Route::get('details/:id', 'Address/details');

替换作用,使用前者details/:id替换掉后面的Address/details

get方法使用最多,一般是Route::get(),默认是GET。其他方式如下:

Route::rule('details/:id', 'Address/xxxx', 'GET');
Route::rule('details/:id', 'Address/xxxx', 'POST');
Route::rule('details/:id', 'Address/xxxx', 'GET|POST');

快捷方式

GET(get), POST(post), DELETE(delete), PUT(put), PATCH(patch), *(any, 任意请求方式)

直接使用Route::get()、Route::post()方式时无需第三参数

就到这里,看的我困。


继续肝😪😪😪😪

路由的变量规则

将details方法里面的id传值,严格的进行限制,必须是数字,因为路由没有设置的话,它可以支持数字,字母,下划线等,不支持特殊符号和中文。

Route::get('details/:id', 'Address/details')
        ->pattern('id', '\d+');

设置search方法的两个值规则,通过数组的方式传递参数

Route::get('search/:id/:uid', 'address/search')
        ->pattern([
            'id'    =>  '\d+',
            'uid'   =>  '\d+'
        ]);

上面两种均为局部变量规则,也可以直接在Route.php设置全局变量规则

Route::pattern([
    'id'    =>  '\d+',
    'uid'   =>  '\d+'
]);

而后上面两种方式中也不需要->pattern('xx', 'xxx')等操作了。

支持组合变量规则方式实现路由规则

Route::get('details-<id>', 'Address/details')
        ->pattern('id', '\d+');

:id=><id>,可以实现更改url访问路径

http://localhost/public/address/details-10.html 有时候也使用_<id>

在不设定任何规则的情况下,系统默认\w+在配置文件中可以更改默认规则

'default_route_pattern' => '[\w\-]+',

闭包支持

闭包支持我们可以通过url直接执行。而不需要通过控制器和方法,并且可以传递参数和动态规则。

Route::get('think', function (){
    return 'hello,world!';
});
Route::get('hello/:name', function ($name){
    return 'hello, '.$name;
});