一、学习thinkphp5.1目录规范
1. 默认的目录规范是小写,类文件命名是驼峰法,并且首字母大写。
例如:thinkphp/library/think/cache/driver/File.php
2. 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
3. 支持使用依赖注入的场景包括(但不限于):
- 控制器架构方法;
- 控制器操作方法;
- 数据库和模型事件方法;
- 路由的闭包定义;
- 行为类的方法;
4. 中间件主要用于拦截或过滤应用的HTTP
请求,并进行必要的业务处理。
5. 控制器中间件
V5.1.17+
版本开始,支持为控制器定义中间件。首先你的控制器需要继承系统的think\Controller
类,然后在控制器中定义middleware
属性,例如:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
protected $middleware = ['Auth'];
public function index()
{
return 'index';
}
public function hello()
{
return 'hello';
}
}
详细中间件操作,请查看think PHP5.1 中间件说明 https://www.kancloud.cn/manual/thinkphp5_1/564279
6. 路由的使用
路由仅针对PATHINFO方式的URL有效,ThinkPHP5.1
的路由定义更加对象化,并且默认开启路由(不能关闭),如果一个URL没有定义路由,则采用默认的PATH_INFO
模式访问URL:
7. 路由的重定向
Route::redirect('blog/:id','http://blog.thinkphp.cn/read/:id',302);
8. V5.1.3+
版本开始,支持路由直接渲染模板输出。
Route::view('hello/:name','index@hello');
9. 支持检测当前是否HTTPS访问
// 必须使用HTTPS访问
Route::get('new/:id', 'News/read')
->https();
// 必须使用HTTP访问
Route::get('new/:id', 'News/read')
->https(false);
10.前置行为检测
Route::get('user/:id', 'index/User/read')
->before(['\app\index\behavior\UserCheck']);
可以同时使用多个行为进行检测,并且支持使用闭包。
11. 控制器
控制器文件通常放在application/module/controller
下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。
一个典型的控制器类定义如下:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return 'index';
}
}
12.渲染输出
默认情况下,控制器的输出全部采用return
的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出。
下面都是有效的输出方式:
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
// 输出hello,world!
return 'hello,world!';
}
public function json()
{
// 输出JSON
return json($data);
}
public function read()
{
// 渲染默认模板输出
return view();
}
}
13、可以在重定向的时候通过session闪存数据传值,例如
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
14. 在控制器中通常情况下有两种方式进行依赖注入。
1)构造方法注入
<?php
namespace app\index\controller;
use think\Request;
class Index
{
/**
* @var \think\Request Request实例
*/
protected $request;
/**
* 构造方法
* @param Request $request Request对象
* @access public
*/
public function __construct(Request $request)
{
$this->request = $request;
}
public function index()
{
return $this->request->param('name');
}
}
2)操作方法注入
另外一种选择是在每个方法中使用依赖注入。
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class Index extends Controller
{
public function index(Request $request)
{
return $request->param('name');
}
}
15. Facade调用
在没有使用以来注入的场合,可以通过 facade 机制来静态调用请求对象的方法。注意use
引入的类库区别)
<?php
namespace app\index\controller;
use think\Controller;
use think\facade\Request;
class Index extends Controller
{
public function index()
{
return Request::param('name');
}
}
16. 为了简化调用,系统还提供了request
助手函数,可以在任何需要的时候直接调用当前请求对象。
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return request()->param('name');
}
}
17. 模型和Db查询的差别
模型操作和数据库操作的另外一个显著区别是模型支持包括获取器、修改器、自动完成在内的一系列自动化操作和事件,简化了数据的存取操作,但随之而来的是性能有所下降(其实并没下降,而是自动帮你处理了一些原本需要手动处理的操作),后面会逐步领略到模型的这些特色功能。