[Laravel] 6.14.0がリリースされました
laravel/frameworkのバージョン6.14.0がリリースされました。追加された機能について確認します。
Illuminate\Bus\Dispatcher::dispatchAfterResponse()メソッドが追加されました (#31300, @8a3cdb0)
レスポンス完了直後にジョブを実行します。
キューへ登録する必要のないような小さな処理に向いています。
Illuminate\Support\Testing\Fakes\QueueFake::assertPushedWithoutChain()メソッドが追加されました (#31332, @7fcc6b5)
ジョブのチェーンに何も指定されていないことを確認できます。
Queue::fake();
MoveFile::withChain(
$medium->isImage ? [new GenerateImages($medium)] : [],
)->dispatch($medium);
Queue::assertPushedWithEmptyChain(MoveFile::class);
Illuminate\Events\DispatcherクラスにMacroableトレイトが追加されました (#31317)
NoPendingMigrationsイベントが追加されました (#31289, @739fcea)
実行するマイグレーションが無かった場合にイベントが発火します。
詳しい変更については以下を確認してください。
Release v6.14.0 · laravel/framework · GitHub
[Laravel] 6.13.0がリリースされました
laravel/frameworkのバージョン6.13.0がリリースされました。追加された機能について確認します。
make:modelコマンドに--apiオプションが追加されました (#31197, #31222)
モデル作成時にAPI用のコントローラーが作成できるオプションです。
php artisan make:model Order --api
PendingResourceRegistration::shallow()メソッドが追加されました (#31208, @104c539)
resource()メソッドを使ったルーティングの記述が簡単になりました。
// Before
Route::resource('foo.bar', 'BarController')->only(['index', 'create', 'store']);
Route::resource('bar', 'BarController')->only(['show', 'edit', 'update', 'destroy']);
// After
Route::resource('foo.bar', 'BarController')->shallow();
クロージャーを使ったバリデーションメッセージのフォーマットが可能になりました (#31246)
バリデーションルールにネストした配列を使う場合、エラーメッセージのフォーマットできるようになりました。
$translator = new Translator(new ArrayLoader, 'en');
$translator->addLines(['validation.string' => ':attribute must be a string!'], 'en');
$validator = new Validator($translator, [['name' => 1]], ['*.name' => 'string']);
$validator->setImplicitAttributesFormatter(function ($attribute) {
[$line, $attribute] = explode('.', $attribute);
return sprintf('%s at line %d', $attribute, $line + 1);
});
$validator->passes();
$this->assertEquals('name at line 1 must be a string!', $validator->getMessageBag()->all()[0]);
Filesystem::ensureDirectoryExists()メソッドが追加されました (@8a8eed4)
指定したパスにディレクトリ が存在しない場合にディレクトリ を作成します。
FTPドライバーでStorage::url()が利用可能になりました (#31258, @b8790e5)
詳しい変更については以下を確認してください。
Release v6.13.0 · laravel/framework · GitHub
[Laravel] 6.12.0がリリースされました
laravel/frameworkのバージョン6.12.0がリリースされました。追加された機能について確認します。
ServiceProvider::loadFactoriesFrom()メソッドが追加されました (#31133)
パッケージ自体にFactoryをロードする関数が追加されました。
テスト時にパッケージが提供するFactoryを使用できる様になります。
$this->loadFactoriesFrom('source/database/factories');
$this->loadFactoriesFrom([
'source_one/database/factories',
'source_two/database/factories',
]);
TestResponse::dumpSession()メソッドが追加されました (#31131)
dumpHeaders()メソッドと同じ様に、セッションからすべてのキーまたは選択したキーをダンプします。
Str::isUuid()メソッドが追加されました (#31148)
UUIDに関するバリデーションメソッドがStrクラスに移植されました。
これによりStrクラスを使ってのバリデーションも可能になりました。
Str::isUuid('a0a2a2d2-0b87-4a18-83f2-2529882be2de'); // Returns true
Str::isUuid('laravel'); // Returns false
PHPUnit7のサポートが復旧しました (#31113)
Request::boolean()メソッドが追加されました (#31160)
パラメーターが以下の場合にはtrue、それ以外の場合にはfalseを返します
1
true
on
yes
$request = Request::create('/', 'GET', ['with_trashed' => 'false', 'download' => true, 'checked' => 1, 'unchecked' => '0']);
$this->assertTrue($request->boolean('checked'));
$this->assertTrue($request->boolean('download'));
$this->assertFalse($request->boolean('unchecked'));
$this->assertFalse($request->boolean('with_trashed'));
$this->assertFalse($request->boolean('some_undefined_key'));
Database\Eloquent\FactoryBuilder::createMany()メソッドが追加されました (#31171, @6553d59)
複数のデータを作成する際に配列を渡せるようになりました。
// Before
factory(User::class)->create([
'name' => 'Taylor',
]);
factory(User::class)->create([
'name' => 'John',
]);
factory(User::class)->create([
'name' => 'Doe',
]);
// After
factory(User::class)->createMany([
[
'name' => 'Taylor',
],
[
'name' => 'John'
],
[
'name' => 'Doe'
],
]);
PhpRedisにオプションが追加されました (#31182)
以下のオプションが追加されました
serializer (here)
scan (here)
failover (here)
詳しい変更については以下を確認してください。
Release v6.12.0 · laravel/framework · GitHub
[Laravel] 6.11.0がリリースされました
laravel/frameworkのバージョン6.11.0がリリースされました。追加された機能について確認します。
Eloquent BuilderにfirstWhere()メソッドが追加されました (#31089)
以前からある->where(...)->first()のショートカットです。
// Before
User::where('emaill', '[email protected]')->first();
// After
User::firstWhere('email', '[email protected]');
Redisで複数のサービスへBroadcastを行うしのパフォーマンスが向上しました (#31108)
詳しい変更については以下を確認してください。
Release v6.11.0 · laravel/framework · GitHub
[Laravel] 6.10.0がリリースされました
laravel/frameworkのバージョン6.10.0がリリースされました。追加された機能について確認します。
テストヘルパーにwithoutMix()とwithMix()メソッドが追加されました (#30900)
テストを行う際にLaravel Mixの解除や再接続が可能になりました。
RequestクラスにvalidateWithBag()マクロが追加されました (#30835, @c0fdb56 )
バリデーション失敗時に作成されるMessageMagにオリジナルの名前を付けれるようになりました。
$request = Request::create('/', 'GET', ['name' => null]);
try {
$request->validateWithBag('some_bag', ['name' => 'string']);
} catch (ValidationException $validationException) {
$this->assertEquals('some_bag', $validationException->errorBag);
}
バリデーションルールにexclude_ifとexclude_unless が追加されました (#30873)
例えばhas_doctor_appointmentチェックボックスがあるフォームで、チェックボックスを切り替えると日付と医師の名前を入力するフォームの表示と非表示が切り替わります。
チェックボックスをオフにした場合にはフォームは表示されませんが、値が入力済みの場合にはリクエスト時に送信されます。
このデータを検証する場合にはrequire_ifを使う場合にはデータのトリミングが必要です。
public function post(Request $request)
{
$data = $request->validate([
'has_doctor_appointment' => 'required|bool',
'appointment_date' => 'required_if:has_doctor_appointment,true|date',
'doctor_name' => 'required_if:has_doctor_appointment,true|string'
]);
// $data === ['has_doctor_appointment' => false, 'appointment_date' => '2019-12-13']
if (! $data['has_doctor_appointment') {
$data['appointment_date'] = null;
$data['doctor_name'] = null;
}
SomeModel::create($data);
}
exclude_ifを使用すると、このように検証できるようになります。
public function post(Request $request)
{
$data = $request->validate([
'has_doctor_appointment' => 'required|bool',
'appointment_date' => 'exclude_if:has_appointment,false|required|date',
'doctor_name' => 'exclude_if:has_appointment,false|required|string',
]);
// $data === ['has_appointment' => false]
SomeModel::create($data);
}
PostgreSQLでvirtualとstoredカラムがサポートされるようになりました (#30971)
Eloquent Builderにmixin()メソッドが追加されました (#30978, @28fa74e)
macro()メソッドでの追加はすでにサポート済みでしたが、mixin()メソッドで一度に複数のマクロを追加できるようになりました。
Redis ConnectionにMacroableトレイトが追加されました (#31020)
PackageManifest::config()メソッドが追加されました (#31039, @9b73540)
パッケージ内のcomposer.jsonファイルのprovidersとaliasesにオリジナルのクラスを指定可能でしたが、任意の設定を参照できる様になりました。
サービスコンテナにredis.connectionのエイリアスが追加されました (#31034)
Illuminate\Console\CommandクラスからLaravelに依存していた部分が別のクラスに抽出されました (#31026, @ef72716 )
Storage::putFile()メソッドのファイルパスに絶対パスが指定可能になりました (#31040)
詳しい変更については以下を確認してください。
Release v6.10.0 · laravel/framework · GitHub
[Laravel] 6.9.0がリリースされました
laravel/frameworkのバージョン6.9.0がリリースされました。追加された機能について確認します。
Testing/FileFactoryにMIMEタイプが指定可能になりました (#30870)
create()メソッドの第三引数、もしくは生成されたFileクラスのmimeType()メソッドで指定できるようになりました。
(new FileFactory)->create('someaudio.webm', 0, 'audio/webm')->getMimeType(); // audio/webm
(new FileFactory)->create('someaudio.webm')->mimeType('audio/webm')->getMimeType(); // audio/webm
make:modelコマンドの--allメソッドでseed オプションが有効になりました (#30874)
emergency loggerのオプションを指定可能になりました (#30873)
EmergencyLoggerは指定のログチャンネルの取得に失敗した場合に利用される緊急用のチャンネルです。
config/logging.phpにてこのログの出力先が指定可能になりました。
return [
...
'channels' => [
...
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
Kernalクラスにミドルウェアを操作するメソッドが追加されました (@6f33feb)
ミドルウェアの実行を制御するメソッドが追加されました。
prependMiddlewareToGroup()
appendMiddlewareToGroup()
prependToMiddlewarePriority()
appendToMiddlewarePriority()
詳しい変更については以下を確認してください。
Release v6.9.0 · laravel/framework · GitHub
[Laravel] 6.8.0がリリースされました
laravel/frameworkのバージョン6.8.0がリリースされました。追加された機能について確認します。
マークダウンメールにカスタマイズされたテーマが利用できるようになりました (#30814, @2206d52)
今までのマークダウンメールのテーマはmail::で始まるviewしか利用できませんでしたが、自由に指定できる様になりました。
Inspiringコマンドに引用文が追加されました (@4a7d566, @9693ced)
TestResponse::assertViewHas()メソッドでネストされた配列の確認が可能になりました (#30837)
レスポンスの一部をテストしたい場合などに便利です。
// before
$this->get('/page')
->assertViewHas('page', [
'component' => 'PageComponent',
'url' => '/page',
'version' => null,
'props' => [
'user_name' => 'John Doe'
]
]);
// after
$this->get('/page')
->assertViewHas('page.props', [
'user_name' => 'John Doe'
]);
Model::setRawAttribute()メソッドが追加されました (#30853)
ミューテーターをスキップして特定の値を代入できるようになりました。
// Set attribute to value and also sync to original attribute.
$model->setRawAttribute('key', $value, true);
Model::setRawAttribute()メソッドが追加されました (#30853)
make:controllerコマンドに--forceメソッドが追加されました (#30853)
resource::collection()の引数に配列が渡せるようになりました (#30800)
JsonResponseとTestResponseでレスポンスの内容に配列でアクセスできるようになりました (#30817)
JSON形式のAPIの内容をテストする際に、これまでは$response-> original ['key']から値を取得する必要がありましたが、レスポンスの内容に直接アクセスできるようになりました。
// before
$this->assertCount(2, $response->original['key']);
// after
$this->assertCount(2, $response['key']);
make::modelコマンドに--seedオプションが追加されました (#30828, @2cd9417)
モデル作成時に--seedオプションをつけて、そのモデルのSeederも同時に作成できます。
詳しい変更については以下を確認してください。
Release v6.8.0 · laravel/framework · GitHub
[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