はじめに

Laravel Precognitionを使用すると、将来のHTTPリクエストの結果を予測できます。Precognitionの主な使用ケースの1つは、アプリケーションのバックエンドの検証ルールを重複させることなく、フロントエンドのJavaScriptアプリケーションに「ライブ」検証を提供できることです。Precognitionは、特にLaravelのInertiaベースのスターターキットと相性が良いです。

Laravelが「予知リクエスト」を受け取ると、すべてのルートのミドルウェアを実行し、ルートのコントローラ依存関係を解決します。これには、フォームリクエストの検証が含まれますが、実際にはルートのコントローラメソッドは実行されません。

ライブ検証

Vueの使用

Laravel Precognitionを使用すると、フロントエンドのVueアプリケーションで検証ルールを重複させることなく、ユーザーにライブ検証体験を提供できます。これがどのように機能するかを示すために、アプリケーション内で新しいユーザーを作成するためのフォームを作成しましょう。

まず、ルートに対してPrecognitionを有効にするには、HandlePrecognitiveRequestsミドルウェアをルート定義に追加する必要があります。また、ルートの検証ルールを格納するためのフォームリクエストを作成する必要があります:

  1. use App\Http\Requests\StoreUserRequest;
  2. use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;
  3. Route::post('/users', function (StoreUserRequest $request) {
  4. // ...
  5. })->middleware([HandlePrecognitiveRequests::class]);

次に、NPMを介してVue用のLaravel Precognitionフロントエンドヘルパーをインストールする必要があります:

  1. npm install laravel-precognition-vue

Laravel Precognitionパッケージがインストールされたら、HTTPメソッド(post)、ターゲットURL(/users)、および初期フォームデータを提供して、PrecognitionのuseForm関数を使用してフォームオブジェクトを作成できます。

次に、ライブ検証を有効にするために、各入力のchangeイベントでフォームのvalidateメソッドを呼び出し、入力の名前を提供します:

  1. <script setup>
  2. import { useForm } from 'laravel-precognition-vue';
  3. const form = useForm('post', '/users', {
  4. name: '',
  5. email: '',
  6. });
  7. const submit = () => form.submit();
  8. </script>
  9. <template>
  10. <form @submit.prevent="submit">
  11. <label for="name">Name</label>
  12. <input
  13. id="name"
  14. v-model="form.name"
  15. @change="form.validate('name')"
  16. />
  17. <div v-if="form.invalid('name')">
  18. {{ form.errors.name }}
  19. </div>
  20. <label for="email">Email</label>
  21. <input
  22. id="email"
  23. type="email"
  24. v-model="form.email"
  25. @change="form.validate('email')"
  26. />
  27. <div v-if="form.invalid('email')">
  28. {{ form.errors.email }}
  29. </div>
  30. <button :disabled="form.processing">
  31. Create User
  32. </button>
  33. </form>
  34. </template>

ユーザーがフォームに入力すると、Precognitionはルートのフォームリクエストに基づいたライブ検証出力を提供します。フォームの入力が変更されると、デバウンスされた「予知」検証リクエストがLaravelアプリケーションに送信されます。デバウンスのタイムアウトは、フォームのsetValidationTimeout関数を呼び出すことで設定できます:

  1. form.setValidationTimeout(3000);

検証リクエストが進行中の場合、フォームのvalidatingプロパティはtrueになります:

  1. <div v-if="form.validating">
  2. Validating...
  3. </div>

検証リクエストまたはフォーム送信中に返された検証エラーは、自動的にフォームのerrorsオブジェクトに入力されます:

  1. <div v-if="form.invalid('email')">
  2. {{ form.errors.email }}
  3. </div>

フォームにエラーがあるかどうかは、フォームのhasErrorsプロパティを使用して判断できます:

  1. <div v-if="form.hasErrors">
  2. <!-- ... -->
  3. </div>

入力が検証に合格したか失敗したかを判断するには、入力の名前をフォームのvalidおよびinvalid関数に渡します:

  1. <span v-if="form.valid('email')">
  2. </span>
  3. <span v-else-if="form.invalid('email')">
  4. </span>

フォーム入力は、変更され、検証応答が受信されるまで、有効または無効として表示されません。

Precognitionを使用してフォームの入力のサブセットを検証している場合、エラーを手動でクリアすることが役立つ場合があります。これを達成するには、フォームのforgetError関数を使用できます:

  1. <input
  2. id="avatar"
  3. type="file"
  4. @change="(e) => {
  5. form.avatar = e.target.files[0]
  6. form.forgetError('avatar')
  7. }"
  8. >

ご覧のとおり、入力のchangeイベントにフックして、ユーザーがそれらと対話する際に個々の入力を検証できます。ただし、ユーザーがまだ対話していない入力を検証する必要がある場合があります。これは、「ウィザード」を構築する際によく見られます。次のステップに進む前に、ユーザーが対話したかどうかにかかわらず、すべての表示されている入力を検証したいからです。

Precognitionを使用してこれを行うには、touchメソッドに名前を渡して、検証したいフィールドを「タッチ済み」としてマークする必要があります。その後、validateメソッドをonSuccessまたはonValidationErrorコールバックで呼び出します:

  1. <button
  2. type="button"
  3. @click="form.touch(['name', 'email', 'phone']).validate({
  4. onSuccess: (response) => nextStep(),
  5. onValidationError: (response) => /* ... */,
  6. })"
  7. >Next Step</button>

もちろん、フォーム送信の応答に反応してコードを実行することもできます。フォームのsubmit関数は、Axiosリクエストの約束を返します。これにより、応答ペイロードにアクセスしたり、成功した送信時にフォームの入力をリセットしたり、失敗したリクエストを処理したりする便利な方法が提供されます:

  1. const submit = () => form.submit()
  2. .then(response => {
  3. form.reset();
  4. alert('User created.');
  5. })
  6. .catch(error => {
  7. alert('An error occurred.');
  8. });

フォーム送信リクエストが進行中かどうかは、フォームのprocessingプロパティを調べることで判断できます:

  1. <button :disabled="form.processing">
  2. Submit
  3. </button>

VueとInertiaの使用

VueとInertiaを使用してLaravelアプリケーションを開発する際に先手を打ちたい場合は、私たちのスターターキットの1つを使用することを検討してください。Laravelのスターターキットは、新しいLaravelアプリケーションのバックエンドおよびフロントエンドの認証スキャフォールディングを提供します。

VueとInertiaでPrecognitionを使用する前に、VueでのPrecognitionの使用に関する一般的なドキュメントを確認してください。VueをInertiaと一緒に使用する場合、NPMを介してInertia互換のPrecognitionライブラリをインストールする必要があります:

  1. npm install laravel-precognition-vue-inertia

インストールが完了すると、PrecognitionのuseForm関数は、上記で説明した検証機能を強化したInertiaのフォームヘルパーを返します。

フォームヘルパーのsubmitメソッドは簡素化されており、HTTPメソッドやURLを指定する必要がなくなりました。代わりに、Inertiaの訪問オプションを最初の引数として渡すことができます。さらに、submitメソッドは、上記のReactの例で見られるようにPromiseを返しません。代わりに、submitメソッドに渡される訪問オプションで、Inertiaのサポートされているイベントコールバックのいずれかを提供できます:

  1. <script setup>
  2. import { useForm } from 'laravel-precognition-vue-inertia';
  3. const form = useForm('post', '/users', {
  4. name: '',
  5. email: '',
  6. });
  7. const submit = () => form.submit({
  8. preserveScroll: true,
  9. onSuccess: () => form.reset(),
  10. });
  11. </script>

Reactの使用

Laravel Precognitionを使用すると、フロントエンドのReactアプリケーションで検証ルールを重複させることなく、ユーザーにライブ検証体験を提供できます。これがどのように機能するかを示すために、アプリケーション内で新しいユーザーを作成するためのフォームを作成しましょう。

まず、ルートに対してPrecognitionを有効にするには、HandlePrecognitiveRequestsミドルウェアをルート定義に追加する必要があります。また、ルートの検証ルールを格納するためのフォームリクエストを作成する必要があります:

  1. use App\Http\Requests\StoreUserRequest;
  2. use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;
  3. Route::post('/users', function (StoreUserRequest $request) {
  4. // ...
  5. })->middleware([HandlePrecognitiveRequests::class]);

次に、NPMを介してReact用のLaravel Precognitionフロントエンドヘルパーをインストールする必要があります:

  1. npm install laravel-precognition-react

Laravel Precognitionパッケージがインストールされたら、HTTPメソッド(post)、ターゲットURL(/users)、および初期フォームデータを提供して、PrecognitionのuseForm関数を使用してフォームオブジェクトを作成できます。

ライブ検証を有効にするには、各入力のchangeおよびblurイベントをリッスンする必要があります。changeイベントハンドラーでは、setData関数を使用してフォームのデータを設定し、入力の名前と新しい値を渡す必要があります。次に、blurイベントハンドラーでフォームのvalidateメソッドを呼び出し、入力の名前を提供します:

  1. import { useForm } from 'laravel-precognition-react';
  2. export default function Form() {
  3. const form = useForm('post', '/users', {
  4. name: '',
  5. email: '',
  6. });
  7. const submit = (e) => {
  8. e.preventDefault();
  9. form.submit();
  10. };
  11. return (
  12. <form onSubmit={submit}>
  13. <label htmlFor="name">Name</label>
  14. <input
  15. id="name"
  16. value={form.data.name}
  17. onChange={(e) => form.setData('name', e.target.value)}
  18. onBlur={() => form.validate('name')}
  19. />
  20. {form.invalid('name') && <div>{form.errors.name}</div>}
  21. <label htmlFor="email">Email</label>
  22. <input
  23. id="email"
  24. value={form.data.email}
  25. onChange={(e) => form.setData('email', e.target.value)}
  26. onBlur={() => form.validate('email')}
  27. />
  28. {form.invalid('email') && <div>{form.errors.email}</div>}
  29. <button disabled={form.processing}>
  30. Create User
  31. </button>
  32. </form>
  33. );
  34. };

ユーザーがフォームに入力すると、Precognitionはルートのフォームリクエストに基づいたライブ検証出力を提供します。フォームの入力が変更されると、デバウンスされた「予知」検証リクエストがLaravelアプリケーションに送信されます。デバウンスのタイムアウトは、フォームのsetValidationTimeout関数を呼び出すことで設定できます:

  1. form.setValidationTimeout(3000);

検証リクエストが進行中の場合、フォームのvalidatingプロパティはtrueになります:

  1. {form.validating && <div>Validating...</div>}

検証リクエストまたはフォーム送信中に返された検証エラーは、自動的にフォームのerrorsオブジェクトに入力されます:

  1. {form.invalid('email') && <div>{form.errors.email}</div>}

フォームにエラーがあるかどうかは、フォームのhasErrorsプロパティを使用して判断できます:

  1. {form.hasErrors && <div><!-- ... --></div>}

入力が検証に合格したか失敗したかを判断するには、入力の名前をフォームのvalidおよびinvalid関数に渡します:

  1. {form.valid('email') && <span>✅</span>}
  2. {form.invalid('email') && <span>❌</span>}

フォーム入力は、変更され、検証応答が受信されるまで、有効または無効として表示されません。

Precognitionを使用してフォームの入力のサブセットを検証している場合、エラーを手動でクリアすることが役立つ場合があります。これを達成するには、フォームのforgetError関数を使用できます:

  1. <input
  2. id="avatar"
  3. type="file"
  4. onChange={(e) => {
  5. form.setData('avatar', e.target.value);
  6. form.forgetError('avatar');
  7. }}
  8. >

ご覧のとおり、入力のblurイベントにフックして、ユーザーがそれらと対話する際に個々の入力を検証できます。ただし、ユーザーがまだ対話していない入力を検証する必要がある場合があります。これは、「ウィザード」を構築する際によく見られます。次のステップに進む前に、ユーザーが対話したかどうかにかかわらず、すべての表示されている入力を検証したいからです。

Precognitionを使用してこれを行うには、touchメソッドに名前を渡して、検証したいフィールドを「タッチ済み」としてマークする必要があります。その後、validateメソッドをonSuccessまたはonValidationErrorコールバックで呼び出します:

  1. <button
  2. type="button"
  3. onClick={() => form.touch(['name', 'email', 'phone']).validate({
  4. onSuccess: (response) => nextStep(),
  5. onValidationError: (response) => /* ... */,
  6. })}
  7. >Next Step</button>

もちろん、フォーム送信の応答に反応してコードを実行することもできます。フォームのsubmit関数は、Axiosリクエストの約束を返します。これにより、応答ペイロードにアクセスしたり、成功した送信時にフォームの入力をリセットしたり、失敗したリクエストを処理したりする便利な方法が提供されます:

  1. const submit = (e) => {
  2. e.preventDefault();
  3. form.submit()
  4. .then(response => {
  5. form.reset();
  6. alert('User created.');
  7. })
  8. .catch(error => {
  9. alert('An error occurred.');
  10. });
  11. };

フォーム送信リクエストが進行中かどうかは、フォームのprocessingプロパティを調べることで判断できます:

  1. <button disabled={form.processing}>
  2. Submit
  3. </button>

ReactとInertiaの使用

ReactとInertiaを使用してLaravelアプリケーションを開発する際に先手を打ちたい場合は、私たちのスターターキットの1つを使用することを検討してください。Laravelのスターターキットは、新しいLaravelアプリケーションのバックエンドおよびフロントエンドの認証スキャフォールディングを提供します。

ReactとInertiaでPrecognitionを使用する前に、ReactでのPrecognitionの使用に関する一般的なドキュメントを確認してください。ReactをInertiaと一緒に使用する場合、NPMを介してInertia互換のPrecognitionライブラリをインストールする必要があります:

  1. npm install laravel-precognition-react-inertia

インストールが完了すると、PrecognitionのuseForm関数は、上記で説明した検証機能を強化したInertiaのフォームヘルパーを返します。

フォームヘルパーのsubmitメソッドは簡素化されており、HTTPメソッドやURLを指定する必要がなくなりました。代わりに、Inertiaの訪問オプションを最初の引数として渡すことができます。さらに、submitメソッドは、上記のReactの例で見られるようにPromiseを返しません。代わりに、submitメソッドに渡される訪問オプションで、Inertiaのサポートされているイベントコールバックのいずれかを提供できます:

  1. import { useForm } from 'laravel-precognition-react-inertia';
  2. const form = useForm('post', '/users', {
  3. name: '',
  4. email: '',
  5. });
  6. const submit = (e) => {
  7. e.preventDefault();
  8. form.submit({
  9. preserveScroll: true,
  10. onSuccess: () => form.reset(),
  11. });
  12. };

AlpineとBladeの使用

Laravel Precognitionを使用すると、フロントエンドのAlpineアプリケーションで検証ルールを重複させることなく、ユーザーにライブ検証体験を提供できます。これがどのように機能するかを示すために、アプリケーション内で新しいユーザーを作成するためのフォームを作成しましょう。

まず、ルートに対してPrecognitionを有効にするには、HandlePrecognitiveRequestsミドルウェアをルート定義に追加する必要があります。また、ルートの検証ルールを格納するためのフォームリクエストを作成する必要があります:

  1. use App\Http\Requests\CreateUserRequest;
  2. use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;
  3. Route::post('/users', function (CreateUserRequest $request) {
  4. // ...
  5. })->middleware([HandlePrecognitiveRequests::class]);

次に、NPMを介してAlpine用のLaravel Precognitionフロントエンドヘルパーをインストールする必要があります:

  1. npm install laravel-precognition-alpine

次に、resources/js/app.jsファイルでAlpineにPrecognitionプラグインを登録します:

  1. import Alpine from 'alpinejs';
  2. import Precognition from 'laravel-precognition-alpine';
  3. window.Alpine = Alpine;
  4. Alpine.plugin(Precognition);
  5. Alpine.start();

Laravel Precognitionパッケージがインストールされ、登録されたら、HTTPメソッド(post)、ターゲットURL(/users)、および初期フォームデータを提供して、Precognitionの$form「マジック」を使用してフォームオブジェクトを作成できます。

ライブ検証を有効にするには、フォームのデータを関連する入力にバインドし、各入力のchangeイベントをリッスンする必要があります。changeイベントハンドラーでは、入力の名前を提供してフォームのvalidateメソッドを呼び出す必要があります:

  1. <form x-data="{
  2. form: $form('post', '/register', {
  3. name: '',
  4. email: '',
  5. }),
  6. }">
  7. @csrf
  8. <label for="name">Name</label>
  9. <input
  10. id="name"
  11. name="name"
  12. x-model="form.name"
  13. @change="form.validate('name')"
  14. />
  15. <template x-if="form.invalid('name')">
  16. <div x-text="form.errors.name"></div>
  17. </template>
  18. <label for="email">Email</label>
  19. <input
  20. id="email"
  21. name="email"
  22. x-model="form.email"
  23. @change="form.validate('email')"
  24. />
  25. <template x-if="form.invalid('email')">
  26. <div x-text="form.errors.email"></div>
  27. </template>
  28. <button :disabled="form.processing">
  29. Create User
  30. </button>
  31. </form>

ユーザーがフォームに入力すると、Precognitionはルートのフォームリクエストに基づいたライブ検証出力を提供します。フォームの入力が変更されると、デバウンスされた「予知」検証リクエストがLaravelアプリケーションに送信されます。デバウンスのタイムアウトは、フォームのsetValidationTimeout関数を呼び出すことで設定できます:

  1. form.setValidationTimeout(3000);

検証リクエストが進行中の場合、フォームのvalidatingプロパティはtrueになります:

  1. <template x-if="form.validating">
  2. <div>Validating...</div>
  3. </template>

検証リクエストまたはフォーム送信中に返された検証エラーは、自動的にフォームのerrorsオブジェクトに入力されます:

  1. <template x-if="form.invalid('email')">
  2. <div x-text="form.errors.email"></div>
  3. </template>

フォームにエラーがあるかどうかは、フォームのhasErrorsプロパティを使用して判断できます:

  1. <template x-if="form.hasErrors">
  2. <div><!-- ... --></div>
  3. </template>

入力が検証に合格したか失敗したかを判断するには、入力の名前をフォームのvalidおよびinvalid関数に渡します:

  1. <template x-if="form.valid('email')">
  2. <span></span>
  3. </template>
  4. <template x-if="form.invalid('email')">
  5. <span></span>
  6. </template>

フォーム入力は、変更され、検証応答が受信されるまで、有効または無効として表示されません。

ご覧のとおり、入力のchangeイベントにフックして、ユーザーがそれらと対話する際に個々の入力を検証できます。ただし、ユーザーがまだ対話していない入力を検証する必要がある場合があります。これは、「ウィザード」を構築する際によく見られます。次のステップに進む前に、ユーザーが対話したかどうかにかかわらず、すべての表示されている入力を検証したいからです。

Precognitionを使用してこれを行うには、touchメソッドに名前を渡して、検証したいフィールドを「タッチ済み」としてマークする必要があります。その後、validateメソッドをonSuccessまたはonValidationErrorコールバックで呼び出します:

  1. <button
  2. type="button"
  3. @change="form.touch(['name', 'email', 'phone']).validate({
  4. onSuccess: (response) => nextStep(),
  5. onValidationError: (response) => /* ... */,
  6. })"
  7. >Next Step</button>

フォーム送信リクエストが進行中かどうかは、フォームのprocessingプロパティを調べることで判断できます:

  1. <button :disabled="form.processing">
  2. Submit
  3. </button>

古いフォームデータの再入力

上記で説明したユーザー作成の例では、ライブ検証を行うためにPrecognitionを使用しています。ただし、フォームを送信するために従来のサーバーサイドフォーム送信を行っています。したがって、フォームはサーバーサイドフォーム送信から返された「古い」入力と検証エラーで入力される必要があります:

  1. <form x-data="{
  2. form: $form('post', '/register', {
  3. name: '{{ old('name') }}',
  4. email: '{{ old('email') }}',
  5. }).setErrors({{ Js::from($errors->messages()) }}),
  6. }">

または、XHRを介してフォームを送信したい場合は、フォームのsubmit関数を使用できます。この関数はAxiosリクエストの約束を返します:

  1. <form
  2. x-data="{
  3. form: $form('post', '/register', {
  4. name: '',
  5. email: '',
  6. }),
  7. submit() {
  8. this.form.submit()
  9. .then(response => {
  10. form.reset();
  11. alert('User created.')
  12. })
  13. .catch(error => {
  14. alert('An error occurred.');
  15. });
  16. },
  17. }"
  18. @submit.prevent="submit"
  19. >

Axiosの設定

Precognition検証ライブラリは、Axios HTTPクライアントを使用して、アプリケーションのバックエンドにリクエストを送信します。便利なことに、必要に応じてAxiosインスタンスをカスタマイズできます。たとえば、laravel-precognition-vueライブラリを使用する場合、アプリケーションのresources/js/app.jsファイルで各送信リクエストに追加のリクエストヘッダーを追加できます:

  1. import { client } from 'laravel-precognition-vue';
  2. client.axios().defaults.headers.common['Authorization'] = authToken;

または、すでにアプリケーション用に設定されたAxiosインスタンスがある場合は、Precognitionにそのインスタンスを使用するように指示できます:

  1. import Axios from 'axios';
  2. import { client } from 'laravel-precognition-vue';
  3. window.axios = Axios.create()
  4. window.axios.defaults.headers.common['Authorization'] = authToken;
  5. client.use(window.axios)

InertiaフレーバーのPrecognitionライブラリは、検証リクエストに対して設定されたAxiosインスタンスのみを使用します。フォーム送信は常にInertiaによって送信されます。

検証ルールのカスタマイズ

予知リクエスト中に実行される検証ルールをカスタマイズすることが可能です。リクエストのisPrecognitiveメソッドを使用します。

たとえば、ユーザー作成フォームでは、パスワードが「妥協されていない」ことを最終的なフォーム送信時のみ検証したい場合があります。予知検証リクエストでは、パスワードが必須であり、8文字以上であることを検証します。isPrecognitiveメソッドを使用して、フォームリクエストで定義されたルールをカスタマイズできます:

  1. <?php
  2. namespace App\Http\Requests;
  3. use Illuminate\Foundation\Http\FormRequest;
  4. use Illuminate\Validation\Rules\Password;
  5. class StoreUserRequest extends FormRequest
  6. {
  7. /**
  8. * Get the validation rules that apply to the request.
  9. *
  10. * @return array
  11. */
  12. protected function rules()
  13. {
  14. return [
  15. 'password' => [
  16. 'required',
  17. $this->isPrecognitive()
  18. ? Password::min(8)
  19. : Password::min(8)->uncompromised(),
  20. ],
  21. // ...
  22. ];
  23. }
  24. }

ファイルアップロードの処理

デフォルトでは、Laravel Precognitionは予知検証リクエスト中にファイルをアップロードまたは検証しません。これにより、大きなファイルが不必要に何度もアップロードされることを防ぎます。

この動作のため、アプリケーションが対応するフォームリクエストの検証ルールをカスタマイズすることを確認し、フィールドが完全なフォーム送信時のみ必須であることを指定する必要があります:

  1. /**
  2. * Get the validation rules that apply to the request.
  3. *
  4. * @return array
  5. */
  6. protected function rules()
  7. {
  8. return [
  9. 'avatar' => [
  10. ...$this->isPrecognitive() ? [] : ['required'],
  11. 'image',
  12. 'mimes:jpg,png',
  13. 'dimensions:ratio=3/2',
  14. ],
  15. // ...
  16. ];
  17. }

すべての検証リクエストにファイルを含めたい場合は、クライアント側のフォームインスタンスでvalidateFiles関数を呼び出すことができます:

  1. form.validateFiles();

副作用の管理

ルートにHandlePrecognitiveRequestsミドルウェアを追加する際には、予知リクエスト中にスキップすべき他のミドルウェアに副作用があるかどうかを考慮する必要があります。

たとえば、ユーザーがアプリケーションと持つ「インタラクション」の総数を増加させるミドルウェアがある場合、予知リクエストをインタラクションとしてカウントしたくないかもしれません。これを実現するために、インタラクションカウントを増加させる前にリクエストのisPrecognitiveメソッドを確認できます:

  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Facades\Interaction;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. class InteractionMiddleware
  7. {
  8. /**
  9. * Handle an incoming request.
  10. */
  11. public function handle(Request $request, Closure $next): mixed
  12. {
  13. if (! $request->isPrecognitive()) {
  14. Interaction::incrementFor($request->user());
  15. }
  16. return $next($request);
  17. }
  18. }

テスト

テストで予知リクエストを行いたい場合、LaravelのTestCaseには、withPrecognitionヘルパーが含まれており、Precognitionリクエストヘッダーを追加します。

さらに、予知リクエストが成功したことを主張したい場合、たとえば、検証エラーが返されなかった場合は、応答に対してassertSuccessfulPrecognitionメソッドを使用できます:

  1. it('validates registration form with precognition', function () {
  2. $response = $this->withPrecognition()
  3. ->post('/register', [
  4. 'name' => 'Taylor Otwell',
  5. ]);
  6. $response->assertSuccessfulPrecognition();
  7. expect(User::count())->toBe(0);
  8. });
  1. public function test_it_validates_registration_form_with_precognition()
  2. {
  3. $response = $this->withPrecognition()
  4. ->post('/register', [
  5. 'name' => 'Taylor Otwell',
  6. ]);
  7. $response->assertSuccessfulPrecognition();
  8. $this->assertSame(0, User::count());
  9. }