[Laravel] 5.8.5がリリースされました
laravel/frameworkのバージョン5.8.5がリリースされました。追加された機能について確認します。
※ このリリースにはUnique Ruleに関するインジェクション対策が含まれています。
Unique Rule SQL Injection Warning - The Laravel Blog
DatabaseManageクラスにsetReconnector()メソッドが追加されました (#27845)
任意のタイミングでデータベースコネクションの再接続が可能になりました。
Gateクラスにnone()メソッドが追加されました (#27859)
指定した認可処理のいずれにも許可が無いことを確認できるようになりました。
Illuminate\Auth\Access\Gate:
/**
* Determine if any one of the given abilities should be denied for the current user.
*
* @param iterable|string $abilities
* @param array|mixed $arguments
* @return bool
*/
public function none($abilities, $arguments = [])
{
return ! $this->any($abilities, $arguments);
}
OtherDeviceLogoutイベントが追加されました (#27865, 5e87f2d)
ユーザーがパスワードを変更した際に発火されるイベントが追加されました。
尚、Laravel上でユーザーのパスワード変更時に他のデバイスからログアウトさせるためには、app/Http/Kernel.phpで\Illuminate\Session\Middleware\AuthenticateSessionクラスを有効にする必要があります。
bladeエンジンでループ処理を行う際に取得可能な値にevenとoddが追加されました (#27883)
詳しい変更については以下を確認してください。
Release v5.8.5 · laravel/framework · GitHub
[Laravel] 5.8.4がリリースされました
laravel/frameworkのバージョン5.8.4がリリースされました。追加された機能について確認します。
Collectionクラスにjon()メソッドが追加されました (#27723)
implode()メソッドと似ていますが、Collectionの値を文字列で連結する場合に最後の項目にのみ指定の語句を追加することができます。
$this->assertEquals('a, b, c', (new Collection(['a', 'b', 'c']))->join(', '));
$this->assertEquals('a, b and c', (new Collection(['a', 'b', 'c']))->join(', ', ' and '));
$this->assertEquals('a and b', (new Collection(['a', 'b']))->join(', ', ' and '));
$this->assertEquals('a', (new Collection(['a']))->join(', ', ' and '));
$this->assertEquals('', (new Collection([]))->join(', ', ' and '));
Illuminate\Foundation\Http\KernelクラスにgetRouteMiddleware()メソッドが追加されました (#27852)
ルートミドルウェアに登録されたミドルウェアを取得可能になりました。
これにより特定のミドルウェアが登録されていることのテストが可能になりました。
/** @test */
public function it_registers_a_custom_route_middleware()
{
$middlewares = resolve(\App\Http\Kernel::class)->getRouteMiddleware();
$this->assertArrayHasKey('custom', $middlewares);
$this->assertEquals(\App\Http\Middleware\Custom::class, $middlewares['custom']);
}
Strクラスにデンマーク言語特有の処理が追加されました (#27857)
詳しい変更については以下を確認してください。
Release v5.8.4 · laravel/framework · GitHub
[Laravel] 5.8.3がリリースされました
laravel/frameworkのバージョン5.8.3がリリースされました。追加された機能について確認します。
CollectionクラスにcountBy()メソッドが追加されました
Collection内の配列を値毎にカウントできるようになりました。
collect([ 1, 2, 2, 2, 3 ])->countBy(); // == collect([ 1 => 1, 2 => 3, 3 => 1 ])
また、コールバックに関数を指定することでカウント方法をカスタマイズできます。
collect([ '[email protected]', '[email protected]', '[email protected]' ])
->countBy(function ($email) {
return substr(strrchr($email, "@"), 1);
}); // == collect([ 'gmail.com' => 2, 'yahoo.fr' => 1 ])
EloquentUserProviderクラスにnewModelQuery()メソッドが追加されました
ユーザーの認証時に仕様するEloquentUserProviderですが、アプリケーション独自の認証方法を実装する際には各インターフェイスの実装が必要でした。
EloquentUserProvider継承したクラスでnewModelQuery()メソッドをカスタマイズすることで拡張が容易になります。
adminロールが指定されたユーザーの認証を利用する例:
<?php
namespace App\Extensions;
use Illuminate\Auth\EloquentUserProvider;
class MyEloquentAdminProvider extends EloquentUserProvider
{
protected function modelQuery($model = null)
{
return parent::newModelQuery($model)->where('role', 'admin');
}
}
StartSessionクラスにsaveSession()メソッドが追加されました
ミドルウェア内でSession情報を扱う場合にhandle()メソッドをオーバーライドすることなく、Session情報のみを扱う用途で使用します。
/**
* Save the session data to storage.
*
* @param \Illuminate\Http\Request $request
* @return void
*/
protected function saveSession($request)
{
if ($request->route()->named('statamic.cp.session.timeout')) {
return;
}
session()->put('last_activity', now()->timestamp);
parent::saveSession($request);
}
ModelクラスのbelongsToMany()メソッドの2つ目の引数にModel/Pivotクラスを渡せるようになりました
belongsToManyを利用する場合は関連テーブル名をハードコーディングし、using()メソッドを使って中間テーブルを指定する必要がありました。
Model::getTable()を使い動的に取得する方法もありましたが、Pivotモデルを直接渡すことでシンプルに記述できるようになりました。
return $this->belongsToMany(Profile::class, CustomerProfile::class);
詳しい変更については以下を確認してください。
Release v5.8.3 · laravel/framework · GitHub
[Laravel] 5.8がリリースされました
laravel/frameworkのバージョン5.8がリリースされました。追加された機能について確認します。
Release
EloquentクラスにHasOneThrough()メソッドが追加されました
関連するリレーションを経由したリレーションを操作できます。
たとえば、SupplierモデルにAccountモデルが1つあり、AccountモデルにAccountHistoryモデルが1つあるとします。
Accountモデルを通じてSupplierのAccountHistoryを1件するには、hasOneThroughリレーションを使用します。
Schema:
// suppliers table
Schema::create('suppliers', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
// accounts table
Schema::create('accounts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('supplier_id');
$table->string('email');
$table->timestamps();
});
// account_histories table
Schema::create('account_histories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('account_id');
$table->string('sentence');
$table->timestamps();
});
hasOneThrough Model:
// App\Supplier class
/**
* Get the account history for the supplier.
*/
public function accountHistory()
{
return $this->hasOneThrough(AccountHistory::class, Account::class);
}
$supplier->accountHistory;
Result:
{
"id": 1,
"account_id": 1,
"content": "Officia quas velit minus explicabo quibusdam a.",
"created_at": "2019-02-27 01:52:21",
"updated_at": "2019-02-27 01:52:21",
"laravel_through_key": 1
}
// select * from `suppliers` where `suppliers`.`id` = 1 limit 1
// select `account_histories`.*, `accounts`.`supplier_id` as `laravel_through_key` from `account_histories` inner join `accounts` on `accounts`.`id` = `account_histories`.`account_id` where `accounts`.`supplier_id` = 1 limit 1
また、Supplierの全てのAccountHistoryを取得する場合にはhasManyThrough()リレーションを使用します。
hasManyThrough Model:
// App\Supplier class
/**
* Get the account histories for the supplier.
*/
public function accountHistories()
{
return $this->hasManyThrough(AccountHistory::class, Account::class);
}
$supplier->accountHistories;
Result:
[
{
"id": 1,
"account_id": 1,
"content": "Officia quas velit minus explicabo quibusdam a.",
"created_at": "2019-02-27 01:52:21",
"updated_at": "2019-02-27 01:52:21",
"laravel_through_key": 1
},
{
"id": 2,
"account_id": 2,
"content": "Qui ut optio est voluptatem dolores voluptatem tempore.",
"created_at": "2019-02-27 01:52:21",
"updated_at": "2019-02-27 01:52:21",
"laravel_through_key": 1
},
...
{
"id": 201,
"account_id": 1,
"content": "Qui odio excepturi magni est quisquam.",
"created_at": "2019-02-27 01:52:22",
"updated_at": "2019-02-27 01:52:22",
"laravel_through_key": 1
},
{
"id": 202,
"account_id": 2,
"content": "Sed nesciunt architecto est voluptas officiis esse voluptatem.",
"created_at": "2019-02-27 01:52:22",
"updated_at": "2019-02-27 01:52:22",
"laravel_through_key": 1
}
]
// select * from `suppliers` where `suppliers`.`id` = 1 limit 1
// select `account_histories`.*, `accounts`.`supplier_id` as `laravel_through_key` from `account_histories` inner join `accounts` on `accounts`.`id` = `account_histories`.`account_id` where `accounts`.`supplier_id` = 1
モデルのPolicyが自動検出されるようになりました
v5.7までのPolicyの利用にはAuthServiceProviderへの手動登録が必要でしたが、v5.8からは自動で登録されるようになります。
自動登録を行うには、クラス名をモデル名 + Policyとし、app/policiesディレクトリへ配置するという命名規則に従う必要があります。
また、独自の命名規則を使用する場合にはGateクラスのguessPolicyNameUsing()メソッドを利用して拡張することができます。
// app/Providers/AuthServiceProvider.php
public function boot()
{
$this->registerPolicies();
Gate::guessPolicyNameUsing(function ($modelClass) {
$policyClass = class_basename($modelClass) . 'Authorizer';
return "App\\Policies\\{$name}";
});
}
Cacheの仕様がPSR-16に準拠されました
以下のキャッシュメソッドに渡していた整数の引数の値が分数から秒数へ変更されました。
put
putMany
add
remember
setDefaultCacheTime
引数としてDateTimeクラス(Carbonクラス等の拡張クラス含む)を渡している場合には変更はありません。
// Laravel 5.7 - Store item for 30 minutes...
Cache::put('foo', 'bar', 30);
// Laravel 5.8 - Store item for 30 seconds...
Cache::put('foo', 'bar', 30);
// Laravel 5.7 / 5.8 - Store item for 30 seconds...
Cache::put('foo', 'bar', now()->addSeconds(30));
Broadcastに複数の認証が指定可能になりました
以前のリリースでは、BroadcastChannelはアプリケーションのデフォルト認証を介してユーザを認証していました。
Laravel 5.8以降では、通知要求を認証するための複数の認証を割り当てることができます。
Broadcast::channel('channel', function() {
// ...
}, ['guards' => ['web', 'admin']])
API Tokenの認証にSHA256ハッシュのサポートが追加されました
プレーンテキストTokenを格納するよりもセキュリティが向上します。
利用するにはconfig/auth.phpでhashの利用を許可します。
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => true,
],
また、API Tokenの作成はユーザー登録時には行わず、アプリケーション内に独自のAPIトークン管理ページを実装する必要があります。
このページでは、ユーザーが自分のAPI Tokenを初期化して更新できるようにする必要があります。
ユーザーのTokenの初期化または更新が必要な場合は、Tokenのハッシュコピーをデータベースに格納し、Tokenのプレーンテキストコピーを一度表示するためにクライアントに返す必要があります。
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
class ApiTokenController extends Controller
{
/**
* Update the authenticated user's API token.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function update(Request $request)
{
$token = Str::random(60);
$request->user()->forceFill([
'api_token' => hash('sha256', $token),
])->save();
return ['token' => $token];
}
}
メールアドレスに対するバリデーションが改善されました
Scheduleを実行するタイムゾーンの指定が可能になりました
timezone()メソッドを使ってスケジュールされたタスクのタイムゾーンを指定できます。
$schedule->command('inspire')
->hourly()
->timezone('America/Chicago');
また、すべてのスケジュールされたタスクに対して同じタイムゾーンを指定する場合には、\App\Console\KernelクラスのscheduleTimezone()メソッドを利用して一律に設定が可能です。
/**
* Get the timezone that should be used by default for scheduled events.
*
* @return \DateTimeZone|string|null
*/
protected function scheduleTimezone()
{
return 'America/Chicago';
}
Pivotモデルの更新時にEloquentモデルイベントが発行されうようになりました
Artisanクラスのcall()メソッドの引数問題が改善されました
Laravelの以前のリリースでは、コマンドのオプションはメソッドの2番目の引数として配列を介して渡されていました。
use Illuminate\Support\Facades\Artisan;
Artisan::call('migrate:install', ['database' => 'foo']);
しかし、Laravel 5.8では、オプションを含むコマンド全体をメソッドの最初の文字列引数として渡すことができます。
Artisan::call('migrate:install --database=foo');
テスト時のMock、Spyに関するヘルパーメソッドが追加されました
モックオブジェクトをより便利にするために、新しいモックメソッドとスパイメソッドが基本のLaravelテストケースクラスに追加されました。
これらのメソッドは、モッククラスを自動的にコンテナにバインドします。
// Laravel 5.7
$this->instance(Service::class, Mockery::mock(Service::class, function ($mock) {
$mock->shouldReceive('process')->once();
}));
// Laravel 5.8
$this->mock(Service::class, function ($mock) {
$mock->shouldReceive('process')->once();
});
Resourcesクラスを利用してDatabaseCollectionのレスポンスを行う際にkeyをカスタマイズできるようになりました
コレクションのキーを保存するかどうかを示すpreserveKeysプロパティをリソースクラスに追加できるようになりました。
デフォルトでは、そして以前のLaravelリリースとの一貫性を保つために、キーはデフォルトでリセットされます。
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class User extends JsonResource
{
/**
* Indicates if the resource's collection keys should be preserved.
*
* @var bool
*/
public $preserveKeys = true;
}
preserveKeysプロパティが未設定の場合には、コレクションキーは保持されます。
use App\User;
use App\Http\Resources\User as UserResource;
Route::get('/user', function () {
return UserResource::collection(User::all()->keyBy->id);
});
EloquentモデルのorWhere()メソッドがHigherOrderに対応しました
Laravelの以前のリリースでは、論理和演算子を介して複数のEloquentモデルスコープを組み合わせるには、Closureコールバックを使用する必要がありました。
// scopePopular and scopeActive methods defined on the User model...
$users = App\User::popular()->orWhere(function (Builder $query) {
$query->active();
})->get();
Laravel 5.8では、クロージャを使用せずにこれらのスコープをスムーズに連鎖させることができるHigherOrderなorWhereメソッドが導入されました。
$users = App\User::popular()->orWhere->active()->get();
Artisan Serveコマンドでのビルドインサーバーを複数起動可能になりました
Laravelの以前のリリースでは、Artisanのserveコマンドはポート8000でビルドインサーバーを提供していました。
別のアプリケーションでserveコマンドを実行した場合には、既にポートがlistenされているため、コマンドはエラーを投げていました。
Laravel 5.8以降、serveはポート8009までの使用可能なポートをスキャンするようになりました。これにより、一度に複数のアプリケーションに対応できます。
Bladeファイルへの追跡が可能になりました
Bladeテンプレートをコンパイルするとき、Laravelはコンパイル済みファイルの先頭に元のBladeテンプレートへのパスを含むコメントを追加するようになりました。
Cache、SessionのドライバにDynamoDBが利用可能になりました
DynamoDBをドライバとして利用する場合にはconfig/cache.phpを設定します。
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
],
Carbon 2.0がサポートされました
Pheanstalk 4.0がサポートされました
Upgrade
MySQLでJson型のカラムの結果を受け取る場合に引用符が付与されなくなりました
MySQLとMariaDBを使用している場合、クエリービルダーは引用符で囲まれていないJSON値を返すようになりました。
この動作は、サポートされている他のデータベースと一貫性があります。
その結果、 ->>`演算子はサポートされなくなり、必要なくなりました。
$value = DB::table('users')->value('options->language');
dump($value);
// Laravel 5.7...
'"en"'
// Laravel 5.8...
'en'
Illuminate/Events/Dispatcherクラスのfire()メソッドが削除されました
代わりにdispatch()メソッドを使用してください。
SoftDeleteを利用したモデルのdeleted_atカラムがキャストされるようになりました
EloquentモデルがSoftDeletesトレイトを使用するとき、deleted_atプロパティは自動的にCarbonインスタンスにキャストされます。
この動作を無効にするには、そのプロパティのカスタムアクセサを作成するか、手動でcasts属性に追加します。
protected $casts = ['deleted_at' => 'string'];
MarkDownメールのファイルディレクトリが変更されました
/resources/views/vendor/mail/markdownへ変更されました。
以前にvendor:publishを実行してファイルをコピーしている場合には手動で変更する必要があります。
str_*およびarray_*に関するヘルパーが非推奨になりました
これらのヘルパーは削除される予定なので、代わりにIlluminate\Support\ArrおよびIlluminate\Support\Strクラスを使用してください。
ヘルパーが必要な場合は、laravel/helpersパッケージを追加でインストールしてください。
NexmoおよびSlack への通知クラスが外部パッケージへと変更されました
アプリケーションでこれらのチャンネルを使用するには、以下のパッケージが必要です。
composer require laravel/nexmo-notification-channel
composer require laravel/slack-notification-channel
詳しい変更については以下を確認してください。
Release Notes - Laravel - The PHP Framework For Web Artisans
[Laravel] 5.7.26がリリースされました
laravel/frameworkのバージョン5.7.26がリリースされました。追加された機能について確認します。
PipelineクラスにthenReturn()メソッドが追加されました
Pipelineで処理するオブジェクトに対して、チェインメソッドで続けて処理が記述できるようになりました。
// \Illuminate\Pipeline\Pipeline
/**
* Run the pipeline and return the result.
*
* @return mixed
*/
public function thenReturn()
{
return $this->then(function ($passable) {
return $passable;
});
}
---
$users = app(Pipeline::class)
->send(User::query())
->through($pipes)
->thenReturn()
->whereConfirmedEmail()
->whereAccountActive()
->get();
TaggedCacheクラスにgetTags()メソッドが追加されました
現在キャッシュされているタグの状態(\Illuminate\Cache\TagSet)を取得できます。
ResponseTraitクラスにgetCallback()メソッドが追加されました
JSONPレスポンスを作成する場合にwithCallback()メソッドで指定するコールバックの内容を取得できます。
// \Illuminate\Http\ResponseTrait
/**
* Get the callback of the response.
*
* @return string|null
*/
public function getCallback()
{
return $this->callback ?? null;
}
laravel/frameworkパッケージのコンポーネント毎にライセンスが追加されました
ModelクラスにwithoutEvents()メソッドが追加されました
以前までのEloquentモデル内で発火される各イベントを無効化するには、処理を行う前後でEventDispatcherの無効・有効を切り替えたり、Event::fake()を使って個別に指定する必要がありましたが、モデル内のイベントの切り替えが容易になりました。
Before:
$dispatcher = User::getEventDispatcher();
User::unsetEventDispatcher();
$user = factory(User::class)->create();
User::setEventDispatcher($dispatcher);
$user->doSomethingWhereEventsShouldFire();
After:
$user = User::withoutEvents(function () {
return factory(User::class)->create();
});
$user->doSomethingWhereEventsShouldFire();
詳しい変更については以下を確認してください。
Release v5.7.26 · laravel/framework · GitHub
[Laravel] 5.7.25がリリースされました
laravel/frameworkのバージョン5.7.25がリリースされました。追加された機能について確認します。
日付に関連するバリデーションエラーのメッセージがカスタマイズ可能になりました
以下のバリデーションにおいて、resources/lang/ja/validation.php等で定義されいるメッセージのうち:dateを用いて置換される値の変更が可能になりました。
afterorequal
before
beforeorequal
date_equals
例えばdate_equals:tomorrowを利用する場合には、tomorrowを置換する文言をしていします。
// en/validation.php
'values' => [
'date' => [
'tomorrow' => 'the day after today',
],
],
// => The date must be a date equal to the day after today.
MSSQL grammarにcomputed columnのサポートが追加されました
$blueprint = new Blueprint('products');
$blueprint->integer('price');
$blueprint->computed('discounted_virtual', 'price - 5');
$blueprint->computed('discounted_stored', 'price - 5')->persisted();
// => alter table "products" add "price" int not null, "discounted_virtual" as (price - 5), "discounted_stored" as (price - 5) persisted
環境設定でCacheファイルのパスを設定可能になりました
bootstrap/cache内のservices、packages、routesをそれぞれ指定できます。
// .env
APP_SERVICES_CACHE=services cache file path
APP_PACKAGES_CACHE=packages cache file path
APP_ROUTES_CACHE=routes cache file path
詳しい変更については以下を確認してください。
Release v5.7.25 · laravel/framework · GitHub
[Laravel] 5.7.23がリリースされました
laravel/frameworkのバージョン5.7.23がリリースされました。追加された機能について確認します。
AbstractPaginatorクラスにgetOptions()メソッドが追加されました
ページネーションを作成する際に利用しているオプションを取得できるようになりました。
クラスを継承しているLengthAwarePaginator、Paginatorについても同様のメソッドが利用できます。
$p = new Paginator($array = ['item1', 'item2', 'item3'], 2, 2, ['path' => 'http://website.com/test']);
$options = $p->getOptions(); // -> ['path' => 'http://website.com/test']
DetectsLostConnectionsトレイとにエラーメッセージCommunication link failureが追加されました
EloquentBuilderのscopeに関するメソッドをorWhereとして直接利用するためのクラスが追加されました
データベースクラスにIlluminate\Database\Eloquent\HigherOrderBuilderProxyが追加され、orWhere()メソッド実行時にコールバックで渡していたクエリをチェイン可能になりました。
内部の動作はCollectionクラスと同様にマジックメソッドを利用してHigherOrderBuilderProxyを実行しています。
scopeメソッドとor演算子を組み合わせる際のコールバックの記述が不要になります。
// scopeFoo, scopeBar, scopeBaz on the Model class
$query->foo()->orWhere(function (Builder $query) {
$query->bar();
})->orWhere(function (Builder $query) {
$query->baz();
});
// after
$query->foo()->orWhere->bar()->orWhere->baz();
// scopeFoo, scopeBar, scopeBaz on the Model class
$query->foo()->orWhere(function (Builder $query) {
$query->bar();
})->baz();
// after
$query->foo()->orWhere->bar()->baz();
同じような処理はCollectonにも実装されていますが、初めて見る場合には実装が把握しづらいと思われます。
こちら(#27281)の内容を一読しておくとよいでしょう。
アプリケーションパスを設定できるようになりました
bootstrap/app.phpにて指定可能です。
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
$app->useAppPath(__DIR__ . '/../src/App');
ログ設定のStackDriverでWhatFailureGroupHandlerが利用可能になりました
例えばログをSlackに通知している場合に、ネットワーク等の問題で通知できなかった場合にエラーを無視して次のハンドラを実行します。
本番環境などでホワイトスクリーンを防ぐのに非常に役に立ちます。
monolog/02-handlers-formatters-processors.md at master · Seldaek/monolog · GitHub
利用する際にはconfig/logging/phpへignore_exceptionsを追加します。
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => true,
],
詳しい変更については以下を確認してください。
Release v5.7.23 · laravel/framework · GitHub
[Laravel] 5.7.20がリリースされました
laravel/frameworkのバージョン5.7.20がリリースされました。追加された機能について確認します。
リレーションでchunkById()メソッドがサポートされました
リレーションを指定しているモデルで以下のように利用できます。
$user->posts()->chunkById(2, function ($collection) {
// ...
});
CollectionにwhereNotBetween()メソッドが追加されました
値の範囲外でフィルターをかけることができます。
$collection = collect([
['product' => 'Pencil', 'price' => 30],
['product' => 'Chair', 'price' => 80],
['product' => 'Door', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Desk', 'price' => 200],
]);
$filtered = $collection->whereNotBetween('price', [100, 200]);
$filtered->all();
/*
[
['product' => 'Bookcase', 'price' => 30],
['product' => 'Bookcase', 'price' => 80],
]
*/
ログチャンネルで出力されるログのフォーマットを変更できるようになりました
FilesystemAdapterにassertExistsとassertMissingアサーションが追加されました
DetectsLostConnectionsトレイトにエラー内容が追加されました
RouteにoriginalParameters()メソッドが追加されました
LaravelではModel Binding等でリクエストされたパラメーターに対して、それに対応するオブジェクト等をバインドできます。
コントローラー等でオリジナルのパラメーターが必要な場合にこのメソッドを利用します。
$phpunit = $this;
$router = $this->getRouter();
$router->bind('bar', function ($value) {
return strlen($value);
});
$router->get('foo/{bar}', [
'middleware' => SubstituteBindings::class,
'uses' => function ($bar) use ($router, $phpunit) {
$route = $router->getCurrentRoute();
$phpunit->assertEquals('taylor', $route->originalParameter('bar'));
$phpunit->assertEquals('default', $route->originalParameter('unexisting', 'default'));
$phpunit->assertEquals(['bar' => 'taylor'], $route->originalParameters());
return $bar;
},
]);
$this->assertEquals(6, $router->dispatch(Request::create('foo/taylor', 'GET'))->getContent());
QueueFakeにpushedJobs()メソッドが追加されました
詳しい変更については以下を確認してください。
Release v5.7.20 · laravel/framework · GitHub
[Laravel] 5.7.19がリリースされました
laravel/frameworkのバージョン5.7.19がリリースされました。追加された機能について確認します。
CollectionクラスにwhereBetween()メソッドが追加されました
使い方としてはEloquentのwhereBetween()と同じです。
内部では以下のように展開されます。
/**
* Filter items where the given key between values.
*
* @param string $key
* @param array $values
* @return static
*/
public function whereBetween($key, $values)
{
return $this->where($key, '>=', reset($values))->where($key, '<=', end($values));
}
詳しい変更については以下を確認してください。
Release v5.7.19 · laravel/framework · GitHub
また、laravel/laravelのリポジトリにも大きな変更がありました。
Laravel Mixがv4にアップデートされ、依存するパッケージの内容が変更されています。
Merge branch 'mix' of https://github.com/JeffreyWay/laravel into Jeff… · laravel/laravel@70532dd · GitHub
v4では大きな変更があり、今までLaravel Mixが依存していたパッケージ群が分離され、別途インストールする必要があります。
コンパイル速度の改善
npmインストールの速度の改善
webpack 4へのアップグレード
vue-loader 15へのアップグレード
Babel 7へのアップグレード
mix.extract()実行時に依存するVendorパッケージが自動的に別ファイルに分離されるようになります
Css Minify時にcssNanoのよるオプションの追加
PostCSSプラグインの有効化、またmix.sass()毎にオプションが定義できるようになります
JSの最適化、縮小エンジンがUglifyからTerserに変更されました
node-sassからDart Sassに変更されました
プロジェクトルートに.babelrcファイルを作成することで、Mixを通じて提供されるデフォルトのBabelプラグインとプリセットを上書きまたは調整できます
以下がリリース情報ですが、一度目を通しておくことをおすすめします。
Release v4.0.0 · JeffreyWay/laravel-mix · GitHub
[Laravel] 5.7.18がリリースされました
laravel/frameworkのバージョン5.7.18がリリースされました。追加された機能について確認します。
バリデーションstarts_withのメッセージが変更されました
Facade::resolved()メソッドが追加されました
extend()の代わりになるメソッドで、package discoveryよりも前にロードされます。
configをキャッシュするファイルパスを指定できるようになりました
.envファイルにAPP_CONFIG_CACHEを指定できるようになりました。
/**
* Get the path to the configuration cache file.
*
* @return string
*/
public function getCachedConfigPath()
{
return $_ENV['APP_CONFIG_CACHE'] ?? $this->bootstrapPath().'/cache/config.php';
}
詳しい変更については以下を確認してください。
Release v5.7.18 · laravel/framework · GitHub