[Laravel] 6.7.0がリリースされました
laravel/frameworkのバージョン6.7.0がリリースされました。追加された機能について確認します。
HasTimestampsトレイトにgetQualifiedCreatedAtColumn()とgetQualifiedUpdatedAtColumn()メソッドが追加されました (#30792)
モデルで利用している追加日時と更新日時のテーブ名、カラム名が取得できるようになりました。
$user = new User;
$user->getQualifiedCreatedAtColumn() // users.created_at
$user->getQualifiedUpdatedAtColumn() // users.updated_at
Exceptions\HandlerクラスにexceptionContext()メソッドが追加されました (#30780)
このメソッドを実装することでエラー発生時のログデータを拡張する際に、report()をオーバーライドの必要がなくなります。
throw (new CustomException())->setCustomProperty('foo');
// App/Exceptions/Handler.php
protected function exceptionContext(Exception $e)
{
if ($e instanceof CustomException) {
return ['custom_context' => $e->getCustomProperty()];
}
}
メールドライバにPostmarkを利用している場合に問題発生時に例外がスローされるようになりました (#30799, @4320b82)
HasRelationshipsクラスにwithoutRelations()とunsetRelations()メソッドが追加されました (#30802)
例えばJobをキューイングする際に、リレーション情報を除いたシンプルなエンティティーのみをシリアライズしてキューに入れることができます。
protected $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast->withoutRelations();
}
ResourceCollectionクラスにpreserveQueryParameters()メソッドが追加されました (#30745, @e92a708)
ResourceCollectionクラスを利用してページネーションのApiレスポンスを作成する場合に、レスポンスの内容にクエリパラメーターを保持できるようになりました。
Route::get('/', function () {
$collection = collect([new Post(['id' => 2, 'title' => 'Laravel Nova'])]);
$paginator = new LengthAwarePaginator(
$collection, 3, 1, 2
);
return PostCollectionResource::make($paginator)->withQuery(['author' => 'Taylor']);
});
$response = $this->withoutExceptionHandling()->get(
'/?framework=laravel&author=Otwell&page=2', ['Accept' => 'application/json']
);
$response->assertStatus(200);
$response->assertJson([
'data' => [
[
'id' => 2,
'title' => 'Laravel Nova',
],
],
'links' => [
'first' => '/?author=Taylor&page=1',
'last' => '/?author=Taylor&page=3',
'prev' => '/?author=Taylor&page=1',
'next' => '/?author=Taylor&page=3',
],
'meta' => [
'current_page' => 2,
'from' => 2,
'last_page' => 3,
'path' => '/',
'per_page' => 1,
'to' => 2,
'total' => 3,
],
]);
詳しい変更については以下を確認してください。
Release v6.7.0 · laravel/framework · GitHub
[Laravel] 6.6.0がリリースされました
laravel/frameworkのバージョン6.6.0がリリースされました。追加された機能について確認します。
データベースを使用するバリデーションのテーブル名にモデルクラスを指定可能になりました (#30653)
existsやuniqueといったバリデーションルールの引数へModelクラスの完全修飾名を文字列で指定します。
初期化時に内部ではテーブル名を取得するgetTable()メソッドが呼ばれています。
// before
$request->validate([
'user_id' => 'required|unique:users,id'
])
// after
$request->validate([
'user_id' => 'required|unique:'.User::class.',id'
])
ResponseFactory::view()メソッドの第一引数に配列を渡した時にファーストビューが返却されるようになりました (#30651)
以前からあったview()->first()メソッドがデフォルトに組み込まれました。
配列の先頭から順番に評価され、はじめに存在するviewファイルが返却されます。
return response()->view(['my/view1', 'my/view2'], ['data'], 404, ['headers']);
明示的に行う場合はviewFirst()メソッドを指定してください。
return response()->viewFirst(['my/view1', 'my/view2'], ['data'], 404, ['headers']);
Foundation\Testing\Concerns\InteractsWithDatabase::assertDeleted()メソッドが追加されました (#30648)
データベースに存在しない事を確認するテストが容易になりました。
既存のassertSoftDeleted()メソッドと同じように使用できます。
// before
$this->assertDatabaseMissing('posts', [
'id' => $post->id
]);
// after
$this->assertDeleted($post);
Illuminate\Routing\Router::head()メソッドが追加されました (#30646)
HEAD型のHTTPメソッドを追加可能になりました。
BelongsToManyクラスにwherePivotNotIn()とorWherePivotNotIn()メソッドが追加されました (#30671)
SqlServerConnectorクラスにデータを暗号化するオプションが追加されました (#30636)
Azure Key Vaultでデータを暗号化する以下のオプションが追加されました。
ColumnEncryption
KeyStoreAuthentication
KeyStorePrincipalId
KeyStoreSecret
詳しい変更については以下を確認してください。
Release v6.6.0 · laravel/framework · GitHub
[Laravel] 6.5.2がリリースされました
laravel/frameworkのバージョン6.5.2がリリースされました。追加された機能について確認します。
Jobクラスのコンストラクタに渡すモデルのシリアライズにPHP7.4のtyped propertiesに対応しました (#30604, #30605, @920c364)
Facadeクラスの生成後にもフォールバックが使用できるようになりました (#30538)
resolve()メソッドにコールバックを渡した時点で適応されます。
$this->app->make('auth');
$this->assertFalse(isset($_SERVER['__laravel.authResolved']));
Auth::resolved(function () {
$_SERVER['__laravel.authResolved'] = true;
});
$this->assertTrue(isset($_SERVER['__laravel.authResolved']));
PostgresでPostGISの利用時にgeometryとgeographyのサポートが追加されました (#30545)
Illuminate\Http\Testing\FileとIlluminate\Http\Testing\FileFactoryクラスにcreateWithContent()メソッドが追加されました (@2cc6fa3, @181db51)
このメソッドでテスト時にダミーファイルの作成が容易になりました。
詳しい変更については以下を確認してください。
Release v6.5.2 · laravel/framework · GitHub
[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