こんにちは。やまゆです。
Laravel で最大規模のイベントである LaraconUS 2023 が日本時間の 2023/07/20~2023/07/21 の2日間、アメリカテネシー州のナッシュビルで開催された模様です。
現地参加は出来なかったので、 Twitter 等で情報収集して発表された内容をいくつかかいつまんでまとめてみます。
スタート
8時半から受付開始とのことで、朝はえーすげーとなりました。
会場は 800 人の開発者で埋め尽くされたそうです!凄い活気!
めっちゃパリピなフォトスポットも提供されていた様子です。なんか...日本と違ってみんな陽気だな。。。
Nuno Maduro さんによる Pest 2 "Spicy Summery" リリース情報
Pest は Nuno maduro さんが作成した PHPUnit ベースの PHP テスティングフレームワークです。
通常の PHPUnit テストでは、様々なボイラープレートコードを書く必要があります。
<?php
namespace Tests;
final class SumTest extends PHPUnit\Framework\TestCase
{
public function testSum(): void
{
$result = sum(1, 2);
self::assertSame(3, $result);
}
}
これを超絶シンプルに JavaScript テストランナーライクな形で書けるようにしたのが Pest です。
test('sum', function () {
$result = sum(1, 2);
expect($result)->toBe(3);
});
今回 v2.9.0 で新しく複数の機能がリリースされたようです。
ビルトインスナップショットテスト
JavaScript では良く使われていますが、出力結果をスナップショットとして保持し、そこに変更がないか(リグレッションしていないか)を単純にテストする 「スナップショットテスト」 が使えるようになりました。
it('has a contact page', function () {
$response = $this->get('/contact');
expect($response)->toMatchSnapshot();
});
こう書くと自動的に tests/.pest/snapshots
ディレクトリ内にスナップショットが保持され、毎回のテストで出力に変更がないかを確認することが出来ます。
スナップショットの中身は $response
だけでなく配列などなんでも入れることが可能らしいです。恐らく serialize
してその文字列に対して比較しているのではないでしょうか(実装覗いてないけど)。
describe
ブロック
テストの中でグルーピングをするための describe
ブロックが追加になりました。これは良く使われる機能なので待っていた人も多いのではないでしょうか。
アーキテクショナルテスト++
Pest では、実行結果だけでなく、設計が正しいかどうかもテストすることが出来ます。
test('controllers')
->expect('App\Http\Controllers')
->toUseStrictTypes()
->toHaveSuffix('Controller') // or toHavePreffix, ...
->toBeReadonly()
->toBeClasses() // or toBeInterfaces, toBeTraits, ...
->classes->not->toBeFinal() // 🌶
->classes->toExtendNothing() // or toExtend(Controller::class),
->classes->toImplementNothing() // or toImplement(ShouldQueue::class),
それらの中で新しく assertion が追加されたようです。
型カバレッジプラグイン
もちろん実行カバレッジは元々取得することが出来ますが、今回のバージョンから「型を付けられる場所でちゃんとついているかどうか」のカバレッジを行単位で取ることが出来るようになったそうです!
public function find($id) // <- 型宣言がない
{
return User::find($id);
}
...
app/Models\User.php .......................................... 100%
app/Repositories/UserRepository.php .................. pa8, rt8 33%
───────────────────────────────────────────────────────────────────
Total: 91.6 %
psalm や phpstan などでも型宣言忘れに対して気を付けることは出来ますが、実際にカバレッジとして数字で出てくれるのは嬉しいですね。
Drift プラグイン
PHPUnit で書かれたテストを Pest の形式に変えるのは大変です。
それを自動でやってくれるのが Drift Plugin
だそうです。
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
public function test_that_true_is_true(): void
{
$this->assertTrue(true);
}
}
これをこうしてくれます。
test('true is true', function () {
expect(true)->toBeTrue();
});
どこまで完璧にやってくれるかはわかりませんが、素晴らしいですねー。
Jess Archer さんの Laravel Prompts
Laravel CLI の使いやすさは nunomaduro/termwind などでとても自由にスタイリング出来るようになりました。
新しい Laravel Prompts ライブラリを用いることで、 インタラクティブな CLI 入力をよりスマートに実装・実行 出来るようになります。オシャレ!
アフターパーティ
ブラスバンドの演奏と共にパーティが行われていたようです。ウェーイ。
Caleb Porzio さんによる Livewire 3 ベータリリース
PHP でリアクティブなフロントエンドを記述出来る Laravel Livewire ライブラリですが、なんとセッション中に v3 のベータリリースコマンドを叩いてリリースしたようです。カッコイイ。
v2 からスクラッチで書き直され、様々なアップデートが入ったようです。
詳細は Laravel News に記載されています。
<?php
use function Laravel\Volt\{state};
state(['count' => 0]);
$increment = fn () => $this->count++;
?>
<div>
<button wire:click="increment">+</button>
<h1>{{ $count }}</h1>
</div>
Laravel Volt と呼ばれる新しいライブラリで、こんな書き方も出来るようになるらしいです。本当に JavaScript 使いたくないんだな...うん。
Stephen Rees-Carter さんによる Th1nk Lik3 a H4cker
参加者にリアルタイムでハッキングを試みてもらい、その結果を共有するような面白いインタラクティブセッションだったみたいです。
設定の問題を用意して .env が漏洩するケースなどがあったようで、皆さんかなり勉強になったのではないでしょうか?日本でも同じようなことやってみたいですね。
Marcel Pociot さんによる NativePHP の紹介
PHP を書いたらネイティブ(Win, macOS, Linux)アプリとしてコンパイルされる NativePHP の紹介です。
現在アルファリリースされている NativePHP では、macOS アプリのビルドが可能となっています。
- ウィンドウマネジメント
- メニューマネジメント
- ファイルマネジメント
- SQLite サポート
- ネイティブ通知
などの機能が既に実装されています。
あんまり実装見てないですが、 Electron によるネイティブアプリの裏で PHP ビルトインサーバを動かして、 WebView + Livewire でレンダリングしつつ協調して動くみたいですね。闇魔術かも。
Laravel Herd
Laravel を macOS で開発する際に便利に環境構築が出来る Laravel Valet ですが、それを fork してさらに使いやすくした Laravel Herd がリリースされました。
Valet は Homebrew をベースに構築されていましたが、 Herd は Homebrew などに依存せず、単体で完結して動作します。
DB は変わらず DBngin などが推奨されているようです。
PHP の静的バイナリを生成してそれを利用する形なので、他の依存関係をインストールする必要がないのが特徴的です。
まだ xdebug は入っていないということで、今後に期待ですね。
Valet からの移行も自動的にやってくれるみたいなので、今後の主流の一つとなりえるかも?
Laravel Folio
Blade ファイルの命名規則に従って自動的にルーティングを行ってくれるようなライブラリではないかと推測します。いちいち return render('pages/index.blade.php');
とか書かなくて済むようになるのかな?便利
Laravel Precognition
簡単に Laravel/Rails + Vue/React/Svelte で SPA を作れる Inertia.js で、より簡単にフォームのリアルタイムバリデーションを行うことが出来るようになります。
実際に送信ボタンを押して POST リクエストを送ってからバリデートを行うより、入力直後にバリデートして結果をもらった方が UX 良いですよね?それを実現するプロダクトとなっているようです。
import { useForm } from 'laravel-precognition-react';
// コンポーネント関数宣言
export default function Form() {
// 今回使うフォーム変数を設定
const form = useForm('post', '/users', {
name: '',
email: '',
});
// 送信関数
const submit = (e) => {
e.preventDefault();
form.submit();
};
return (
<form onSubmit={submit}>
<label for="name">Name</label>
<input
id="name"
value={form.data.name}
onChange={(e) => form.setData('name', e.target.value)}
onBlur={() => form.validate('name') /* ここで非同期に validation を実行 */}
/>
{/* invalid だったらエラーとして表示 */ form.invalid('name') && <div>{form.errors.name}</div>}
<label for="email">Email</label>
<input
id="email"
value={form.data.email}
onChange={(e) => form.setData('email', e.target.value)}
onBlur={() => form.validate('email')}
/>
{form.invalid('email') && <div>{form.errors.email}</div>}
<button>Create User</button>
</form>
);
};
useForm
メソッドに validate
が生え、そこで特定のプロパティに対するバリデーションを自動的に実行してくれます。
バリデーションのルールをサーバサイドで書くだけで済むようになるのもうれしい。
これは Middleware と FormRequest を用いることでうまく実装されているようで、フォームの onBlur などで POST リクエストを先に発行し、結果を表示してくれる優れものです。今後早く使ってみたいですね!
Laravel 11 Preview
ディレクトリ構成含め様々な変更が入るみたいです。
- コントローラはベースコントローラを継承しないように
- Middleware フォルダ削除
- app/Http/Kernel.php 削除
- これらは AppServiceProvider.php で定義する形に
- config ディレクトリが空っぽに。デフォルトから上書きしたいファイルだけ追加で書きこむ形に
- routes/ の中身が console.php と web.php のみに。 api/channel が必要な場合は CLI から生成可能。
ロゴ・ブランディングについて
caneco.gif さんが今回様々なライブラリのロゴ制作にかかわったようです。すごいセンスいいですね!
次は #LaraconIndia 2024 !
2024/03/23-24 にかけて、 Udaipur という都市で実施されるみたいですね!
(LaraconJP 出来たらいいなー)
まとめ
Laravel 11 もアツそうですが、周辺ライブラリがどんどん充実している素晴らしいエコシステムがさらに発展していきそうで、やっぱり使っててよかったなーと思っています。
問題はライブラリが多すぎて「何が何するねん?」と混乱してしまう所でしょうか。