`V6.0`çæ¬ä¿æå
¼å®¹å级ï¼ä½ä¸å
¼å®¹`5.*`çæ¬çå级ã
# `5.1`å级å°`6.0`çæ¬
>[danger] ä¸å»ºè®®èç项ç®å级å°æ°çï¼é¤éä½ æéæ计åï¼å¦åå°±ç®å级äºä¹åªæ¯è¡¨é¢ä¸å级äºã
> æ¬æ主è¦ç¨äºæ导å¼åè
ä»`5.1`å级å°`6.0`ææ°ï¼RCï¼çæ¬ï¼ç±äº`6.0`ä¸æ¯æ`5.1`çæ ç¼å级ï¼ä¸é¢çå级æ¥éª¤åæ导ä»
ä¾å¦ä¹ åèï¼ææéæ¼åèèä¸å¨ä¹å¤ï¼å æ¤ä¸ä¿è¯ä½ çææåè½é½è½æ£å¸¸å级ã
`6.0`çæ¬å¿
须使ç¨`composer`å®è£
ï¼æä»¥ä½ éè¦é¦å
å®è£
æ°ç`6.0`çæ¬ï¼ç¶åæåæ¥`5.1`çæ件å¤å¶è¿å»ï¼å®æå级工ä½ã
~~~cmd
composer create-project topthink/think:6.0.0 tp
~~~
å®è£
å®æåï¼æåæ¥`application`ç®å½ä¸é¢çæ件å¤å¶å°`app`ç®å½ä¸é¢ï¼ç¶åæ`config`å`route`ç®å½ä¸çæ件å¤å¶å°ååç®å½ä¸ãæ¥ä¸æ¥ï¼æç
§ä¸é¢çæ¥éª¤æ¥å级æä½ã
ä»`5.1`å¤æ¨¡åè¿ç§»å°`6.0`çå¤åºç¨åï¼åºç¨ç±»åºçå½å空é´ååä¸å¯ä»¥æ éè°æ´ï¼ä½ä¸åæ¯æè·¨åºç¨è°ç¨ï¼å
æ¬è·¯ç±å模æ¿ï¼æ¯ä¸ªåºç¨çè·¯ç±æ¯ç¬ç«çï¼ï¼è¿ç¹å¡å¿
å¼èµ·éè§ãå¦æä½ çåºç¨æ ¹å½å空é´ä¸æ¯é»è®¤ç`app`éè¦æ¹æ`app`ã
[TOC=2,2]
## 第ä¸æ¥ï¼åºç¨é
ç½®
å¦æåæ¥ä½ 使ç¨äºå¤æ¨¡åå¼å模å¼ï¼ç´æ¥æ¹ææ°ççå¤åºç¨æ¨¡å¼æ¯æç®åçï¼éè¦é¢å¤å®è£
å¤åºç¨æ¨¡å¼æ©å±ã
```
composer require topthink/think-multi-app
```
å¦æä½ èªå®ä¹äºè®¿é®æ§å¶å¨çå称ï¼éè¦ä¿®æ¹`route.php`é
ç½®æ件ä¸ç`controller_layer`å¼ã
```
// 访é®æ§å¶å¨å±å称
'controller_layer' => 'controller',
```
å¦æä½ å¼å¯äºæ§å¶å¨ç±»çåç¼ï¼éè¦è®¾ç½®`route.php`é
ç½®æ件ä¸ç`controller_suffix`å¼ã
```
// å¼å¯æ§å¶å¨åç¼
'controller_suffix' => true,
```
å¦æèªå®ä¹äºç©ºæ§å¶å¨çå称ï¼åéè¦è®¾ç½®`route.php`é
ç½®æ件ä¸ç`empty_controller`å¼ã
```
// 空æ§å¶å¨å
'empty_controller' => 'Error',
```
## 第äºæ¥ï¼é
ç½®è°æ´
请æç
§å¦ä¸é¡ºåºæ£æ¥åè°æ´ä½ çé
ç½®æ件åç¸å
³é
置代ç ã
### åºç¨çé
ç½®æ件
å¦ææ¯å¤åºç¨çè¯ï¼åºç¨é
ç½®æ件åºå½æ¾å
¥åºç¨ä¸ç`config`ç®å½ãå
¨å±é
ç½®æ件ä½ç½®æ éè°æ´ã
### é
ç½®è·åè°æ´
åæ¥è·åä¸çº§é
ç½®åæ°çæ¹å¼
```
Config::pull('app');
```
éè¦æ¹æ
```
Config::get('app');
```
ææçé
置读åå¿
é¡»ä»ç¬¬ä¸çº§é
ç½®å¼å§ï¼ä¾å¦ï¼åæ¥ç
```
Config::get('exception_handle');
```
å¿
é¡»æ¹æ
```
Config::get('app.exception_handle');
```
### åºå¼å¨æ设置
å¨ææ´æ¹é
ç½®åæ°çç¨æ³å·²ç»åºå¼ï¼ä¸é¢çç¨æ³ä¸åæ¯æã
```
Config::set('route.default_return_type', 'json');
```
å¦æä½ éè¦ææ°æ®åºçé
ç½®åæ°è¯»å
¥é
ç½®ï¼å¯ä»¥ä½¿ç¨
```
$config = Db::name('config')->column('value', 'name');
Config::set($config, 'route');
```
### `Config`ç±»ä¸åæ¯ææ°ç»æ¹å¼è¯»å
`Config`ç±»ä¸å使ç¨`ArrayAccess`æ¥å£ï¼å æ¤ä¸åæ¯ææ°ç»æ¹å¼è¯»åã
### è·¯ç±åURLé
ç½®ç¬ç«
è·¯ç±åURL请æ±ç¸å
³çé
ç½®åæ°ç¬ç«ä¸º`route.php`é
ç½®æ件ï¼èä¸å使ç¨`app.php`é
ç½®æ件ã
## 第ä¸æ¥ï¼è·¯ç±å请æ±è°æ´
### è·¯ç±å®ä¹æ件ä½ç½®è°æ´
ååºç¨æ¨¡å¼ä¸ï¼è·¯ç±å®ä¹æ件åä¹åä¸æ ·å°±å¨`route`ç®å½ä¸é¢ï¼å¦æä½ ç项ç®æ¯éç¨äºå¤åºç¨æ¨¡å¼çè¯ï¼æ¯ä¸ªåºç¨çè·¯ç±å®ä¹åå¹é
é½æ¯ç¬ç«çï¼ä¹æ²¡æ模åçæ¦å¿µï¼è·¯ç±å®ä¹æ件çä½ç½®åºè¯¥æ¯å¨`åºç¨/route`ä¸é¢ï¼ä¾å¦ï¼
~~~
app/index/route/route.php // indexåºç¨çè·¯ç±å®ä¹æ件
app/index/route/web.php // indexåºç¨ç第äºä¸ªè·¯ç±å®ä¹æ件
app/admin/route/route.php // adminåºç¨çè·¯ç±å®ä¹æ件
~~~
> åºç¨çè·¯ç±è§åå
¶å®æ¯å®ä¹çå
¥å£æ件ï¼æè
åºç¨åï¼åé¢çURLé¨åï¼èä¸å
å«åºç¨ã
### è·¯ç±æ³¨åæ¹æ³è°æ´
é¦å
å¦æä½ çè·¯ç±å®ä¹éç¨çæ¯è¿åæ°ç»å½¢å¼ï¼å
¨é¨æ¹ææ¹æ³å®ä¹ã
ä¾å¦ï¼
~~~
return [
'hello/:name' => 'index/hello',
];
~~~
å¿
é¡»æ¹æï¼
~~~
Route::get('hello/:name', 'index/hello');
~~~
å¦æè·¯ç±å®ä¹æ¹æ³ï¼å
æ¬`rule`/`get`/`post`/`put`/`delete`/`patch`/`miss`/`group`çæ¹æ³ï¼ä½¿ç¨äº`option`å`pattern`åæ°ï¼å
¨é¨æ¹ææ¹æ³è°ç¨å½¢å¼ï¼ä¾å¦åæ¥çï¼
~~~
Route::get('hello/:name', 'index/hello', [ 'ext' => 'html'], [ 'name' => '\w+']);
~~~
éè¦æ¹æ
~~~
Route::get('hello/:name', 'index/hello')
->ext('html')
->pattern([ 'name' => '\w+']);
~~~
### è·¯ç±åç»è°æ´
å¦æè·¯ç±åç»å®ä¹ä½¿ç¨äºæ°ç»ï¼æ¹æéå
æ¹å¼å®ä¹ï¼ä¾å¦ï¼
~~~
Route::group('blog', [
':id' => 'Blog/read',
':name' => 'Blog/read',
])->ext('html')->pattern(['id' => '\d+']);
~~~
å¿
é¡»æ¹æ
~~~
Route::group('blog', function() {
Route::get(':id', 'Blog/read');
Route::get(':name', 'Blog/read');
})->ext('html')->pattern(['id' => '\d+']);
~~~
å¦æä½ éè¦æ³¨åä¸ä¸ªèæçè·¯ç±åç»ï¼å¯ä»¥ç´æ¥å¨ç¬¬ä¸ä¸ªåæ°ä½¿ç¨éå
~~~
Route::group(function() {
Route::get('blog/:id', 'Blog/read');
Route::get('user/:name', 'User/read');
})->ext('html')->pattern(['id' => '\d+']);
~~~
### åæ¶äº`url_controller_layer`é
ç½®
æ¹ä¸ºå¨`route.php`é
ç½®æ件ä¸ä½¿ç¨`controller_layer`设置ã
### åæ¶`controller_suffix`é
ç½®
æ¹ä¸ºå¨`route.php`é
ç½®æ件ä¸ä½¿ç¨`controller_suffix`设置ã
åæ¶`class_suffix`é
ç½®åæ°å·²ç»æ æã
### åæ¶`mergeExtraVars`æ¹æ³å对åºåæ°
æ¹ä¸ºå¨è·¯ç±è§åä¸æç¡®æå®åéè§åã
### `allowCrossDomain`æ¹æ³åæ°è°æ´
åæ¶åæ¥ç第ä¸ä¸ªåæ°ã
### `header`æ¹æ³åæ¶
éè¦åç¬æ¹åHeaderä¿¡æ¯çç´æ¥éè¿ä¸é´ä»¶ç»ä¸å¤çã
### åæ¶`Request`ç±»ç`hook`æ¹æ³
该æ¹æ³å·²ç»å¨ææ°çæ¬ä¸åæ¶ãå¦æä½ ä½¿ç¨äºè¯¥åè½ï¼å¨èªå®ä¹è¯·æ±å¯¹è±¡`app\Request`ä¸ç´æ¥å¢å ç¸åºçæ¹æ³å³å¯ã并确ä¿`provider.php`æ件ä¸æ·»å å¦ä¸ç»å®ï¼
```
'think\Request' => \app\Request::class,
```
### åæ¶`URL`åæ°æ¨¡å¼é
ç½®
åæ¥çURLåæ°æ¨¡å¼é
ç½®åæ°`url_param_type`ï¼ç»ä¸ä½¿ç¨åæ°/å¼çæ¹å¼ãå¦æä½ è®¾ç½®äºè¯¥é
ç½®åæ°ä¸º1ï¼å¿
é¡»æ¹æå®ä¹è·¯ç±çæ¹å¼ã
### åæ¶å«åè·¯ç±
å 为使ç¨åºæ¯æéåæ§è½å¼éé®é¢ï¼åæ¶åæ¥çå«åè·¯ç±åè½ï¼å»ºè®®ä½¿ç¨èµæºè·¯ç±æè
åç¬çè·¯ç±æ¿ä»£ã
### åæ¶å¿«æ·è·¯ç±
å 为使ç¨åºæ¯æéåä¸å¤ªç¬¦åè§èï¼åæ¶äºåæ¥çæ§å¶å¨å¿«æ·è·¯ç±åè½ã
### åæ¶ç©ºæä½åè½
建议使ç¨åç»MISSè·¯ç±åè½æè
æ§å¶å¨ç`__call`æ¹æ³æ¿ä»£ã
## 第åæ¥ï¼æ§å¶å¨åè§å¾è°æ´
### `think\Controller`ç±»åæ¶
ç³»ç»ä¸åæä¾åºç¡æ§å¶å¨ç±»`think\Controller`ï¼åæ¥ç`success`ã`error`ã`redirect`å`result`æ¹æ³éè¦èªå·±å¨åºç¡æ§å¶å¨ç±»éé¢å®ç°ã
ç³»ç»é»è®¤å¨åºç¨ç®å½ä¸é¢æä¾äºä¸ä¸ª`app\BaseController`åºç¡ç±»ï¼æè
ä½ å¯ä»¥ç´æ¥æ¾å
¥ä½ çåºç¨éé¢ï¼ç»§æ¿ä½¿ç¨ã
ä½ å¯ä»¥å®è£
ä¸é¢çæ©å±ç¨äºæ¯ææ§çæ¬ç跳转æä½
~~~
composer require liliuwei/thinkphp-jump
~~~
### è§å¾å模æ¿å¼æä»æ ¸å¿å离
模æ¿å¼æç±»ä¸åå
ç½®å°æ ¸å¿æ¡æ¶ï¼ä½ä½¿ç¨
~~~
composer create-project topthink/think
~~~
ä¼é»è®¤å®è£
该ç»ä»¶ï¼å¦æä¸éè¦ä½¿ç¨çè¯å¯ä»¥èªå·±å¸è½½`topthink/think-view`ï¼ã
å®è£
åï¼ç±äºå
ç½®ç`think\Controller`类已ç»åæ¶ï¼å¦æä½ çæ§å¶å¨ç±»éè¦è°ç¨`fetch`/`display`/`assign`çè§å¾æ¹æ³ï¼å¿
é¡»æ¹ä¸ºè°ç¨`think\facade\View`ç±»ï¼å¦ææ¯ä½¿ç¨`view`å©æå½æ°æ¹å¼çè¯ï¼å¯ä»¥æ éè°æ´ã
```
View::assign('name', $name);
View::fetch();
```
### `share`æ¹æ³åæ¶
åæ¥è§å¾ç±»ç`share`æ¹æ³åæ¶ï¼å¯ä»¥ä½¿ç¨
```
think\facade\View::assign($vars);
```
## 第äºæ¥ï¼æ°æ®åºå模åè°æ´
### `Db`æ¹ä¸ºä½¿ç¨é¨é¢å¯¹è±¡
æ°çç`Db`ç±»ä¸åæ¯éæç±»ï¼éè¦ä½¿ç¨`think\facade\Db`é¨é¢è¿è¡éæ代çã
~~~
\think\facade\Db::name('user')->find();
~~~
### æ°æ®åºé
置信æ¯è°æ´
æ°æ®åºé
ç½®æ件æè
`connect`æ¹æ³åæ¶`DSN`æ°æ®åºé
ç½®å®ä¹æ¹å¼ï¼å
¨é¨éç¨æ°ç»æ¹å¼é
ç½®å®ä¹ã
~~~
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8')
->table('user')
->find();
~~~
å¿
é¡»æ¹æ
~~~
Db::connect('db_config')
->table('user')
->find();
~~~
并ä¸æç
§æ°ççè§èå¨æ°æ®åºé
ç½®æ件ä¸å¢å `db_config`è¿æ¥ä¿¡æ¯ã
### åæ¶`fetchPdo`æ¹æ³
åæ¶äº`Query`ç±»ç`fetchPdo`æ¹æ³ï¼éè¦çæ¶åç´æ¥ä½¿ç¨`getPdo`æ¹æ³æ¿ä»£ã
### åæ¶æ¥è¯¢æ¹æ³ä¼ å
¥`Query`对象
åæ¶Queryç±»çCURDæ¥è¯¢æ¹æ³ä¼ å
¥å½å对象ï¼å¦æéè¦è¯·ä½¿ç¨éå
æ¿ä»£ã
### `insert`/`insertGetId`/`insertAll`æ¹æ³åæ¶`replace`åæ°
`insert`/`insertGetId`/`insertAll`æ¹æ³ç第äºä¸ª`replace`åæ°å·²ç»åæ¶ï¼æ¹ä¸ºä½¿ç¨`replace`æ¹æ³ã
~~~
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data, true);
~~~
éè¦æ¹ä¸º
~~~
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->replace()->insert($data);
~~~
### åæ¶`db`å`model`å©æå½æ°
è¿ä¸¤ä¸ªå©æå½æ°`5.1`çæ¬å·²ç»ä¸å建议使ç¨äºï¼`6.0`çæ¬å·²ç»åºå¼æè¿ä¸¤ä¸ªå©æå½æ°ï¼è¯·ç´æ¥ä½¿ç¨`\think\facade\Db`ç±»éææ¹æ³åå®é
ç模åç±»è°ç¨ã
### åæ¶`setInc`/`setDec`æ¹æ³
åæ¶Queryç±»ç`setInc`/`setDec`æ¹æ³ï¼ç»ä¸ä½¿ç¨`inc`/`dec`æ¹æ³æ¿ä»£ãä¾å¦ï¼
~~~
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();
~~~
### åæ¶`join`æ¹æ³çæ¹éæä½
`join`æ¹æ³ä¸åæ¯ææ¹éæä½å¤ä¸ªè¡¨ï¼å¦æä½ ä½¿ç¨äº`join`æ¹æ³æ¹éæä½ï¼éè¦æ¹ææ¯ä¸ªè¡¨åç¬è°ç¨ä¸æ¬¡`join`æ¹æ³ã
### åæ¶`setField`æ¹æ³
åæ¶Queryç±»ç`setField`æ¹æ³ï¼è¯·ç´æ¥ä½¿ç¨`data`æ¹æ³æè
`update`æ¹æ³ã
### åæ¶`__TABLE_NAME__`æ¯æ
`table`æ¹æ³åæ¶`__TABLE_NAME__`æ¯æï¼å¿
é¡»æç¡®è°ç¨å®æ´è¡¨åæè
使ç¨`name`æ¹æ³ã
### åæ¶`whereOr`çæ¹æ³ä¼ å
¥`Query`对象
å 为`Query`对象æ¥è¯¢åªè½ä½¿ç¨ä¸æ¬¡ï¼é¤äº`where`æ¹æ³æ¬èº«å¯ä»¥ä¼ å
¥`Query`对象å¤ï¼å
¶å®çææ`where`æ¥è¯¢æ¹æ³ï¼ä¾å¦`whereOr`/`whereExp`çï¼é½ä¸åæ¯æä¼ å
¥`Query`对象ã
### åæ¶`resultset_type`é
ç½®åæ°
æ°æ®éæ¥è¯¢ç»æä¸åå`resultset_type`é
ç½®åæ°å½±åï¼é»è®¤æ
åµä¸ï¼Dbæ¥è¯¢ç»ä¸è¿åæ°ç»ï¼æ¨¡åæ¥è¯¢ç»ä¸è¿å模å对象å模åæ°æ®é对象ãå¦æDbæ¥è¯¢çæ¶åä¹éè¦è¿åæ°æ®éçè¯ï¼å¯ä»¥æ¾å¼è°ç¨`fetchCollection`æ¹æ³ã
### åæ¶`Query`ç±»ç`extend`æ¹æ³
åæ¶äº`Query`ç±»ç`extend`æ¹æ³ï¼å¦æéè¦æ©å±æ¥è¯¢æ¹æ³ï¼å»ºè®®èªå®ä¹`Query`类并继æ¿ç³»ç»ç`think\db\Query`ç±»å³å¯ï¼ç¶åå¨æ¨¡åä¸å®ä¹`query`å±æ§æè
é
ç½®æ°æ®åºè¿æ¥ç`query`åæ°ä¸ºä½ çèªå®ä¹ç±»ã
### `Expression`对象è°æ´
åæ¥ç`Expression`对象已ç»æ´æ¹ä¸ºæ´éåç`Raw`对象ï¼ä½ä¸å½±å`Db::raw()`æ¹æ³çè°ç¨ã
### åæ¶æ¥è¯¢`eq/neq/gt/lt/egt/elt`表达å¼
ç±äºåå¨ä¸¤ç§ç¨æ³ï¼å¹¶ä¸ä¸å¤ç´è§ï¼å
¨é¨ç»ä¸ä¸ºæ´ç´è§çç¨æ³ã
ä¸é¢çç¨æ³ä¸åæ¯æ
~~~
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();
~~~
ç»ä¸ä½¿ç¨
~~~
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();
~~~
### åæ¶å表åè½
åºäºå表çæ§è½é®é¢åå¤ææ§ï¼ä¸åæä¾å表æ¹æ³ï¼å»ºè®®ä½¿ç¨æ°æ®åºçååºåè½æ¿ä»£ãæ°çå¯ä»¥ä½¿ç¨`partition`æ¹æ³æå®å½åæ¥è¯¢çååºã
### æ°æ®åºçæ¥è¯¢ç»è®¡å并
æ°æ®åºçæ¥è¯¢æ¬¡æ°å并å°`queryTimes`ï¼ä¸ååºå读åæä½ï¼ä½ å¯ä»¥ä½¿ç¨ä¸é¢çæ¹æ³è·åå½å请æ±çæ°æ®åºæ¥è¯¢æ¬¡æ°ï¼å
æ¬è¯»åï¼
~~~
Db::getQueryTimes();
~~~
### 模ååç¼
å¦æä¹åå¼å¯äºç±»åºåç¼åè½çè¯ï¼ä½ å¿
é¡»å¨æ¨¡åç±»éé¢æç¡®æå®`name`å±æ§ã
### åæ¶äºæ¨¡åç`get`/`all`æ¹æ³
æ 论使ç¨`Db`ç±»è¿æ¯æ¨¡åç±»æ¥è¯¢ï¼å
¨é¨ç»ä¸ä½¿ç¨`find`/`select`æ¹æ³ï¼åæ¶äºä¹å模åç±»é¢å¤æä¾ç`get`/`all`æ¹æ³ãåæ¶åæ¶çæ¹æ³è¿å
æ¬`getOrFail`/`allOrFail`ã
### åæ¶å
¨å±æ¥è¯¢èå´`base`æ¹æ³
åæ¶æ¨¡åç±»çå
¨å±æ¥è¯¢èå´`base`æ¹æ³ï¼æ¹ç±ä½¿ç¨`globalScope`å±æ§å®ä¹ï¼æ°ç»ï¼éè¦å
¨å±æ¥è¯¢çæ¥è¯¢èå´æ¹æ³ã
### 模åäºä»¶è°æ´
模åäºä»¶ä¸åéè¦ä½¿ç¨`event`æ¹æ³æ³¨åäºä»¶ï¼ç»ä¸å¨æ¨¡åç±»ä¸å®ä¹äºä»¶æ¹æ³ï¼ä¾å¦
~~~
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
public function onAfterRead($user)
{
$user->extra = 'extra';
}
public function onBeforeWrite($user)
{
$user->extra = 'extra';
}
}
~~~
并ä¸æ¨¡åå¢å `after_read`äºä»¶ï¼å¨æ¥è¯¢åå建模å对象å®ä¾çæ¶å触åã
### åæ¶æ¨¡åèªå¨å®æ
模åçèªå¨å®æåè½å·²ç»åæ¶ï¼è¯·ä½¿ç¨æ¨¡åäºä»¶ä»£æ¿ã
### 模å`save`æ¹æ³è°æ´
模åç±»ç`save`æ¹æ³ä¸åæ¯æ`where`åæ°ã
### å
³èç»è®¡è°æ´
å¦æä½ çå
³èç»è®¡ä½¿ç¨äºéå
æ¹å¼è¿åå
³èç»è®¡å段ï¼éè¦è°æ´ä¸ºå¦ä¸æ¹å¼ï¼
```
User::withCount(['cards' => function($query,&$name) {
$query->where('status', 1);
$name = 'card_count';
}])->select();
```
### 模ååæ°æ®éçè¾åºè°æ´
åæ¶`hidden`/`visible`/`append`æ¹æ³ç第äºä¸ªåæ°ï¼å½ä½ è°ç¨è¿å 个æ¹æ³çæ¶åï¼æ 论模åæ¯å¦è®¾ç½®äºç¸å
³å±æ§ï¼é½ä¼ç´æ¥è¦çä¹å设置çå¼ã
### æ¥è¯¢ç¼åè°æ´
å¦æå¸æå¨æ´æ°åå é¤ä¹åèªå¨æ¸
é¤ä¹åçæ¥è¯¢ç¼åï¼å¿
é¡»å¨`cache`æ¹æ³ä¸ä¼ å
¥keyå¼èä¸æ¯`true`ã
### å é¤å
³èç±»`selfRelation`æ¹æ³
å¦æä½ å¨å®ä¹å
³èçæ¶å使ç¨äº`selfRelation`æ¹æ³ï¼è¯·ç´æ¥å é¤è¯¥æ¹æ³ï¼ç®åå·²ç»ä¸åéè¦ï¼ä¼èªå¨è¯å«æ¯å¦ä¸ºèªå
³èã
### å é¤å
³èç±»ç`setEagerlyType`æ¹æ³
ä¸å¯¹ä¸å
³èæ éå¨å®ä¹å
³èçæ¶åæå®ä¸º`JOIN`æ¥è¯¢ï¼å¨æ¥è¯¢çæ¶åç´æ¥ä½¿ç¨`withJoin`æ¹æ³å³å¯ä½¿ç¨`JOIN`æ¹å¼è¿è¡å
³èæ¥è¯¢ã
### å¤å¯¹å¤å
³è
å¤å¯¹å¤å
³èç`pivotDataName`æ¹æ³æ´å为æ´ç®åç`name`æ¹æ³ã
## 第å
æ¥ï¼è¡ä¸ºè°æ´
è¡ä¸ºå`Hook`å·²ç»ç¨æ°ççäºä»¶æºå¶æ¿ä»£ï¼éè¦æä½ çè¡ä¸ºæ¹æäºä»¶ååºæè
ä¸é´ä»¶ï¼é¨å请æ±æ¦æªçè¡ä¸ºå¯ä»¥ç´æ¥æ¹ä¸ºä¸é´ä»¶ï¼ã
åæ¥çç³»ç»å
ç½®é©åçè¡ä¸ºç±»
~~~
<?php
namespace app\index\behavior;
class Hello
{
public function run($params)
{
// è¡ä¸ºé»è¾
}
}
~~~
å¯ä»¥æ¹æäºä»¶çå¬ç±»
~~~
namespace app\index\listener;
class Hello
{
public function handle($event)
{
// äºä»¶çå¬å¤ç
}
}
~~~
ç¶åå¨åºç¨ç®å½ç`event.php`æ件ä¸é
ç½®äºä»¶çå¬ã
~~~
return [
'listen' => [
'AppInit' => ['\app\index\listener\Hello'],
// æ´å¤äºä»¶çå¬
],
];
~~~
ä¿®æ¹å®æåï¼ä½ å¯ä»¥å é¤åºç¨ç®å½ä¸ä¸å使ç¨ç`tags.php`æ件ã
å
ç½®äºä»¶åé©åç对åºå
³ç³»å¦ä¸ï¼
| äºä»¶| 对åº`5.1`é©å| åæ° |
| --- | --- | --- |
| `AppInit` | `app_init `| æ |
| `AppEnd` | `app_end `| å½åååºå¯¹è±¡å®ä¾ |
| `LogWrite` | `log_write `| å½ååå
¥çæ¥å¿ä¿¡æ¯ |
| `LogLevel` | `log_level `| å
å«æ¥å¿ç±»ååæ¥å¿ä¿¡æ¯çæ°ç» |
>[danger] åæ¥ç`app_begin`ã`response_send`ã`response_end`ã`action_begin`ã`module_init`å`view_filter`é©åå·²ç»åºå¼ã
## 第ä¸æ¥ï¼å
¶å®è°æ´å注æäºé¡¹
### ç³»ç»`Facade`ç±»åºå«ååæ¶
ç³»ç»`Facade`ç±»åºçå«åå·²ç»åæ¶ï¼å æ¤ä¸è½å使ç¨
```
use Route;
Route::rule('hello/:name', 'index/hello');
```
å¿
须使ç¨
```
use think\facade\Route;
Route::rule('hello/:name', 'index/hello');
```
### `Session`è°æ´
`Session`æ°çé»è®¤ä¸å¼å¯ï¼å¿
须为å¨å
¨å±ä¸é´ä»¶å®ä¹æ件ä¸æ·»å
~~~
'think\middleware\SessionInit'
~~~
åæ¥ç`Session::get()` å¯ä»¥è·åå
¨é¨çSessionæ°æ®å¿
é¡»æ¹æ `Session::all()`
### ä¸¥æ ¼ç±»åæ£æ¥
ç±äºæ°çæ¡æ¶æ ¸å¿ç±»åºå
¨é¢å¯ç¨å¼ºç±»ååæ°ï¼å¹¶ä¸ä½¿ç¨ä¸¥æ ¼æ¨¡å¼ï¼æ以å¨è°ç¨ç³»ç»æ¹æ³çæ¶åä¸å®è¦æ³¨æåæ°çç±»åï¼æè
注æçæåºçå¼å¸¸ä¿¡æ¯è¿è¡ä¿®æ£ã
>[success] æåï¼å¸æä½ ç`6.0`å级ä¹æ
顺å©^_^ ï¼å¸æ大家å¨å级å使ç¨`6.0`çè¿ç¨ä¸ï¼å¤åé¦å建议ï¼å¸®å©æ们尽快å®åååå¸æ£å¼çæ¬ã
- åºè¨
- åºç¡
- å®è£
- å¼åè§è
- ç®å½ç»æ
- é ç½®
- æ¶æ
- 请æ±æµç¨
- æ¶ææ»è§
- å ¥å£æ件
- å¤åºç¨æ¨¡å¼
- URL访é®
- 容å¨åä¾èµæ³¨å ¥
- æå¡
- é¨é¢
- ä¸é´ä»¶
- äºä»¶
- è·¯ç±
- è·¯ç±å®ä¹
- åéè§å
- è·¯ç±å°å
- è·¯ç±åæ°
- è·¯ç±ä¸é´ä»¶
- è·¯ç±åç»
- èµæºè·¯ç±
- 注解路ç±
- è·¯ç±ç»å®
- ååè·¯ç±
- MISSè·¯ç±
- è·¨å请æ±
- URLçæ
- æ§å¶å¨
- æ§å¶å¨å®ä¹
- åºç¡æ§å¶å¨
- 空æ§å¶å¨
- èµæºæ§å¶å¨
- æ§å¶å¨ä¸é´ä»¶
- 请æ±
- 请æ±å¯¹è±¡
- 请æ±ä¿¡æ¯
- è¾å ¥åé
- 请æ±ç±»å
- HTTP头信æ¯
- 伪éæ
- åæ°ç»å®
- 请æ±ç¼å
- ååº
- ååºè¾åº
- ååºåæ°
- éå®å
- æ件ä¸è½½
- æ°æ®åº
- è¿æ¥æ°æ®åº
- åå¸å¼æ°æ®åº
- æ¥è¯¢æé å¨
- æ¥è¯¢æ°æ®
- æ·»å æ°æ®
- æ´æ°æ°æ®
- å é¤æ°æ®
- æ¥è¯¢è¡¨è¾¾å¼
- é¾å¼æä½
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- èåæ¥è¯¢
- å页æ¥è¯¢
- æ¶é´æ¥è¯¢
- é«çº§æ¥è¯¢
- è§å¾æ¥è¯¢
- JSONå段
- åæ¥è¯¢
- åçæ¥è¯¢
- æ¥è¯¢äºä»¶
- è·åå¨
- äºå¡æä½
- åå¨è¿ç¨
- æ°æ®é
- æ°æ®åºé©±å¨
- 模å
- å®ä¹
- 模åå段
- æ°å¢
- æ´æ°
- å é¤
- æ¥è¯¢
- æ¥è¯¢èå´
- JSONå段
- è·åå¨
- ä¿®æ¹å¨
- æç´¢å¨
- æ°æ®é
- èªå¨æ¶é´æ³
- åªè¯»å段
- 软å é¤
- ç±»å转æ¢
- 模åè¾åº
- 模åäºä»¶
- 模åå ³è
- ä¸å¯¹ä¸å ³è
- ä¸å¯¹å¤å ³è
- è¿ç¨ä¸å¯¹å¤
- è¿ç¨ä¸å¯¹ä¸
- å¤å¯¹å¤å ³è
- å¤æå ³è
- å ³èé¢è½½å ¥
- å ³èç»è®¡
- å ³èè¾åº
- è§å¾
- 模æ¿åé
- è§å¾è¿æ»¤
- 模æ¿æ¸²æ
- 模æ¿å¼æ
- è§å¾é©±å¨
- é误åæ¥å¿
- å¼å¸¸å¤ç
- æ¥å¿å¤ç
- è°è¯
- è°è¯æ¨¡å¼
- Traceè°è¯
- SQLè°è¯
- åéè°è¯
- è¿ç¨è°è¯
- éªè¯
- éªè¯å¨
- éªè¯è§å
- é误信æ¯
- éªè¯åºæ¯
- è·¯ç±éªè¯
- å ç½®è§å
- 表å令ç
- 注解éªè¯
- æ项
- ç¼å
- Session
- Cookie
- å¤è¯è¨
- ä¸ä¼
- å½ä»¤è¡
- å¯å¨å ç½®æå¡å¨
- æ¥ççæ¬
- èªå¨çæåºç¨ç®å½
- å建类åºæ件
- æ¸ é¤ç¼åæ件
- çææ°æ®è¡¨å段ç¼å
- çæè·¯ç±æ å°ç¼å
- è¾åºè·¯ç±å®ä¹
- èªå®ä¹æ令
- æ©å±åº
- æ°æ®åºè¿ç§»å·¥å ·
- Workerman
- thinkå©æå·¥å ·åº
- éªè¯ç
- Swoole
- éå½
- å©æå½æ°
- å级æ导
- æ´æ°æ¥å¿