【速報】 #LaraconUS 2023 が開催された模様です

こんにちは。やまゆです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332028/a1cdcdbe-fde8-3070-30ba-8ec4c777d226.png)

https://laracon.us

Laravel で最大規模のイベントである **LaraconUS 2023** が日本時間の 2023/07/20～2023/07/21 の2日間、アメリカテネシー州のナッシュビルで開催された模様です。

現地参加は出来なかったので、 Twitter 等で情報収集して発表された内容をいくつかかいつまんでまとめてみます。

## スタート

8時半から受付開始とのことで、朝はえーすげーとなりました。

https://twitter.com/LaraconUS/status/1681671108930461698

会場は 800 人の開発者で埋め尽くされたそうです！凄い活気！

https://twitter.com/jbrooksuk/status/1681868628185030656

めっちゃパリピなフォトスポットも提供されていた様子です。なんか...日本と違ってみんな陽気だな。。。

## Nuno Maduro さんによる Pest 2 "Spicy Summery" リリース情報

https://twitter.com/laravelnews/status/1681673472647352325

https://pestphp.com/docs/pest-spicy-summer-release

[Pest](https://github.com/pestphp/pest) は Nuno maduro さんが作成した PHPUnit ベースの PHP テスティングフレームワークです。

通常の PHPUnit テストでは、様々なボイラープレートコードを書く必要があります。

```php:tests/SumTest.php
<?php

namespace Tests;

final class SumTest extends PHPUnit\Framework\TestCase
{
    public function testSum(): void
    {
        $result = sum(1, 2);

        self::assertSame(3, $result);
    }
}
```

これを超絶シンプルに JavaScript テストランナーライクな形で書けるようにしたのが Pest です。

```php:tests/SumTest.php
test('sum', function () {
    $result = sum(1, 2);

    expect($result)->toBe(3);
});
```

今回 v2.9.0 で新しく複数の機能がリリースされたようです。

### ビルトインスナップショットテスト

JavaScript では良く使われていますが、出力結果をスナップショットとして保持し、そこに変更がないか（リグレッションしていないか）を単純にテストする **「スナップショットテスト」** が使えるようになりました。

```php
it('has a contact page', function () {
    $response = $this->get('/contact');
 
    expect($response)->toMatchSnapshot();
});
```

こう書くと自動的に `tests/.pest/snapshots` ディレクトリ内にスナップショットが保持され、毎回のテストで出力に変更がないかを確認することが出来ます。

スナップショットの中身は `$response` だけでなく配列などなんでも入れることが可能らしいです。恐らく `serialize` してその文字列に対して比較しているのではないでしょうか(実装覗いてないけど)。

### `describe` ブロック

テストの中でグルーピングをするための `describe` ブロックが追加になりました。これは良く使われる機能なので待っていた人も多いのではないでしょうか。

### アーキテクショナルテスト++

Pest では、実行結果だけでなく、設計が正しいかどうかもテストすることが出来ます。

```php
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 が追加されたようです。

### 型カバレッジプラグイン

もちろん実行カバレッジは元々取得することが出来ますが、今回のバージョンから「型を付けられる場所でちゃんとついているかどうか」のカバレッジを行単位で取ることが出来るようになったそうです！

```php
public function find($id) // <- 型宣言がない
{
    return User::find($id);
}
```

```php
...
app/Models\User.php .......................................... 100%
app/Repositories/UserRepository.php .................. pa8, rt8 33%
───────────────────────────────────────────────────────────────────
Total: 91.6 %
```

psalm や phpstan などでも型宣言忘れに対して気を付けることは出来ますが、実際にカバレッジとして数字で出てくれるのは嬉しいですね。

### Drift プラグイン

PHPUnit で書かれたテストを Pest の形式に変えるのは大変です。

それを自動でやってくれるのが `Drift Plugin` だそうです。

```php
<?php
 
namespace Tests\Unit;
 
use PHPUnit\Framework\TestCase;
 
class ExampleTest extends TestCase
{
    public function test_that_true_is_true(): void
    {
        $this->assertTrue(true);
    }
}
```

これをこうしてくれます。

```php
test('true is true', function () {
    expect(true)->toBeTrue();
});
```

どこまで完璧にやってくれるかはわかりませんが、素晴らしいですねー。

## Jess Archer さんの Laravel Prompts

https://twitter.com/sawanruparel/status/1681757751385501699

Laravel CLI の使いやすさは [nunomaduro/termwind](https://github.com/nunomaduro/termwind) などでとても自由にスタイリング出来るようになりました。

https://twitter.com/nicdev/status/1681760094097162240

新しい Laravel Prompts ライブラリを用いることで、 **インタラクティブな CLI 入力をよりスマートに実装・実行** 出来るようになります。オシャレ！

## アフターパーティ

https://twitter.com/vishal_viitor/status/1682175414100172803

ブラスバンドの演奏と共にパーティが行われていたようです。ウェーイ。

## Caleb Porzio さんによる Livewire 3 ベータリリース

https://twitter.com/jimmyaldape/status/1682043272472952833

PHP でリアクティブなフロントエンドを記述出来る Laravel Livewire ライブラリですが、なんとセッション中に v3 のベータリリースコマンドを叩いてリリースしたようです。カッコイイ。

v2 からスクラッチで書き直され、様々なアップデートが入ったようです。

https://laravel-news.com/livewire-v3-beta

詳細は Laravel News に記載されています。

```php
<?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

https://twitter.com/valorin/status/1682106069424955392

参加者にリアルタイムでハッキングを試みてもらい、その結果を共有するような面白いインタラクティブセッションだったみたいです。

設定の問題を用意して .env が漏洩するケースなどがあったようで、皆さんかなり勉強になったのではないでしょうか？日本でも同じようなことやってみたいですね。

## Marcel Pociot さんによる NativePHP の紹介

https://twitter.com/marcelpociot/status/1682115448140181507

PHP を書いたらネイティブ(Win, macOS, Linux)アプリとしてコンパイルされる NativePHP の紹介です。

https://nativephp.com

現在アルファリリースされている NativePHP では、macOS アプリのビルドが可能となっています。

- ウィンドウマネジメント
- メニューマネジメント
- ファイルマネジメント
- SQLite サポート
- ネイティブ通知

などの機能が既に実装されています。

あんまり実装見てないですが、 Electron によるネイティブアプリの裏で PHP ビルトインサーバを動かして、 WebView + Livewire でレンダリングしつつ協調して動くみたいですね。闇魔術かも。

## Laravel Herd

https://twitter.com/dev_laravel/status/1681809169920442368

https://herd.laravel.com/

https://laravel.com/docs/10.x/valet

Laravel を macOS で開発する際に便利に環境構築が出来る Laravel Valet ですが、それを fork してさらに使いやすくした Laravel Herd がリリースされました。

Valet は Homebrew をベースに構築されていましたが、 Herd は Homebrew などに依存せず、単体で完結して動作します。

DB は変わらず [DBngin](https://dbngin.com/) などが推奨されているようです。

PHP の静的バイナリを生成してそれを利用する形なので、他の依存関係をインストールする必要がないのが特徴的です。

まだ xdebug は入っていないということで、今後に期待ですね。

Valet からの移行も自動的にやってくれるみたいなので、今後の主流の一つとなりえるかも？

## Laravel Folio

https://twitter.com/ChrisArter/status/1681774836807356423

Blade ファイルの命名規則に従って自動的にルーティングを行ってくれるようなライブラリではないかと推測します。いちいち `return render('pages/index.blade.php');` とか書かなくて済むようになるのかな？便利

## Laravel Precognition

https://twitter.com/ChrisArter/status/1682111971657916416

https://laravel.com/docs/10.x/precognition

簡単に Laravel/Rails + Vue/React/Svelte で SPA を作れる [Inertia.js]() で、より簡単にフォームのリアルタイムバリデーションを行うことが出来るようになります。

実際に送信ボタンを押して POST リクエストを送ってからバリデートを行うより、入力直後にバリデートして結果をもらった方が UX 良いですよね？それを実現するプロダクトとなっているようです。

```js
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

https://twitter.com/Haythamasalama/status/1681799996012675073

ディレクトリ構成含め様々な変更が入るみたいです。

- コントローラはベースコントローラを継承しないように
- Middleware フォルダ削除
- app/Http/Kernel.php 削除
    - これらは AppServiceProvider.php で定義する形に
- config ディレクトリが空っぽに。デフォルトから上書きしたいファイルだけ追加で書きこむ形に
- routes/ の中身が console.php と web.php のみに。 api/channel が必要な場合は CLI から生成可能。

## ロゴ・ブランディングについて

https://twitter.com/Caneco/status/1682123332202778624

caneco.gif さんが今回様々なライブラリのロゴ制作にかかわったようです。すごいセンスいいですね！

## 次は #LaraconIndia 2024 !

https://twitter.com/LaraconIN/status/1682136434776371205

2024/03/23-24 にかけて、 Udaipur という都市で実施されるみたいですね！

(LaraconJP 出来たらいいなー)

## まとめ

Laravel 11 もアツそうですが、周辺ライブラリがどんどん充実している素晴らしいエコシステムがさらに発展していきそうで、やっぱり使っててよかったなーと思っています。

問題はライブラリが多すぎて「何が何するねん？」と混乱してしまう所でしょうか。