[Laravel] 6.5.1がリリースされました
laravel/frameworkのバージョン6.5.1がリリースされました。追加された機能について確認します。
BladeクラスにincludeUnlessディレクティブが追加されました (#30538)
引数の値が存在しない位場合に表示するviewファイルの指定ができます。
// before
@includeWhen(! $headless, 'dashboard/partials/nav')
// after
@includeUnless($headless, 'dashboard/partials/nav')
詳しい変更については以下を確認してください。
Release v6.5.1 · laravel/framework · GitHub
[Laravel] 6.5.0がリリースされました
laravel/frameworkのバージョン6.5.0がリリースされました。追加された機能について確認します。
LazyCollectionクラスにremember()メソッドが追加されました (#30443)
remember()メソッドを呼び出すと、実行済みのクエリの結果がキャッシュに保存される新しいLazyCollectionが返されます。
再実行された時にすでに実行済みのインデックスはキャッシュが参照されます。
$users = User::cursor()->remember();
// No query has been executed yet.
$users->all();
// All values have been pulled from the DB.
$users->all();
// We did not hit the DB again. We got the users from `remember`'s cache.
Str::afterLast()とStr::beforeLast()メソッドが追加されました (#30507)
すでにHelperメソッドとして提供されていたStr::after()やStr::before()と似ていますが、返却される値が検索ワードが最後にヒットした前後の値です。
$type = 'App\Notifications\Tasks\TaskUpdated';
Str::afterLast($type, '\\'); // TaskUpdated
Str::after($type, '\\'); // Notifications\Tasks\TaskUpdated
$filename = 'photo.2019.11.04.jpg';
Str::beforeLast($filename, '.'); // photo.2019.11.04
Str::before($filename, '.'); // photo
クエリビルダークラスにexistsOr()とdoesntExistOr()メソッドが追加されました (#30495)
2つのメソッドは引数としてClosureを受け取り、条件に一致しなかった場合にはコールバックが実行委されます。
// before
$hasOpenDossier = $user->dossiers()
->whereNull('closed_at')
->exists();
if ($hasOpenDossier) {
abort(422, 'User already has an open dossier');
}
// after
$user->dossiers()
->whereNull('closed_at')
->doesntExistOr(function () {
abort(422, 'User already has an open dossier');
});
Bladeでカスタムしたif文を作成した場合にunlessディレクティブが自動で作成されるようになりました (#30492)
Blade::if()メソッドは現在、次の3つのディレクティブを自動的に登録していました
@env (positive if condition)
@elseenv (elseif condition)
@endenv (endif)
@env('local')
// The application is in the local environment...
@elseenv('testing')
// The application is in the testing environment...
@else
// The application is not in the local or testing environment...
@endenv
この変更により上記の3つに加えてunlessディレクティブが自動的に登録されるようになりました。
@unlessenv('production')
// The application is not in the production environment...
@endenv
詳しい変更については以下を確認してください。
Release v6.5.0 · laravel/framework · GitHub
[Laravel] 6.4.1がリリースされました
laravel/frameworkのバージョン6.4.1がリリースされました。追加された機能について確認します。
スケジューリングがスキップされた場合にScheduledTaskSkippedイベントが発行されるようになりました (#30407)
DetectsLostConnectionsクラスにLogin timeout expiredが追加されました (#30362)
FilesystemクラスとFilesystemAdapterクラスにmissing()メソッドが追加されました (#30441)
before:
if (!Storage::exists('file.txt')) {
// ...
}
if (!File::exists('file.txt')) {
// ...
}
after:
if (Storage::missing('file.txt')) {
// ...
}
if (File::missing('file.txt')) {
// ...
}
詳しい変更については以下を確認してください。
Release v6.4.1 · laravel/framework · GitHub
[Laravel] 6.4.0がリリースされました
laravel/frameworkのバージョン6.4.0がリリースされました。追加された機能について確認します。
Requestクラスにmissing()メソッドが追加されました (#30320)
リクエストに指定したパラメーターが存在しないことを確認できます。
// before
if (! $request->has('foo')) {
//
}
// after
if ($request->missing('foo')) {
//
}
Pipelineクラスにpipes()メソッドが追加されました (#30346)
pipes()メソッドをオーバーライドすることでパイプラインで通過させる処理を変更可能になりました。
class BackupAction extends Pipeline
{
protected function pipes(): array
{
return config('actions.backup.tasks', [
Tasks\SetupPassable::class,
Tasks\CreateTemporaryDirectory::class,
Tasks\PrepareFilesToBackup::class,
Tasks\CreateZipBackupFile::class,
Tasks\MoveZipArchiveToDisks::class,
Tasks\SendNotification::class,
]);
}
}
TestResponseクラスにassertCreated()メソッドが追加されました (#30368)
詳しい変更については以下を確認してください。
Release v6.4.0 · laravel/framework · GitHub
[Laravel] 6.3.0がリリースされました
laravel/frameworkのバージョン6.3.0がリリースされました。追加された機能について確認します。
ユーザーのパスワードリセット時にセットされるパスワード の値をカスタマイズ可能になりました (#30218)
ユーザーモデル内でミューテーターを使ってパスワードを暗号化している場合など、ResetPasswords::setUserPassword()メソッドをオーバーライドすることでデフォルトの振る舞いを変更できるようになりました。
MorphPivotクラスでdeletingとdeletedのイベントが発行されるようになりました (#30229)
ArrayCacheドライバーが追加されました (#30253)
Cacheに依存している場合のテスト時に、ストレージとしてArrayCacheドライバを利用することでキャッシュの実行/セットアップをカスタマイズできます。
システム全体がRedisやMemcachedといったキャッシュに依存するシステムではテスト用のクラスを作成する必要がありましたが、ArrayCacheを使うことでこれらのテストを全て行うことができます。
SqlServerBuilder::dropAllViews()メソッドが追加されました (#30222)
このメソッドでSQLServer上の全てのviewを削除できます。
詳しい変更については以下を確認してください。
Release v6.3.0 · laravel/framework · GitHub
[Laravel] 6.2.0がリリースされました
laravel/frameworkのバージョン6.2.0がリリースされました。追加された機能について確認します。
Container::call()メソッドでオブジェクトの呼び出しが可能になりました (#30156)
postgreSQLにmultipolygonzタイプが追加追加されました (#30173)
Authenticateミドルウェアで未ログインの場合の動作をカスタマイズできるようになりました (#30177)
Mockeryを利用したテストの際のmakePartial()の振る舞いを行います。
// before
$this->instance(Abstract::class, Mockery::mock(Abstract::class, function ($mock) {
$mock->shouldReceive('call')->once();
})->makePartial());
// after
$this->partialMock(Abstract::class, function ($mock) {
$mock->shouldReceive('call')->once();
});
テストクラスにpartialMock()メソッドが追加されました (#30202)
ステータスコードとレスポンス内容を一度に確認することができます。
このアサーションは、最近追加されたassertForbidden()およびassertUnauthorized()メソッドと同じように働きます。
// Before
$response = $this->get('api/endpoint');
$response->assertStatus(409);
$this->assertEmpty($response->content());
// After
$response = $this->get('api/endpoint');
$response->assertNoContent(409);
Storage::put()メソッドの引数にStreamInterfaceが指定可能になりました (#30179)
ログイン済みのユーザーにパスワードの再確認を求める機能が追加されました (#30214)
パスワードで保護する必要がある機密性の高いアクションをこなう際にユーザーにパスワード の入力を求めることが可能になりました。
ユーザーが有効なパスワードを入力すると一定時間(デフォルトでは3時間)はそのアクションを実行することができます。
Password Confirmation - The Laravel Blog
詳しい変更については以下を確認してください。
Release v6.2.0 · laravel/framework · GitHub
[Laravel] 6.1.0がリリースされました
laravel/frameworkのバージョン6.1.0がリリースされました。追加された機能について確認します。
LazyCollectionクラスにeager()メソッドが追加されました (#29832)
eager()メソッドを利用することで、すべてのLazyCollectionの値を列挙し、新しいLazyCollectionインスタンスを構築します。
下記の例でeager()メソッドがなければ、データの取得は2回行われます。
$users = User::cursor();
$users = $users->eager();
$count = $users->count();
$users->each(function ($user) {
//
});
LogManagerクラスにforgetChannel()、getChannels()メソッドが追加されました (#30132, a52a0dd)
現在指定されているログドライバの取得や削除が可能になりました。
public function testLogMnagerPurgeResolvedChannels()
{
$manager = new LogManager($this->app);
$this->assertEmpty($manager->getChannels());
$manager->channel('single')->getLogger();
$this->assertCount(1, $manager->getChannels());
$manager->purge('single');
$this->assertEmpty($manager->getChannels());
}
TestResponseクラスにassertNoContent()メソッドが追加されました (#30125)
ステータスコードとレスポンス内容を一度に確認することができます。
このアサーションは、最近追加されたassertForbidden()およびassertUnauthorized()メソッドと同じように働きます。
// Before
$response = $this->get('api/endpoint');
$response->assertStatus(409);
$this->assertEmpty($response->content());
// After
$response = $this->get('api/endpoint');
$response->assertNoContent(409);
SendQueuedNotificationsクラスにInteractsWithQueueトレイトが追加されました (#30140)
SendQueueNotificationsクラスにretryUntil()メソッドが追加されました (#30141)
TestResponseクラスにwithCookies()メソッドが追加されました (#30101)
HTTPテスト時にCookieを送信できるようになりました。
// Before
$cookies = [
'name1' => encrypt('value1'),
'name2' => encrypt('value2')
];
$response = $this->call('get', 'test', [], $cookies);
// After
$response = $this->withCookies([
'name1' => 'value1',
'name2' => 'value2'
])->get('test');
キューイング時のNotificationでのJob Middlewareがサポートされました (#30070)
詳しい変更については以下を確認してください。
Release v6.1.0 · laravel/framework · GitHub
[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