今日、PHP Laravelフレームワークの新しいバージョンのエントリー-5.4! 新しいバージョンでは、電子メールと通知を生成するためのマークダウンマークアップのサポート、Redisのサポートが改善され、Bladeテンプレートエンジンの新機能が追加されました。 しかし、まず最初に。
メールと通知のマークダウンマークアップ
Markdownのサポートにより、Laravelはメール用の美しくレスポンシブなHTMLテンプレートを生成できるようになり、プレーンテキストバージョンも生成できるようになりました。 たとえば、メールを生成するためのコードは次のようになります。
@component('mail::message') # Order Shipped Your order has been shipped! @component('mail::button', ['url' => $url]) View Order @endcomponent Next Steps: - Track Your Order On Our Website - Pre-Sign For Delivery Thanks,<br> {{ config('app.name') }} @endcomponent
次のようになります。
ララヴェル夕暮れ
Laravel Duskは、新しいエンドツーエンドのアプリケーションテストユーティリティです。 デフォルトでは、JDKまたはSeleniumを使用して使用する必要はありません。 代わりに、DuskはスタンドアロンバージョンのChromeDriveを使用しますが、Seleniumと互換性のある他のドライバーも使用できます。
Duskはテストに実際のブラウザを使用しているため、JavaScriptを使用するアプリケーションを簡単にテストして対話できます。
/** * A basic browser test example. * * @return void */ public function testBasicExample() { $user = factory(User::class)->create([ 'email' => 'taylor@laravel.com', ]); $this->browse(function ($browser) use ($user) { $browser->loginAs($user) ->visit('/home') ->press('Create Playlist') ->whenAvailable('.playlist-modal', function ($modal) { $modal->type('name', 'My Playlist') ->press('Create'); }); $browser->waitForText('Playlist Created'); }); }
ブレードテンプレートのコンポーネントとスロット
Bladeテンプレートエンジンの新機能(コンポーネントとスロット)を使用すると、セクションとテンプレートを使用して行うことに慣れているすべてのことを実行できます。 ただし、一部の開発者にとっては、コンポーネントスロットモデルの方がはるかに理解しやすいように思えるかもしれません。 まず、すべてのテンプレートのアプリケーションで使用するアラートコンポーネントがあることを想像してください。
<!-- /resources/views/alert.blade.php --> <div class="alert alert-danger"> {{ $slot }} </div>
変数{{ $slot }}
には、コンポーネントに渡したいコンテンツが含まれます。 このコンポーネントを宣言するには、新しい@component @component
を使用します。
@component('alert') <strong>Whoops!</strong> Something went wrong! @endcomponent
名前付きスロットを使用すると、1つのコンポーネントで複数のスロットを使用できます。
<!-- /resources/views/alert.blade.php --> <div class="alert alert-danger"> <div class="alert-title">{{ $title }}</div> {{ $slot }} </div>
@slot
ディレクティブを使用してコンポーネントに渡されます。 このディレクティブ以外のコンテンツはすべて、 $slot
変数としてコンポーネントに渡されます。
@component('alert') @slot('title') Forbidden @endslot You are not allowed to access this resource! @endcomponent
ブロードキャストモデルバインディング
HTTPルートと同様に、イベントリスンチャネルのルートも暗黙的なモデルバインディングを使用できるようになりました。 たとえば、文字列または数値IDの代わりに、Orderモデル(クラス)のインスタンスを渡すことができます。
use App\Order; Broadcast::channel('order.{order}', function ($user, Order $order) { return $user->id === $order->user_id; });
高次メッセージ(HOM)
コレクションは、コレクションでの一般的な操作を可能にする高次メッセージをサポートするようになりました。 以下のメッセージが利用可能になりました。
- 含む
- それぞれ
- 毎回
- フィルター
- 最初に
- 地図
- 仕切り
- 拒絶する
- sortBy
- sortByDesc
- 合計
各メッセージは、コレクションインスタンスの動的プロパティとしてアクセスできます。 たとえば、メッセージをeach
使用して、コレクション内の各オブジェクトにメソッドを適用します。
$users = User::where('votes', '>', 500)->get(); $users->each->markAsVip();
同様に、 sum
を使用して、たとえば、ユーザーのコレクションの投票数を計算できます。
$users = User::where('group', 'Development')->get(); return $users->sum->votes;
雄弁なカスタムイベントハンドラー
Eloquentのイベントハンドラーをイベントオブジェクトにバインドできるようになりました。 これにより、Eloquentイベントの処理がはるかに簡単になり、これらのイベントのテストも簡単になります。 このイノベーションを使用するには、モデルのクラスで$events
プロパティを宣言する必要があります。これにより、独自のクラスを使用してEloquentベースイベントを処理できます。
<?php namespace App; use App\Events\UserSaved; use App\Events\UserDeleted; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The event map for the model. * * @var array */ protected $events = [ 'saved' => UserSaved::class, 'deleted' => UserDeleted::class, ]; }
すべてのプロセスの再試行とタイムアウト
以前は、「再試行」および「タイムアウト」の設定は、すべてのコマンドラインプロセスに対してグローバルに設定されていました。 Laravel 5.4では、これらの設定は、プロセスクラスで直接定義することにより、各プロセスに対して個別に設定できるようになりました。
<?php namespace App\Jobs; class ProcessPodcast implements ShouldQueue { /** * The number of times the job may be attempted. * * @var int */ public $tries = 5; /** * The number of seconds the job can run before timing out. * * @var int */ public $timeout = 120; }
リクエストをクリーンアップするミドルウェア
Laravel 5.4では、 TrimStrings
とTrimStrings
2つの新しいミドルウェア(クエリフィルター)が導入されています。
/** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
これらの2つのフィルターは、値の先頭と末尾のスペースを自動的に削除します。また、空白行をnull
変換しnull
。これにより、各リクエストのデータを正規化し、コードでのtrim
関数の継続的な使用を忘れることができます。
「リアルタイム」ファサード
以前は、デフォルトのLaravelサービスのみがファサードを提供していました。これにより、サービスコンテナーを介してメソッドを迅速かつ簡潔に使用できるようになりました。 Laravel 5.4では、クラスをファサードに簡単にリアルタイムで変換できます。 次のクラスがあると想像してください:
<?php namespace App\Services; class PaymentGateway { protected $tax; /** * Create a new payment gateway instance. * * @param TaxCalculator $tax * @return void */ public function __construct(TaxCalculator $tax) { $this->tax = $tax; } /** * Pay the given amount. * * @param int $amount * @return void */ public function pay($amount) { // Pay an amount... } }
ファサードにするには、Facadesプレフィックスを追加します。
use Facades\ { App\Services\PaymentGateway }; Route::get('/pay/{amount}', function ($amount) { PaymentGateway::pay($amount); });
ファサードシミュレーション機能を使用して相互作用テストを作成することもできます。
PaymentGateway::shouldReceive('pay')->with('100');
カスタムスプレッドシートモデル
Laravel 5.3では、多対多リンクのすべてのリンクテーブルモデルは、 Pivot
組み込みモデルの同じインスタンスを使用します。 Laravel 5.4では、次のようにリンクを宣言した後、ピボットテーブルのモデルを定義できます。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Role extends Model { /** * The users that belong to the role. */ public function users() { return $this->belongsToMany('App\User')->using('App\UserRole'); } }
Redisクラスターのサポートの改善
以前は、1つのアプリケーションで1つのホストとクラスターへのRedis接続を定義することはできませんでした。 Laravel 5.4では、ホストとクラスターへの複数の接続を定義できます。 詳細については、Redisのドキュメントを参照してください。
移行におけるデフォルトの文字列の長さ
Laravel 5.4はデフォルトのエンコードとしてutf8mb4を使用し、データベースへの絵文字の保存をサポートします。 Laravel 5.3からアップグレードする場合、エンコードを変更する必要はありません。
それでも手動で変更する場合、または5.7.7より前のMySQLバージョンを使用するSchema::defaultStringLength
は、 AppServiceProvider
Schema::defaultStringLength
を使用して、移行を生成するデフォルトの行の長さを手動で調整する必要があります。
use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); }
言語ファイルでのJSON形式のサポート
バージョン5.4では、アプリケーションで言語ファイルをコンパイルするためにJSON形式を使用する機能が追加されました。 それらはまだresources/lang
ディレクトリに保存されます。
たとえば、プロジェクトのロシア語翻訳がある場合、 resources/lang
ディレクトリにru.json
を作成できます。その内容は次のようになります。
{ "I love Laravel!": " Laravel!" }