修改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