[Laravel] 6.0.4がリリースされました
laravel/frameworkのバージョン6.0.4がリリースされました。追加された機能について確認します。
TestResponseクラスにassertJsonPath()メソッドが追加されました (#29957)
指定されたパスに特定の値が存在することをアサートできます。
{
"title": "My blog post",
"body": "Lorem ipsum ...",
"tags": [],
"comments": [{
"body": "First!",
"user_id": 42,
"user": {
"id": 42,
"username": "ecrmnn"
}
}, {
"body": "This is my comment",
"user_id": 731,
"user": {
"id": 731,
"username": "ventrec"
}
}]
}
$this->getJson(route('api.post.show', [$post->id]))
->assertJsonPath('tags', [])
->assertJsonPath('comments.0.user.username', 'ecrmnn')
->assertJsonPath('comments.*.body', [
'First!',
'This is my comment',
]);
Eloquent BuilderクラスにMacroableに関するテストメソッドが追加されました (#30008)
Eloquent Builderに以下の3つのメソッドが追加され、Builderクラスにグローバルマクロ(またはそのインスタンス、ローカルマクロ)が登録されているかどうかをテストできるようになりました。
hasMacro()
getGlobalMacro()
hasGlobalMacro()
BelongsToManyクラスにgetPivotColumns()メソッドが追加されました (#30049)
BelongsToManyリレーションからピボットテーブルを直接取得できるようになりました。
ScheduleコマンドにScheduledTaskFinishedとScheduledTaskStartingイベントが追加されました (#29888)
InputArgumentおよびInputOptionクラスを利用してArtisanコマンドで引数とオプションの指定が可能になりました (#29987)
詳しい変更については以下を確認してください。
Release v6.0.4 · laravel/framework · GitHub
[Laravel] 6.0がリリースされました
Laravelのバージョン6.0がリリースされました。追加された機能について確認します。
LTS Version
Laravelのv6.0は新しいLTSのバージョンです。
Bug Fixesは2021年09月03日、Security Fixesは2022年09月03日までサポートされます。
以前のLTSバージョンであったv5.5については、Bug Fixesは2019年08月30日、Security Fixesは2020年08月30日までとなっています。
また重要な点として、PHPの7.2以上バージョンが必要です。
Releases
リリースノートでは以下のような追加機能が発表されています。
認可レスポンスの改善
Job内でのMiddlewareの利用
遅延ロードに対応したコレクション
EloquentモデルでSubqueryの利用方法の追加
laravel/uiパッケージを利用したフロントエンドのscaffolding
各項目についての詳細を確認します。
認可レスポンスの改善
以前は、ユーザーへの認可処理で拒否された場合に、拒否された内容をカスタムエラーメッセージとして提供することは困難でした。
Laravel 6では、ポリシー内での応答内容を提供するGate::inspect()メソッドが導入されています。
実装方法は、以前のポリシーやGate::define()メソッドの戻り値は真偽値を返す必要がありましたが、Illuminate\Auth\Access\Responseクラスを戻り値として利用します。
/**
* Determine if the user can view the given flight.
*
* @param \App\User $user
* @param \App\Flight $flight
* @return mixed
*/
public function view(User $user, Flight $flight)
{
return $this->deny('Explanation of denial.');
}
Gate::inspect()メソッドでは以下の通りメッセージの取得が可能で、Gate::allows()メソッドは今まで通り機能します。
$response = Gate::inspect('view', $flight);
if ($response->allowed()) {
// User is authorized to view the flight...
}
if ($response->denied()) {
echo $response->message();
}
ルートやコントローラーから$this->authorizeやGate::authorizeなどのヘルパーメソッドを使用すると、これらのカスタムメッセージがHTTPステータスコードと共にフロントエンドに自動的に返されます。
Job内でのMiddlewareの利用
ジョブミドルウェアを使用すると、キューに入れられたジョブの実行に関するカスタムロジックをラップして、ジョブ自体の定型的な要素を減らすことができます。
Laravel 6.0では、このロジックをジョブミドルウェアとして抽出し、実行に必要な制限からジョブのハンドルメソッドを解放することができます。
<?php
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;
class RateLimited
{
/**
* Process the queued job.
*
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')
->block(0)->allow(1)->every(5)
->then(function () use ($job, $next) {
// Lock obtained...
$next($job);
}, function () use ($job) {
// Could not obtain lock...
$job->release(5);
});
}
}
ミドルウェアを作成した後、ジョブのmiddleware()メソッドから返すことにより、ミドルウェアをジョブに添付できます。
// Add a middleware method to a job class
public function middleware()
{
return [new SomeMiddleware];
}
// Specify middleware when dispatching a job
SomeJob::dispatch()->through([new SomeMiddleware]);
遅延ロードに対応したコレクション
遅延ロードに対応するLazyCollectionクラスが追加されて、PHPのジェネレーターを活用して、メモリ使用量を低く抑えながら非常に大きなデータセットを操作できるようになりました。
たとえば、アプリケーションがLaravelのログを解析しながら、数ギガバイトのログファイルを処理する必要があるとします。
ファイル全体を一度にメモリに読み込む代わりに、遅延コレクションを使用して、指定された時間にファイルのごく一部のみをメモリに保持できます。
use App\LogEntry;
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
})
->chunk(4)
->map(function ($lines) {
return LogEntry::fromLines($lines);
})
->each(function (LogEntry $logEntry) {
// Process the log entry...
});
また、Eloquentモデルでも同様の遅延ロードが可能になりました。
QueryBuilderのcusror()メソッドを使用することで、LazyCollectionクラスのインスタンスが返却されます。
データベースに対して単一のクエリを実行するだけでなく、一度に1つのEloquentモデルのみをメモリにロードできます。
この例では、実際に10,000人のユーザーが登録済みの場合でも、反復処理するまでフィルターコールバックは実行されず、メモリ使用量を大幅に削減できます。
$users = App\User::cursor()->filter(function ($user) {
return $user->id > 500;
});
foreach ($users as $user) {
echo $user->id;
}
EloquentモデルでSubqueryの利用方法の追加
Laravel 6.0では、データベースのサブクエリのサポートにいくつかの新しい機能強化と改善が導入されています。
たとえば、フライトの目的地のテーブルと目的地へのフライトのテーブルがあるとします。フライトテーブルには、目的地にフライトが到着した時間を示すarrived_atカラムがあります。
Laravel 6.0の新しいサブクエリ選択機能を使用すると、1つのクエリを使用して、すべての目的地とその目的地に最後に到着したフライトの名前を選択できます。
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
])->get();
さらに、クエリビルダーのorderBy()メソッドに追加された新しいサブクエリ機能を使用して、最後のフライトがその目的地に到着した時刻に基づいてすべての目的地を並べ替えることができます。
繰り返しになりますが、これはデータベースに対して単一のクエリを実行中に行うことができます。
return Destination::orderByDesc(
Flight::select('arrived_at')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
)->get();
laravel/uiパッケージを利用したフロントエンドのscaffolding
Laravelの以前のリリースで通常提供されるフロントエンドの足場は、laravel / ui Composerパッケージに抽出されました。これにより、プライマリフレームワークとは別にファーストパーティUIの足場を開発およびバージョン管理できます。この変更の結果、デフォルトのフレームワークの足場にはBootstrapまたはVueコードが存在せず、フレームワークからmake:authコマンドも抽出されました。
Laravelの以前のリリースに存在する従来のVue / Bootstrap足場を復元するには、laravel / uiパッケージをインストールし、ui Artisanコマンドを使用してフロントエンド足場をインストールします。
以前のLaravelで提供されていたフロントエンドの初期設定はlaravel/uiパッケージに抽出されました。
この変更により、デフォルトのフレームワークの設定にはBootstrapやVueが存在せず、フレームワークからmake:authコマンドも抽出されました。
Laravelの以前のリリースに存在する従来のBootstrapやVueの初期設定を利用するには、laravel/uiパッケージをインストールし、uiコマンドを使用してインストールします。
composer require laravel/ui
php artisan ui vue --auth
詳しい変更については以下を確認してください。
Release Notes - Laravel - The PHP Framework For Web Artisans
[Laravel] 5.8.33がリリースされました
laravel/frameworkのバージョン5.8.33がリリースされました。追加された機能について確認します。
ValidatesWhenResolvedTraitクラスにpassedValidation()メソッドが追加されました (#29549)
FormRequestクラスを使ってリクエストのバリデーションを行なった後に、任意の処理をコールバックで実行できるようになりました。
例えば以下のようにFormRequestクラスへメソッドを追加すると、リクエストの内容を変更できます。
public function passedValidation()
{
$this->replace(['name' => 'Adam']);
}
メールアドレスの検証方法が追加されました (#29289)
egulias/email-validatorパッケージを元にして以下の検証タイプが追加されました。
rfc
strict
dns
spoof
filter
emailバリデーションの引数として、これらの検証タイプを指定可能になりました。
$request->validate([
'email' => 'email:rfc,dns'
]);
Redis 5のサポートが追加されました (#29606)
データベースクエリビルダーにinsertOrIgnore()メソッドが追加されました (#29639, 46d7e96, #29645)
以下のデータベースにおいてinsert ignoreが可能になりました。
MySQL - uses: insert ignore
Postgres - uses: on conflict do nothing
SQLite - uses: insert or ignore
Whoopsハンドラーのオーバーライドが可能になりました (#29564)
詳しい変更については以下を確認してください。
Release v5.8.33 · laravel/framework · GitHub
[Laravel] 5.8.30がリリースされました
laravel/frameworkのバージョン5.8.30がリリースされました。追加された機能について確認します。
MakesHttpRequestsクラスにoption()と、optionJson()メソッドが追加されました (#29258)
テスト時にOPTIONリクエストを検証するメソッドです。
通常のページへのレスポンス検証時にはoption()メソッドを使い、API等のレスポンス検証時にはoptionJson()メソッドを利用します。
$this->option('/example');
$this->optionJson('/api/example');
BlueprintクラスにuuidMorphs()と、nullableUuidMorphs()メソドが追加されました (#29289)
マイグレーションファイルでuuidを外部キーとしたMorphリレーションを作成できるようになりました。
作成されるスキーマはmorphs()メソッドやnullableMorphs()と同様に、引数で指定した値に対応する2種類のカラムとインデックスが作成されます。
$table->uuidMorphs('taggable');
/**
* Add the proper columns for a polymorphic table using UUIDs.
*
* @param string $name
* @param string|null $indexName
* @return void
*/
public function uuidMorphs($name, $indexName = null)
{
$this->string("{$name}_type");
$this->uuid("{$name}_id");
$this->index(["{$name}_type", "{$name}_id"], $indexName);
}
MailgunTransportクラスにgetEndpoint()と、setEndpoint()メソッドが追加されました (#29312)
メールの送信サービスにMailgunを利用している場合にエンドポイントの切り替えが可能になりました。
ドメインの切り替えは既に実装されていましたが、ドメインによってエンドポイントが異なる場合でも対応可能になりました。
$mailTransport = app()->make('mailer')->getSwiftMailer()->getTransport();
$mailTransport->setDomain('yourdomain.com');
$mailTransport->setEndpoint('api.eu.mailgun.net');
画像に関するバリデーションルールにWEBPが追加されました (#29309)
TestResponse::assertSessionHasInput()メソッドが追加されました (#29327)
Bladeテンプレートの場合、前回のリクエストの値はold()メソッドを利用して取得しますが、この値は_old_inputという名前でセッション上に保存されています。
テスト時に前回のリクエストの内容を検証したい場合に便利になりました。
// Before
$response->assertSessionHas('_old_input', [
'connection_id' => $connection->id,
'repository' => $repository,
'source_branch' => $branch,
]);
// After
$response->assertSessionHasInput([
'connection_id' => $connection->id,
'repository' => $repository,
'source_branch' => $branch,
]);
カスタマイズしたRedisドライバーが利用できるようになりました (#29275)
PostgresでのCollationに対応しました (#29213)
詳しい変更については以下を確認してください。
Release v5.8.30 · laravel/framework · GitHub
[Laravel Vapor] Laravel Vaporが発表されました
Laracon US 2019にて、Laravel Teamによる新しいサービスである Laravel Vapor が発表されました。
Laravel Vapor は、Laravel用のサーバーレスプラットフォームで、サーバーへのデプロイやオートスケーリングに対応し、Laravelアプリケーションで利用する全てのインフラをカバーします。
Taylor Otwell氏による実際の公演がアップロードされています。
Taylor Otwell - Intro to Laravel Vapor
AWSの基盤を利用して、サービスのUIから様々な機能が提供されます。
Laravel用に最適化されたwebサーバーやインフラのオートスケーリング
ゼロダウンタイムでのデプロイメントやロールバック
統合した環境変数のマネージメント
バックアップ、レストア、オートスケーリングを含むデータベースの統合的なマネージメント
Redisの採用やクラスタのオートスケーリング
データベースやRedisキャッシュの最適化
静的ファイルのCloudFront CDNへのオートアップロード
etc
また、デプロイ時にはプロダクション環境と同時にステージング環境も構築可能で、開発からリリースまでシームレスな管理を行います。
AWS CloudWatchを拡張したような強力なログ機能も準備していて、サービスのUIからアプリケーションの状態を確認、監視ができます。
Laravel Vapor でアーリーアクセスの募集があるので、興味をお持ちであれば登録してみましょう。
[Laravel] 5.8.29がリリースされました
laravel/frameworkのバージョン5.8.29がリリースされました。追加された機能について確認します。
WithFaker::makeFaker()メソッドにapp.faker_localeのロケールが指定されるようになりました (#29123)
テスト時に利用する\Illuminate\Foundation\Testing\WithFakeが、config/app.php内に指定可能なfaker_localeを参照するようになりました。
Notificationをメールで行う際にデザインテーマを指定可能になりました (#29132)
MailMessageクラスを利用してMarkDown形式でのメール送信の際のデザインテーマをカスタマイズできるようになりました。
デフォルトで使用するdefault.cssを上書きすること無くオリジナルのcssファイルを指定できます。
オリジナルのcssファイルはresources/views/vendor/mail/html/themes以下に配置する必要があります。
public function toMail($notifiable)
{
$url = url('/invoice/'.$this->invoice->id);
return (new MailMessage)
->theme('notification')
->greeting('Hello!')
->line('One of your invoices has been paid!')
->action('View Invoice', $url)
->line('Thank you for using our application!');
}
migration実行時の処理時間がコンソールに出力されるようになりました (#29149)
Illuminate\Database\Query\BuilderクラスのwhereNull()およびwhereNotNull()メソッドの引数に配列を指定可能になりました (#29154)
複数のカラムに対してNull判定を行う際にまとめて指定できるようになりました。
// Before
$query->whereNull('id')->whereNull('expires_at');
$query->whereNotNull('id')->whereNotNull('expires_at');
// After
$query->whereNull(['id', 'expires_at']);
$query->whereNotNull(['id', 'expires_at']);
Console\Scheduling\ManagesFrequencies::hourlyAt()メソッドの引数に配列を指定可能になりました (#29173)
毎時のスケジューリングを設定する際にまとめて指定できるようになりました。
// Before
$schedule->command('my:command')->hourlyAt(15)->hourlyAt(30)->hourlyAt(45)
// After
$schedule->command(my:command')->hourlyAt([15, 30, 45]);
詳しい変更については以下を確認してください。
Release v5.8.29 · laravel/framework · GitHub
[Laravel] 5.8.28がリリースされました
laravel/frameworkのバージョン5.8.28がリリースされました。追加された機能について確認します。
TestResponseクラスにTappableトレイトが追加されました (#29033)
CollectionクラスにmergeRecursive()メソッドが追加されました (#29084)
PHPネイティブのarray_merge_recursive()を使って新しいコレクションを作成します。
Collectionクラスにreplace()、replaceRecursive()メソッドが追加されました (#29088)
PHPネイティブのarray_replace()、array_replace_recursive()を使って新しいコレクションを作成します。
Session\Storeクラスにonly()メソッドが追加されました (#29107)
SESSION情報から指定したキーの値を配列で取得します。
$session->only(['key1', 'key2']);
詳しい変更については以下を確認してください。
Release v5.8.28 · laravel/framework · GitHub
[Laravel] 5.8.27がリリースされました
laravel/frameworkのバージョン5.8.27がリリースされました。追加された機能について確認します。
mix()ヘルパーでアセットのURLが変更できるようになりました (#28952)
以前のアップデートでapp.asset_urlを指定することでCDNを利用したファイルの配信が可能になりましたが、同様にLaravel MixでビルドしたファイルについてもCDN等からの配信が可能になりました。
有効にする場合はconfig/app.phpにてmix_urlキーでURLを指定します。
RedisManager::setDriver()メソッドが追加されました (#28985)
プログラムの実行中にredisのドライバーを変更する必要がある場合にこのメソッドを利用できます。
MorphToリレーションを操作可能なwhereHasMorph()メソッドが追加されました (#28928)
MorphTo関係にあるモデルに対してもwhereHasMorph()を利用して追加のクエリを発行できるようになりました。
今までは関連するデータに対して追加のクエリを発行するwhereHas()はMorphToリレーションについては利用できませんでしたが、この問題が解消されました。
対象となるモデルを引数に与え、コールバックを利用してクエリを発行できます。
Relation::morphMap(['posts' => Post::class]);
Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query) {
$query->where('title', 'foo');
})->get();
また、それぞれのモデルに対して別の処理を行いたい場合には以下のように使用します。
Relation::morphMap(['posts' => Post::class]);
Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query, $type) {
if ($type === Post::class) {
$query->where('title', 'foo');
}
if ($type === Video::class) {
$query->where('title', 'bar');
}
})->get();
詳しい変更については以下を確認してください。
Release v5.8.27 · laravel/framework · GitHub
[Laravel] 5.8.25がリリースされました
laravel/frameworkのバージョン5.8.25がリリースされました。追加された機能について確認します。
route:listコマンドにjsonオプションが追加されました (#28894)
存在するルートの情報がjosn形式で出力可能になりました。
ルート情報を他のアプリケーションと共有したい場合などに活用できそうです。
php artisan route:list --json
詳しい変更については以下を確認してください。
Release v5.8.25 · laravel/framework · GitHub
[Laravel] 5.8.24がリリースされました
laravel/frameworkのバージョン5.8.24がリリースされました。追加された機能について確認します。
TestResponse::assertSessionHas()メソッドでクロージャを使用してセッションに特定のデータが含まれていることを確認できるようになりました (#28837)
使い方はTestResponse::assertViewHas()メソッドと同様に、クロージャーの中で指定したキーが持つセッションの値を評価します。
// Before
$response->assertSessionHas('authenticatable');
$this->assertTrue($user->is(session('authenticatable')));
// After
$response->assertSessionHas('authenticatable', function ($authenticatable) use ($user) {
return $user->is($authenticatable);
});
TestResponse::assertUnauthorized()メソッドが追加されました (#28851)
既存のassertNotFound()やassertForbidden()と同様に、レスポンスのステータスコードが401(Unauthorized)なことを確認するメソッドです。
環境設定のSERVER_PORTでビルドインサーバーのポートが指定可能になりました (#28849, 6a18e73)
LaravelにはPHPのビルドインサーバーを起動するphp artisan serveコマンドがあります。
デフォルトの8000以外のポートを使いたい場合には--portオプションでの指定が必要でしたが、.envファイルのSERVER_PORTでポートの指定が可能になりました。
Artisanコマンドの引数に渡す環境オプション(--env)をスペースで区切れるようになりました (#28869)
// Before
php artisan --env=dev {command}
// After
php artisan --env dev {command}
@endcomponentFirstディレクティブが追加されました (#28884)
retry()ヘルパーでクロージャーを利用して再実行の判定を追加できるようになりました (85c0801)
繰り返しの回数を指定する1つ目のパラメーターに加えて、クロージャーで繰り返しの判定が可能な4つ目の引数が追加されました。
クロージャーのパラメーターには発生した例外が渡されます。
詳しい変更については以下を確認してください。
Release v5.8.24 · laravel/framework · GitHub