如何升級laravel5.4到laravel5.5並使用新特性?

如何升級laravel5.4到laravel5.5並使用新特性?

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

新特性1: 擴展包自動發現

爲擴展包增長了一個自動發現功能。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會自動增長到框架中去。

新特性2: api resources

這個特性的功能就是把資源直接做爲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返回結構,而且讓你少寫了不少代碼。

特性3: command能自動註冊

咱們以前自定義的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');
    }

特性4:驗證規則類

這個規則是爲了咱們的自定義驗證規則。好比,咱們的登陸,須要郵箱後綴爲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'
        ]);

效果:

新特性5: request增長了validate方法

仍是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(),[
這樣作的好處是更語義化了:驗證請求符合下列規則...

新特性6: 自定義Exception增長了render和report方法

在之前,咱們自定義一個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");
    }

}

新特性7: 增長了Route::view方法

若是你這個路由什麼邏輯都沒有,只是渲染一個模版,那麼就很適合使用這個方法。好比建立文章頁面:

原先:

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

相關文章
相關標籤/搜索