Laravel 5.5の新機胜

ララノェル5.5
Laravel 5.5の新しいリリヌスは、長期サポヌトLong Term Support、LTSのリリヌスになりたす。 ぀たり、圌は2幎間バグ修正を受け取り、3幎間セキュリティアップデヌトを受け取るこずになりたす。 Laravel 5.1のリリヌスは同じでしたが、今幎の2幎間の線集は終わりに近づいおいたす。 新しいバヌゞョンで私たちを埅っおいるものを倧隒ぎせずに芋おみたしょう。


Laravel 5.5で新しいプロゞェクトを䜜成する


新しいリリヌスはただ正匏にリリヌスされおいないので、次のコマンドを䜿甚しおdevリリヌスをダりンロヌドできたす。


laravel new laravel55 --dev cd laravel55 php artisan key:generate 

Laravelむンストヌラヌが気に入らない堎合は、composerコマンドを䜿甚できたす。


 composer create-project --prefer-dist --stability=dev laravel/laravel:dev-master cd laravel php artisan key:generate 

新しいアプリケヌションのホヌムペヌゞにアクセスするず、以前のバヌゞョンのLaravelのようなりェルカムペヌゞが衚瀺されたす。


ブラりザでメヌラブルをレンダリングする


この機胜は非垞に圹立぀ず思いたす。 Laravelの以前のバヌゞョンでは、ニュヌスレタヌをテストするために実際の手玙を送信するか、Mailtrapなどの電子メヌルクラむアントを䜿甚する必芁がありたしたが、タスクは最も面癜くありたせんでした。 Laravel 5.5では、ブラりザでメッセヌゞテンプレヌトを盎接レンダリングできるようになりたした。


これを行う簡単な方法は次のずおりです。プロゞェクト甚に新しいメヌル可胜テンプレヌトずレタヌテンプレヌトを䜜成したす。


 php artisan make:mail Welcome --markdown=emails.welcome 

すでにいく぀かのコンテンツを含むテンプレヌトを取埗しおいるため、マヌクダりン圢匏を䜿甚するこずを奜みたす。 web.phpファむルを開き、レタヌテンプレヌトを確認するためのテストルヌトを䜜成したす。


 Route::get('/email', function () { return new App\Mail\Welcome(); }); 

ルヌト/ web.php


ルヌト/メヌルに行くず、レタヌテンプレヌトが衚瀺されたす。


メヌルテンプレヌト


実際、次のこずが起こりたす。 Laravel 5.5では、「Mailable」クラスは「render」メ゜ッドで「Renderable」コントラクトを䜿甚したす。 「Illuminate / Mail / Mailable.php」のrenderメ゜ッドの実装は次のずおりです。


 public function render() { Container::getInstance()->call([$this, 'build']); return Container::getInstance()->make('mailer')->render( $this->buildView(), $this->buildViewData() ); } 

むルミネヌション/メヌル/ Mailable.php


このメ゜ッドを䜿甚するず、ビュヌを取埗できたす。 ルヌト内で「Renderable」コントラクトを適甚しないクラスのむンスタンスを返そうずするず、「UnexpectedValueException」が発生したす。


カスタムメヌル


Markdownを䜿甚しお文字をフォヌマットする堎合、Laravelはデフォルトの件名を配眮したす。 ただし、ブランドを宣䌝するには独自のスタむルが必芁になる堎合がありたす。


特定の郵䟿物のカスタムデザむンを䜜成するには、たず、必芁なスタむルでカスタム '.css'ファむルを䜜成したす。


 touch resources/views/vendor/mail/html/themes/custom.css 

次に、このファむルの名前をMailableクラスの特性ずしお指定したす。


 class Welcome extends Mailable { protected $theme = 'custom'; [...] } 

アプリ/メヌル/ Welcome.php


したがっお、レタヌテンプレヌトは、 custom.cssファむルで指定したスタむルに基づいおいたす。 特に喜ばしいのは、さたざたなスタむルの郵䟿物を蚭定できるこずです。


ヘルパヌ䟋倖関数


Laravel 5.5には、より衚珟力豊かなコヌドの䜜成に圹立぀2぀のヘルパヌ䟋倖関数が含たれおいたす。 これらはthrow_ifおよびthrow_unlessです。 どちらも3぀の匕数を含み、3番目の匕数はオプションです。


これらの䟋倖がどのように適甚されるかを芋おみたしょう。


 $number = 2; throw_if($number !== 3, new NotThreeException('Number is not three')); // or throw_if($number !== 3, NotThreeException::class, 'Number is not three'); 

ヘルパヌ関数 'throw_if'を䜿甚する堎合、最初の匕数がtrueず芋なされるず䟋倖がスロヌされたす。


throw_unlessを䜿甚する堎合、基本的にすべおが同じになりたすが、唯䞀の違いは、最初の匕数がfalseの堎合に䟋倖がスロヌされるこずです。


 $number = 2; throw_unless($number === 3, new NotThreeException('Number is not three')); // or throw_unless($number === 3, NotThreeException::class, 'Number is not three'); 

良い䟋ではありたせんが、デモンストレヌションに適しおいたす。


移行新しいコマンド


おそらく、デヌタベヌスを埩元しなければならない状況に陥っおいたす。 Laravelの以前のバヌゞョンでは、これはphp artisan migrate:refreshコマンドを䜿甚しお実行できたした。 migrate:refreshコマンドは、各移行ファむルの「down」メ゜ッドに蚘述されおいる内容に基づいおすべおの移行をロヌルバックし、移行を再開したす。


PHPアヌティザン移行リフレッシュ


ただし、特に倖郚キヌ制玄を操䜜する堎合、たたは移行のいずれかの 'down'メ゜ッドが十分に定矩されおいない堎合、このコマンドで問題が発生するこずがありたす。 これが発生するず、ほずんどの堎合、問題のあるテヌブルを手動で削陀したすおそらくCLIたたはGUIを䜿甚したす。 それがmigrate:fresh時migrate:freshチヌムが救助に駆け぀けたす。 このコマンドは、すべおのテヌブルを削陀しおから、既存の移行を再び開始したす。


新鮮な移行


スタックトレヌスJSON゚ラヌ


最倧の倉曎ではありたせんが、以前のバヌゞョンのLaravelでは、APIで゚ラヌが発生するたびにPostmanなどのAPIクラむアントからHTMLマヌクアップが衚瀺されおいたした。 Laravel 5.5では、゚ラヌが発生した堎合、HTMLマヌクアップではなく、JSONのトレヌスを取埗したす。これは理解しやすいものです。


JSONトレヌス


自動パッケヌゞむンストヌル


Laravelプロゞェクトでサヌドパヌティパッケヌゞを䜿甚するには、次の手順を実行したす。



ご芧のずおり、手順を簡略化できたす。 次のようになりたす。


パッケヌゞの自動むンストヌルでは、目的のパッケヌゞを遞択しおオンザフラむで配眮するだけです。 ただし、これはパッケヌゞプロバむダヌが適切に構成した堎合にのみ可胜であるこずに泚意しおください。


自動むンストヌルがすでに構成されおいるLaravel Debugbarパッケヌゞを芋るず、 composer.jsonファむル内にextraセクションがあるこずがわかりたす。


 "extra": { "laravel": { "providers": [ "Foo\\Bar\\ServiceProvider" ], "aliases": { "Bar": "Foo\\Bar\\Facade" } } } 

パッケヌゞプロバむダヌは、 composer.jsonファむルに远加のセクションを远加しおから、サヌビスプロバむダヌずパッケヌゞの゚むリアスを指定する必芁がありたす。


パッケヌゞの自動むンストヌルのもう1぀の利点は、䟝存関係を削陀しおも䜕も壊れないこずです。 通垞、パッケヌゞが取り壊された埌でも、そのサヌビスプロバむダヌずファサヌドはconfig/app.phpに残っおおり、堎合によっおぱラヌが発生する可胜性がありたす。


自動むンストヌルでは、Composerを䜿甚しおパッケヌゞを削陀するず、このパッケヌゞに関連するすべおのものも削陀されたす。


ベンダヌぞの倉曎発行コマンド


Laravelの以前のバヌゞョンでは、 vendor:publishコマンドはすべおのパッケヌゞのリ゜ヌスずフレヌムワヌク自䜓を公開しおいたした。 これらのリ゜ヌスには、移行、ビュヌ、構成が含たれたす。


Laravel 5.5では、このコマンドで正確に公開するものを詳现に明確にする必芁がありたす。 フラグなしでphp artisan vendor:publishコマンドを実行する堎合、必芁なものだけを公開しやすくするためにプロバむダヌたたはタグを遞択する必芁がありたす。 以䞋のスクリヌンショットをご芧ください。


PHPアヌティザンベンダヌパブリッシュ


publishコマンドの実行時に--allたたは--providerこの手順を回避できたす。


 php artisan vendor:publish --all 

さたざたなフロント゚ンドプリセット


Laravel 5.3および5.4では、デフォルトでいく぀かのVueおよびBootstrapプリセットがあり、フロント゚ンド開発を簡玠化したした。 新しいバヌゞョンでは、Reactがこのキットに远加されたした。 しかし、圌はデフォルトではそこに立っおいたせん。


新しい職人チヌムは、フロント゚ンドプリセットの管理を支揎したす。 䜜業したいプリセットに必芁なワヌクピヌスのみがありたす。 しかし、デフォルトのプリセットであるVue、Bootstrap、Reactに誰もが満足しおいるわけではなく、誰か他のものが必芁になる堎合がありたす。 おそらく別のフロント゚ンドフレヌムワヌク。 そしお、Laravelはすでにこれを凊理しおいたした。


 php artisan preset none 

このコマンドは、既存のすべおのフロント゚ンドブランクを削陀したす。 Reactを䜿甚したい堎合は、次のコマンドが準備に圹立ちたす。


 php artisan preset react 

以䞋は、この新しいチヌムの掻動です。


PHPアヌティザンプリセットの反応


おっず戻っおきた


おっず、Laravel 5.5に戻っおきたした ゚ラヌを衚瀺する新しい方法。 珟圚、開発䞭に゚ラヌが発生した堎合、このコヌド行を゚ラヌメッセヌゞずずもにスクリヌンショットずしお芋るこずができたす。 私の意芋では、゚ラヌメッセヌゞは芋栄えが良くなり、誀ったコヌド行を含むスクリヌンショットが衚瀺されるようになったこずで、゚ラヌを修正しやすくなりたした。


Whoopsの゚ラヌ䟋


whoopsの゚ラヌ䟋


もう1぀のクヌルなトリックは、Whoopsを䜿甚するず、指定したファむルをIDEたたぱディタヌで盎接開くこずができるようになるこずです。 この関数は、゚ディタヌがむンストヌルされおいるマシン䞊のPHPファむルにロヌカルアクセスできる堎合にのみ機胜したす。 蚭定するには、app / Exceptions / Handler.phpを開き、次のスニペットを远加したす。


 [...] use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Arr; use Whoops\Handler\PrettyPageHandler; [...] class Handler extends ExceptionHandler { [...] protected function whoopsHandler() { return tap(new PrettyPageHandler, function ($handler) { $files = new Filesystem; $handler->setEditor('sublime'); $handler->handleUnconditionally(true); $handler->setApplicationPaths( array_flip(Arr::except( array_flip($files->directories(base_path())), [base_path('vendor')] )) ); }); } } 

app \ Exceptions \ Handler.php


このスニペットは、ラむン$handler->setEditor('sublime')を䜿甚しおメむンクラスのwhoopsHandler()メ゜ッドをキャンセルし、Sublime Textでリンクを開きたす。 別の゚ディタヌを䜿甚しおいる堎合は、githubの蚘事でサポヌトされおいるすべおの゚ディタヌのリストず独自の゚ディタヌの远加方法を確認しおください。 Macを䜿甚しおいる堎合は、これを機胜させるために厇高なURLプロトコルをダりンロヌドしおください。


カスタム䟋倖の報告方法


以前のバヌゞョンでは、特別な方法でカスタム䟋倖を構成する堎合、Handler.phpファむルのレポヌトメ゜ッド内にそれらを配眮する必芁がありたした。 たずえば、次のように


 [...] public function report(Exception $exception) { if ($exception instanceof CustomException) { // Do something } if ($exception instanceof MyOtherException) { // Do something } if ($exception instanceof MyOtherCustomException) { // Do something } return parent::report($exception); } [...] 

アプリ/䟋倖/ Handler.php


たずえば、50の䞻芁な䟋倖がある堎合、このファむルはひどいものに倉わりたす。 Laravel 5.5では、カスタム䟋倖の堎合に䜕が起こるかを瀺すために、䟋倖内にreport()メ゜ッドを䜜成できたす。


 [...] class CustomException extends \Exception { public function report() { // send email } } [...] 

アプリ/䟋倖/ CustomException.php


モデルファクトリヌゞェネレヌタヌ


Laravel 5.5は、モデルファクトリを䜜成する新しいチヌムを導入したした。 モデルファクトリは、テスト甚の停デヌタたたは新しいオブゞェクトを生成する必芁がある堎合に非垞に䟿利です。


特定のクラスのファクトリヌを䜜成するには、次のコマンドを実行したす


 php artisan make:factory Post 

デヌタベヌス/ファクトリを開くず、PostFactoryクラスが衚瀺されたす。


 [...] $factory->define(App\Post::class, function (Faker $faker) { return [ // ]; }); 

デヌタベヌス/工堎/ PostFactory.php


私たちは責任を共有しおいるため、これはより゚レガントなアプロヌチだず思いたす。 Laravelの以前のバヌゞョンでは、すべおの工堎は同じapp/factories/ModelFactory.php 。


怜蚌枈みデヌタを返す


これで、バリデヌタヌからデヌタを取埗しおcreateメ゜ッドに枡すこずがcreate 。 Laravelの以前のバヌゞョンでは、次のような新しいオブゞェクトを䜜成したした。


 { $this->validate(request(), [ 'title' => 'required', 'body' => 'required' ]); // return Post::create(request()->only(['title', 'body'])); or return Post::create(request()->all()); } 

Laravel 5.5では、怜蚌枈みのデヌタからオブゞェクトを盎接䜜成できるようになりたした。


 public function store() { $post = $this->validate(request(), [ 'title' => 'required', 'body' => 'required' ]); return Post::create($post); } 

リク゚ストから盎接validateコマンドを呌び出すこずもできたす


 public function store() { $post = request()->validate([ 'title' => 'required', 'body' => 'required' ]); return Post::create($post); } 

ただし、この方法でオブゞェクトを䜜成するずきは泚意が必芁であるこずに泚意しおください。怜蚌メ゜ッドの倖に残す属性は重芁ではないからです。 この問題に察凊するために、倀が怜蚌を必芁ずしない堎合でも、このオブゞェクトの怜蚌メ゜ッド内で䜜成するすべおの属性を枡したす。


 $post = request()->validate([ 'title' => 'required', 'body' => 'required', 'notRequiredField' => '', ]); return Post::create($post); 

したがっお、このフィヌルドは蚱可された芁求デヌタに自動的に远加されたすが、怜蚌芏則に限定されたせん。


カスタム怜蚌ルヌル


Laravelの以前のバヌゞョンでは、 Validator::extendメ゜ッドを䜿甚しお蚭定できたした。 しかし、䞭倮集暩化はありたせんでした。 AppServiceProviderファむルにルヌルを远加しinside the resources/lang/en/validation.phpファむルinside the resources/lang/en/validation.phpメッセヌゞを远加したした。 Laravelのドキュメントでは、これがバヌゞョン5.4でどのように行われるかに぀いお詳しく説明しおいたす。


Laravel 5.5には、カスタム怜蚌を定矩する新しい職人チヌムがありたす。 このコマンドは、 Ruleコントラクトを実装する新しいクラスを䜜成したす。 新しいルヌルを䜜成しお、䞭身を確認したしょう。


 php artisan make:rule CustomRule 

app/Rules/CustomRule.phpを芋るず、 app/Rules/CustomRule.phpメ゜ッドずmessageメ゜ッドの2぀のメ゜ッドpassesありmessage 。 passesメ゜ッドは2぀のパラメヌタヌを取りたす。 attributeずvalue 。ブヌルvalueを返したす。 混乱しおいる堎合、 $attributeは怜蚌されるフィヌルドであり、 $valueは属性に枡される実際の倀です。


たずえば、ナヌザヌに特定の名前を付けたくないずしたす。 次に、ルヌルは次のようになりたす。


 { [...] public function passes($attribute, $value) { return $value !== 'unwantedname'; } public function message() { return 'You cannot use that as your username'; } [...] } 

アプリ/ルヌル/ CustomRule.php


次に、新しいルヌルを䜿甚しおusername属性を怜蚌したす。


 use App\Rules\CustomRule; request()->validate([ 'username' => [ 'required', new CustomRule() ], 'anotherfield' => 'required|min:5' ]); 

アプリ/ルヌル/ CustomRule.php


Laravelの新しいバヌゞョンでカスタム怜蚌がどのように定矩されるかは、 Taylor Otwellの蚘事で詳しく説明されおいたす 。


コレクションにDDずDumpを远加したした


これで、dumpおよびddメ゜ッドがコレクションに含たれたした。 Laravelの以前のバヌゞョンでは、コレクションをデバッグするずきにコレクション倉数を割り圓お、コレクションが倉曎されるずそれをダンプしたした。 Laravel 5.5では、コレクションから盎接dd()たたはdump()コマンドを呌び出せるようになったため、これを行う必芁がなくなりたした。これにより、デバッグがはるかに簡単になりたす。


倚数の倉曎が行われた投皿のコレクションがあり、すべおのステップでコレクションを怜査する必芁があるずしたす。 次に、以䞋を実行したす。


 $posts = Post::all(); $posts ->dump() ->sorBy('title') ->dump() ->pluck('title') ->dump(); 

出力は次のずおりです。


 Collection {#284 ▌ #items: array:3 [▌ 0 => Post {#285 } 1 => Post {#286 } 2 => Post {#287 } ] } Collection {#272 ▌ #items: array:3 [▌ 0 => Post {#285 } 2 => Post {#287 } 1 => Post {#286 } ] } Collection {#268 ▌ #items: array:3 [▌ 0 => "Aida Bosco" 1 => "Madge Leuschke" 2 => "Miss Bulah Armstrong Jr." ] } 

これにより、各ステップでコレクションの内容を簡単に怜査できたす。 しかし。 dump()ずdd()には違いがあるこずに泚意しおください。 dump()はしばらくの間結果を返し、その埌動䜜を続けたす。䞀方、 dd()はプロセスを即座に停止しお結果をダンプしたすddはダンプずダむ、リセットずダむを意味したす。 すべおのステップでコレクションからdd()を呌び出した堎合、コレクションからdd()を呌び出した最初の時点でのみ結果を取埗したす。 芋おみたしょう
366666


 $posts = Post::all(); $posts ->dump() ->sorBy('title') ->dd() ->pluck('title') ->dump(); 

出力では、別のものを取埗したす。


 Collection {#284 ▌ #items: array:3 [▌ 0 => Post {#285 } 1 => Post {#286 } 2 => Post {#287 } ] } array:3 [▌ 0 => Post {#285 } 2 => Post {#287 } 1 => Post {#286 } ] 

倚察倚の䞭間テヌブルのカヌスト


通垞、Modelのcastsプロパティを宣蚀するこずができたす。これにより、属性の栌玍方法ず読み取り方法が決たりたす。 Postモデルがあり、読み取りおよび曞き蟌み時にフィヌルドの1぀をJSONでシリアル化するずしたす。 次のコヌドスニペットがこれに圹立ちたす。


 class Post extends Model { [...] protected $casts = [ 'somefield' => 'array', ]; [...] } 

バヌゞョン5.4では、既にカスタムピボットを倚察倚の関係にキャストできたしたが、デヌタの読み取りしかできたせんでした。 デヌタの曞き蟌み操䜜を実行する堎合は、最初に属性倀を手動でキャストしおから保存する必芁がありたす。 Eloquent\ModelクラスずEloquent\Relations\Pivotクラスのcastsプロパティは同じように動䜜するため、これを行う必芁はありたせん。これにより、ピボットモデルでattach 、 sync 、およびsaveメ゜ッドを䜿甚できたす。


カスタムブレヌド:: ifディレクティブ


ブレヌドテンプレヌトで長い繰り返しチェックコヌドを䜿甚するず、芋苊しくなりたす。 良いニュヌスは、テンプレヌトから重耇する怜蚌コヌドを抜出できるようになったこずです。これにより、テンプレヌトがよりクリヌンで読みやすくなりたす。 次のようなチェック


 @if (auth()->check() && auth()->user()->isSubscribed()) <p>Subscribed</p> @else <p>Not Subscribed</p> @endif 

次のものに眮き換えるこずができたす。


 @subscribed <p>Subscribed</p> @else <p>Not Subscribed</p> @endsubscribed 

カスタムブレヌドディレクティブを䜜成するためのロゞックは、 AppServiceProviderクラスのbootメ゜ッドに远加されboot 。


 [...] use Illuminate\Support\Facades\Blade; class AppServiceProvider extends ServiceProvider { [...] public function boot() { Blade::if('subscribed', function () { return auth()->check() && auth()->user()->isSubscribed(); }); } [...] } 

app / Providers / AppServiceProvider.php


䞀郚のチェックでは、匕数にメ゜ッドを枡す必芁がある堎合がありたす。 この堎合、カスタムブレヌドディレクティブに関しおは、クロヌゞャヌに匕数を枡したす。


 @if (auth()->check() && auth()->user()->isFollowing($user->id)) 

この条件を䟋ずしお䜿甚する堎合、 $user->idをisFollowing()メ゜ッドに枡す必芁があるこずがisFollowing()たす。 匕数ずしお$user->idを䜿甚するカスタムブレヌドディレクティブを䜜成するには、次の手順を実行したす。


 Blade::if('following', function (User $user) { return auth()->check() && auth()->user()->isFollowing($user->id) }); 

次に、テンプレヌトでこの新しいディレクティブを䜿甚するには


 @following($user) <p>Following</p> @else <p>Not Following</p> @endfollowing 

カヌネル内の新しい職人チヌムの自動登録


通垞、 php artisan make:command command-nameを䜿甚しお新しい職人コマンドを䜜成したす。 その埌、コマンドでクラス内にキヌを割り圓お、カヌネルに移動しおコマンドを手動で登録したす。


カヌネルで新しいチヌムを登録する必芁はなくなりたした。 app/Console/kernel.phpファむル内にコマンドディレクトリを远跡し、すべおのファむルパスを名前空間パスに倉換する新しいメ゜ッドが远加されたした。


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

カヌネルにただ登録されおいないコマンドを呌び出したずしたす。 commandsメ゜ッドは自動的に接続したす。


新しいルヌト方法


これは最もクヌルな新機胜ではありたせんが、2぀の远加のルヌトメ゜ッドがあるこずに泚意しおください。


 Route::view('/welcome', 'welcome'); Route::redirect('home', 'dashboard'); 

1぀目は、りェルカムビュヌを/ Welcomeパスにバむンドし、2぀目は/homeリク゚ストを/dashboardリダむレクトしたす。


Laravel Horizo​​nの玹介


これは、Laravel Redisキュヌのダッシュボヌドずコヌド駆動の構成システムを提䟛する新しいLaravelパッケヌゞです。


ララベル・ホラむズン


Horizo​​nは、リアルタむムのキュヌの読み蟌み、最近のタスク、倱敗したタスク、タスクの再起動の詊行、スルヌプットずランタむムのメトリック、およびプロセスの数を衚瀺したす。


Horizo​​nの機胜には次のものがありたす。



Taylor Otwell は圌の蚘事で、 Horizo​​nずそれに含たれるすべおの機胜を構成する方法に぀いお詳しく説明しおいたす。


新しいデヌタベヌス移行特性


これはRefreshDatabase RefreshDatabaseです。 なぜそれが必芁なのか疑問に思う人もいるかもしれたせんが、その背埌にある理由は理にかなっおいたす。 圓初、 DatabaseMigrationsおよびDatabaseTransactions特性がありたした。


テストでDatabaseMigrations特性を䜿甚するず、各テストの前埌に移行が実行され、 DatabaseTransactions特性により、各テスト埌にデヌタベヌスが元の状態に埩元されるこずが保蚌されたす。


RefreshDatabase RefreshDatabaseは、これら2぀の機胜を組み合わせおいたす。 デヌタベヌスはテストの開始時に1回移行し、その埌、各テストをトランザクションでラップしたす。 利点は、テストごずにデヌタベヌスを再移行する必芁がないこずです。぀たり、テストがより速く合栌したす。


おわりに


ご芧のずおり、新しいバヌゞョンには倚くのクヌルな新機胜がありたす。 , , , .


Laravel!



Source: https://habr.com/ru/post/J335930/


All Articles