修改composer.json:php
"laravel/framework": "5.5.*", "phpunit/phpunit": "~6.0"
scripts增長:前端
"post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover" ]
執行composer update -vvvlaravel
爲擴展包增長了一個自動發現功能。git
以barryvdh/laravel-debugbar爲例,先刪除這個包。composer remove barryvdh/laravel-debugbargithub
先把APP裏面的Barryvdh\Debugbar\ServiceProvider::class,去掉。json
就刪除成功了。bootstrap
再從新安裝:api
咱們看github上這個包最新版的
Installing barryvdh/laravel-debugbar (v3.1.0): Downloading (100%)app
裏面的包的composer.json有這麼一個說明:composer
"extra": { "branch-alias": { "dev-master": "3.0-dev" }, "laravel": { "providers": [ "Barryvdh\\Debugbar\\ServiceProvider" ], "aliases": { "Debugbar": "Barryvdh\\Debugbar\\Facade" } } },
咱們看到,在bootstrap/cache/packages.php裏面已經寫上了debugbar,而且咱們在頁面上也能夠看到有debugbar的存在。可是咱們並不須要在app.php裏面增長debugbar的serviceProvider了。很是方便!!!
就是說,咱們引入的包裏面,只要有這個extra.laravel的說明,後面的providers和alias會自動增長到框架中去。
這個特性的功能就是把資源直接做爲api返回給前端,而且進行須要的包裝。
這裏的resource就是返回資源,咱們能夠建立這麼一個返回資源,這個資源會被包裝在data字段中,json,api返回。
好比建立一個PostCollection資源。表明文章集合。
php artisan make:resource PostCollection
我但願返回的api裏面有兩個字段:data和meta,data表明的就是文章集合,meta表明的是一些附屬的元數據信息。
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class PostCollection extends ResourceCollection { /** * Transform the resource collection into an array. * * @param \Illuminate\Http\Request * @return array */ public function toArray($request) { return parent::toArray($request); } public function with($request) { return [ 'meta' => [ 'site' => 'laravel55', ], ]; } }
在路由中:
Route::get('/api/posts', function () { return new \App\Http\Resources\PostCollection(\App\Post::all()); });
而且在\App\Post中從新定義toArray()
public function toArray() { return [ "id" => $this->id, "title" => $this->title, ]; }
那麼這個時候就返回了:
有人說,其實laravel中在控制器中直接返回對象也就是調用它們的toArray方法,那麼若是你把上式的路由修改成:
Route::get('/api/posts', function () { return new \App\Http\Resources\PostCollection(\App\Post::paginate(3)); });
你就感受到增長這個"api resource"的方便性了:統一API返回結構,而且讓你少寫了不少代碼。
咱們以前自定義的Command須要在Console\Commands\Kernel.php中寫上每一個Command:
class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ \App\Console\Commands\ESInit::class ];
如今,不用了,只修改commands函數:
protected function commands() { $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); }
這個規則是爲了咱們的自定義驗證規則。好比,咱們的登陸,須要郵箱後綴爲gmail.com才能登陸。那麼這個時候咱們就須要定義一個驗證規則類:
php artisan make:rule ValidLoginEmail
咱們在App\Rules文件夾下面看到ValidLoginEmail類:
class ValidLoginEmail implements Rule { /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { $strs = explode("@", $value); if (count($strs) == 2 && $strs[1] == "gmail.com") { return true; } return false; } /** * Get the validation error message. * * @return string */ public function message() { return '郵箱必須是gmail結尾'; } }
而後再修改loginController的login()的驗證部分:
$this->validate(request(),[ 'email' => ['required', new ValidLoginEmail(), 'email'], 'password' => 'required|min:5|max:10', 'is_remember' => 'integer' ]);
效果:
仍是login方法,咱們也能夠這樣寫:
public function login(Request $request) { // 驗證 $request->validate([ 'email' => ['required', new ValidLoginEmail(), 'email'], 'password' => 'required|min:5|max:10', 'is_remember' => 'integer' ]);
再也不須要使用
$this->validate(request(),[
這樣作的好處是更語義化了:驗證請求符合下列規則...
在之前,咱們自定義一個Exception類,要想這個異常單獨處理,就須要在Handler.php裏面的render方法這麼寫:
public function render($request, Exception $exception) { if ($exception instanceof \App\Exceptions\ForbiddenException) { return response()->view("exceptions/forbidden"); } return parent::render($request, $exception); }
這樣自定義異常定義多了,這個函數就很是冗餘。
如今的方法就是,在自定義異常裏面定義一下render方法就行
<?php namespace App\Exceptions; class ForbiddenException extends \Exception { /** * Report the exception. * * @return void */ public function report() { // } /** * Report the exception. * * @param \Illuminate\Http\Request * @return void */ public function render($request) { return response()->view("exceptions/forbidden"); } }
若是你這個路由什麼邏輯都沒有,只是渲染一個模版,那麼就很適合使用這個方法。好比建立文章頁面:
原先:
Route::get('/posts/create', '\App\Http\Controllers\PostController@create'); // 建立頁面 public function create() { return view("post/create"); }
如今:
// 建立文章 Route::view('/posts/create', 'post/create');
這個功能大讚,能讓人少寫不少代碼。
更多5.5新特性請看: https://laravel.com/docs/5.5/releases