0%

New in Laravel 5.5 Notes

New in Laravel 5.5 Notes

01 Whoops

02 Streamlined Request Validation

  • 新增了CSRF過期的頁面,忘了加CSRF的話也會出現
  • Syntactic sugar for validate
1
2
3
4
5
6
7
8
9
10
// 以前的語法:失敗時會自動Redirect並傳回$error
$this->validate($request, [ // or \Validator::make($request->all(), []);
'title' => 'required',
]);
// $validated 只會return驗證過的欄位名稱
$validated = $request->validate([
'title' => 'required',
]);
\App\Post::Create($validated); // nice and clean way

03 Fresh Migrations

  • php artisan migrate:fresh
    • Drop all tables and migrate
    • 以前的migrate:refresh是rollback all and migrate

04 Frontend Presets

  • 剛開專案時,幫你快速建構前端scaffolding或刪掉
  • php artisan preset
    • php artisan preset none
    • php artisan preset bootstrap
    • php artisan preset vue
    • php artisan preset react
  • 想看更多請到:/vendor/laravel/framework/src/Illuminate/Foundation/Console/PresetCommand.php

05 Automatic Package Discovery

  • 現在安裝套件可以直接在composer.json加上需要的
  • 以前的話要到config註冊

06 Faster Email Layout Testing

  • obj可以implements Renderable
  • 裡面的render()就可以return一些字串
  • 就可以在瀏覽器上預覽你的信件

07 Silky Smooth Custom Validation Rules

  • 需要Valication的Rule太多,不想重複寫。
  • 新指令:php artisan make:rule
  • 產生一個php檔在/app/Rules/
  • 到:/vendor/laravel/framework/src/Illuminate/Contracts/Validation/Rule.php 看要實作啥
  • 需要實作passes(), message()
1
2
3
4
// 最後寫成這樣 很方便
$validated = $request->validate([
'title' => new App\Rules\<name>
]);

08 Collection Dumping

  • 以前用 dd()(die and dump) 只能處理完再dd
  • 現在可以在Collection object上使用dump()
  • ex: $posts->dump();
  • 目的是例如想在處理函示前斷掉:$posts->shuffle()->dump()->sort()>dump(); 會顯示2次dump的結果

09 Model Factory Generation

  • 新指令:php artisan make:factory
  • 比以前更懶的意思,現在可以根據model自動生成factories
  • 一樣在 /database/factories/.php

10 Custom Blade “If” Directives

  • 把在view中的if條件式變成blade file
  • 失敗時記得先清掉view cache, php artisan view:clear
1
2
3
4
5
// 到/app/Providers/AppServiceProvider.php之boot()加上
\Blade::if('<name>', function ($param) {
return true;
})
// 就可以在blade中用 @<name> ... @end<name>

11 What’s New in Laravel Mix

  • Please Deposit a Quarter…

12 Auto-Registering Artisan Commands

  • 現在生成新的artisan command不用再到/app/Console/Kernel.php註冊了
  • 直接改生成檔案的建構子

13 Higher Order Tap

  • 更改了tap() 新增了 HigherOrderTapProxy.php
1
2
3
// Now
// P.S. $post->update($attributes); 不會回傳obj
return tap($post)->update($attributes);

14 The RefreshDatabase Trait

  • 以前,use Illuminate\Foundation\Testing\DatabaseMigrations; 可以讓你run test之前刷新資料表
  • 現在有一個新的 use Illuminate\Foundation\Testing\RefreshDatabase;
  • phpunit.xml可以新增env參數 決定要哪種refresh.

15 New Blade Directives

  • 10之前介紹過可以自己新增blade語法
  • 後來又預設加了這些
1
2
3
4
5
6
7
8
// 預設新增了這些
@auth // @if(auth()->check())
...
@endauth
@guest
...
@endguest

16 Route Helpers

1
2
3
4
5
6
7
8
9
10
11
// 以前
Route::get('自填', function () {
return redirect('home');
})
Route::get('自填', function () {
return view('welcome');
})
// 現在可以更懶
Route::redirect('自填', 'home');
Route::view('自填', 'welcome');

17 Toggle Exception Handling Within Your Tests

  • 有時候想略過Excepttion時使用
  • 新語法!
  • 在測試時,$this->withoutExceptionHandling();,很有用。

18 Cleaner Exception Rendering

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 通常的做法
try {
throw new XXX;
} catch (XXX $e) {
return redirect('...');
}
// 或到 app/Exceptions/Handler.php#render()新增
if ($exception instanceof XXX) {
return redirect('...');
}
// 現在可以在個別的exception class新增render()
class XXX extends \Exception {
public function render($request) {
return redirect('...');
}
}
// 讓controller可以更clean 使用這樣簡短語法即可:
throw new XXX;

19 Optional Objects

  • Optional.php
  • 有時候null obj我們還試著存取其中的attribute就會出錯
  • $user->profile->location; // 會得到 PHP error: non-object
  • 這時候用 optional($user->profile)->location;
  • 就只會回傳 null !!!
  • 原理是optional()會檢查傳進的值是否為obj

20 API Resources

  • 想做API時用
  • 也可以不用
  • 以前在controller裡面override toArray() 讓你變json很方便
  • 新指令 php artisan make:resource
  • 會新增/app/Http/Resources/.php
  • 現在可以
  • return new Resource($obj);
  • 也有toArray()
  • 還可以在resource裡面決定要return的欄位,就不用再model那邊麻煩設了
  • 另外還有這種 用在需要一堆資料return collection時
  • return new Resource::collection($obj);
  • 詳見:Illuminate\Http\Resources\Json\ResourceCollection