RC3版本主要改進和優化了系統內置中間件,改進了一些用法和體驗,並且把不常用的驅動移出核心改為擴展方式提供。
whereWeek
日期查詢
// 查詢本周文章
Article::whereWeek('create_time')->select();
// 查詢上周文章
Article::whereWeek('create_time', 'last week')->select();
// 查詢2019-1-1到2019-1-7的文章
Article::whereWeek('create_time', '2019-1-1')->select();
自增ID獲取的時候會根據主鍵的欄位類型自動轉換處理,而不是PDO默認返回的字元串類型。
記錄當前請求的路由規則對象,可以通過
$request->rule();
獲取當前請求實際匹配的路由規則對象
requireWithout
驗證規則表示當某個欄位沒有數據的時候必須,可以組合完成表單中某兩個欄位必須填寫一項的驗證,例如:
'phone' => 'requireWithout:mobile',
'mobile'=> 'requireWithout:phone',
優化路由ext和name方法以及URL生成
取消了內置的think\Controller
控制器基類,在項目中提供了app\BaseController
控制器基類更方便自定義。
另外項目還提供了app\Request
自定義請求類,可以自定義應用所需的請求方法和屬性。提供了app\ExceptionHandle
自定義異常處理類
,方便對異常進行自定義接管處理。
Route類buildUrl
及url
助手函數返回類型改為think\route\Url
對象實例而不是字元串,由於定義了__toString
方法,因此可以在模板中直接輸出為URL字元串。
echo url('index/hello',['name'=>'think'])->suffix('htm')->domain('blog');
改進修改器方法支持不返回任何數據,而是在修改器中直接設置數據
例如:
class User extends \think\Model
{
public function setField1Attr($value,$data){
$this->set('field2', $data['field2']);
$this->set('field3', $data['field3']);
}
}
$user = new User;
$user->field1 = 'value1';
$user->save();
實際寫入資料庫的時候不會包含field1
欄位數據,但會包含field2
和field3
的數據。
dump
/halt
助手函數調整支持輸出多個變數你可以使用
dump($var1,$var2,...)
方式輸出多個變數調試,同樣halt
方法也可以支持調試多個變數輸出並中止執行。
最新版本會在安裝項目的時候安裝symfony/var-dumper
擴展替換內置的dump
助手函數,因此你可以進行更強大的輸出
關聯together
方法自動更新和刪除的時候可以無需使用with
例如,之前的寫法
$article = Article::with('comments')->find(1);
$article->together(['comments'])->delete();
現在可以直接寫成
$article = Article::find(1);
$article->together(['comments'])->delete();
delete
和update
方法可以批量對數據集進行更新和刪除操作(支持模型事件)
// 更新今天的數據
$list = Article::whereDay('create_time')->select();
$list->update(['is_new'=>1]);
// 刪除昨天的數據
$list = Article::whereDay('create_time', 'yesterday')->select();
$list->delete();
<?php
namespace app\model;
use think\Model;
class Blog extends Model
{
// 定義默認的表後綴(默認查詢中文數據)
protected $suffix = _cn';
}
模型提供了動態切換方法switch
和setSuffix
,例如:
// switch方法用於靜態查詢
Blog::switch('_en')->find();
// setSuffix用於動態設置
$blog = new Blog($data);
$blog->setSuffix('_en')->save();
在註解中定義路由分組,可以使用
<?php
namespace app\controller;
/**
* @group('blog')
*/
class Blog
{
/**
* @param string $name 數據名稱
* @return mixed
* @route('hello/:name','get')
*/
public function hello($name)
{
return 'hello,'.$name;
}
}
當前控制器中的註解路由會自動加入blog
分組下面,最終,會註冊一個blog/hello/:name
的路由規則。你一樣可以對該路由分組設置公共的參數,例如:
<?php
namespace app\controller;
/**
* @group('blog')->ext('html')
* ->pattern(['id' => '\d+', 'name' => '\w+'])
*
*/
class Blog
{
/**
* @param string $name 數據名稱
* @return mixed
* @route('hello/:name','get')
*/
public function hello($name)
{
return 'hello,'.$name;
}
}
如果你已經在路由定義文件中定義了blog
分組,也可以直接把某個路由加入該分組,例如:
<?php
namespace app\controller;
class Blog
{
/**
* @param string $name 數據名稱
* @return mixed
* @route('hello/:name','get')->group('blog')
*/
public function hello($name)
{
return 'hello,'.$name;
}
}
你可以在定義多語言的時候使用分組定義
return [
'user' => [
'welcome' => '歡迎回來',
'login' => '用戶登錄',
'logout' => '用戶登出',
]
];
然後使用下面的方式獲取多語言變數
Lang::get('user.login');
lang('user.login');
可以通過extend_list
設置,例如:
'extend_list' => [
'zh-cn' => [
app()->getBasePath() . 'lang\zh-cn\app.php',
app()->getBasePath() . 'lang\zh-cn\core.php',
],
]
便於在擴展中自定義語言包
,並且現在已經支持語言文件使用YML
格式定義
增加TagSet
類,tag
方法支持傳入數組,同時對多個標籤進行操作
Cache::tag('tag')->set('name1','value1');
Cache::tag('tag')->set('name2','value2');
// 清除tag標籤的緩存數據
Cache::tag('tag')->clear();
並支持同時指定多個緩存標籤操作
Cache::tag(['tag1', 'tag2'])->set('name1', 'value1');
Cache::tag(['tag1', 'tag2'])->set('name2', 'value2');
// 清除多個標籤的緩存數據
Cache::tag(['tag1','tag2'])->clear();
可以追加某個緩存到標籤
Cache::tag('tag')->append('name3');
push
方法增加元素到一個數組緩存
Cache::set('name', [1,2,3]);
Cache::push('name', 4);
Cache::get('name'); // [1,2,3,4]
deny_app_list
配置參數可以配置禁止直接訪問的應用列表
控制器中間件的only
和except
定義不區分大小寫
app_map
支持指定泛應用映射可以在app_map
配置中定義泛應用解析到指定應用,例如:
'app_map' => [
'think' => 'admin', // 把admin應用映射為think
// ... 其它應用映射定義
'*' => 'home', // 其它應用解析到home
],
RedirectResponse
flush
方法make:controller
指令生成get
方法默認值dateFormat
屬性方法update
操作Relation::$selfRelation
默認為null
,導致Relation::isSelfRelation()
方法報錯redis
緩存驅動observe
方法getNamespaces
方法where
查詢方法傳入Query對象的時候缺少bind
數據的問題method
方法route:list
指令Collection
類load
方法redis
驅動的埠類型session
數據序列化使用JSON處理的問題hidden
方法隱藏關聯模型的問題Request
類has
方法對env
和session
的支持provider.php
文件無效問題getValidateType
方法trace
中間件僅在調試模式有效Socket
日誌驅動移出核心PostgreSQL
、Sqlite
和SqlServer
驅動移出核心,改為擴展think\Controller
基類Yaconf
支持移出核心 納入擴展think-yaconf
withoutField
方法useGlobalScope
方法增加withoutGlobalScope
方法Cookie
類恢復get
和has
方法支持token
助手函數調整:
分割傳參auto_detect
配置session
類的auto_start
配置參數和boot
方法Where
數組對象查詢JumpResponse
及success
/error
/result
等方法和助手函數think\db\Expression
類cookie
的prefix
參數optimize:facade
optimize:model
指令 改為擴展方式Config
類__get
和 __isset
方法
[admin
]