zoukankan      html  css  js  c++  java
  • 如何升级laravel5.4到laravel5.5并使用新特性?

    如何升级laravel5.4到laravel5.5并使用新特性?

    修改composer.json:

    "laravel/framework": "5.5.*",
    
    "phpunit/phpunit": "~6.0"
    

    scripts增加:

            "post-autoload-dump": [
                "Illuminate\Foundation\ComposerScripts::postAutoloadDump",
                "@php artisan package:discover"
            ]
    

    执行composer update -vvv

    新特性1: 扩展包自动发现

    为扩展包增加了一个自动发现功能。

    以barryvdh/laravel-debugbar为例,先删除这个包。composer remove barryvdh/laravel-debugbar

    先把APP里面的BarryvdhDebugbarServiceProvider::class,去掉。

    就删除成功了。

    再重新安装:

    我们看github上这个包最新版的
    Installing barryvdh/laravel-debugbar (v3.1.0): Downloading (100%)

    里面的包的composer.json有这么一个说明:

    "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 AppHttpResources;
    
    use IlluminateHttpResourcesJsonResourceCollection;
    
    class PostCollection extends ResourceCollection
    {
        /**
         * Transform the resource collection into an array.
         *
         * @param  IlluminateHttpRequest
         * @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 AppHttpResourcesPostCollection(AppPost::all());
    });
    

    并且在AppPost中重新定义toArray()

    public function toArray()
        {
            return [
                "id" => $this->id,
                "title" => $this->title,
            ];
        }
    

    那么这个时候就返回了:

    有人说,其实laravel中在控制器中直接返回对象也就是调用它们的toArray方法,那么如果你把上式的路由修改为:

    Route::get('/api/posts', function () {
        return new AppHttpResourcesPostCollection(AppPost::paginate(3));
    });
    

    你就感觉到增加这个"api resource"的方便性了:统一API返回结构,并且让你少写了很多代码。

    特性3: command能自动注册

    我们之前自定义的Command需要在ConsoleCommandsKernel.php中写上每个Command:

    class Kernel extends ConsoleKernel
    {
        /**
         * The Artisan commands provided by your application.
         *
         * @var array
         */
        protected $commands = [
            AppConsoleCommandsESInit::class
        ];
    

    现在,不用了,只修改commands函数:

    protected function commands()
        {
            $this->load(__DIR__ . '/Commands');
    
            require base_path('routes/console.php');
        }
    

    特性4:验证规则类

    这个规则是为了我们的自定义验证规则。比如,我们的登录,需要邮箱后缀为gmail.com才能登录。那么这个时候我们就需要定义一个验证规则类:

    php artisan make:rule ValidLoginEmail
    

    我们在AppRules文件夹下面看到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 AppExceptionsForbiddenException) {
                return response()->view("exceptions/forbidden");
            }
            return parent::render($request, $exception);
        }
    

    这样自定义异常定义多了,这个函数就非常冗余。

    现在的方法就是,在自定义异常里面定义一下render方法就行

    <?php
    namespace AppExceptions;
    
    class ForbiddenException extends Exception
    {
        /**
         * Report the exception.
         *
         * @return void
         */
        public function report()
        {
            //
        }
    
        /**
         * Report the exception.
         *
         * @param  IlluminateHttpRequest
         * @return void
         */
        public function render($request)
        {
            return response()->view("exceptions/forbidden");
        }
    
    }
    

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

    如果你这个路由什么逻辑都没有,只是渲染一个模版,那么就很适合使用这个方法。比如创建文章页面:

    原先:

    Route::get('/posts/create', 'AppHttpControllersPostController@create');
    
    
        // 创建页面
        public function create()
        {
            return view("post/create");
        }
    

    现在:

    // 创建文章
        Route::view('/posts/create', 'post/create');
    

    这个功能大赞,能让人少写很多代码。

    更多5.5新特性请看:
    https://laravel.com/docs/5.5/releases

  • 相关阅读:
    算法题:N皇后-2
    算法题:串联所有单词的子串
    算法题:二叉树的垂序遍历
    算法题:只出现一次的数字 三
    算法题:等价多米诺骨牌对的数量
    算法:判定字符是否唯一
    算法题:字符串相乘
    算法题:字符串的排列
    算法题:单词规律
    算法题:连通网络的操作次数
  • 原文地址:https://www.cnblogs.com/yjf512/p/7719893.html
Copyright © 2011-2022 走看看