ホームページ >バックエンド開発 >PHPチュートリアル >Laravelのセッションに深く飛び込みます
Laravelアプリケーションを構築する場合、ある時点でセッションを処理する必要があることをほぼ確実にします。それらはWeb開発の基本的な部分です。
この記事では、セッションが何であるか、Laravelでどのように機能するか、Laravelアプリケーションでどのように使用するかをすばやく説明します。
その後、さらに一歩進んで、「セッションクラス」を使用してセッションと対話する方法に飛び込み、Laravelアプリケーションを扱うときによく遭遇する一般的な落とし穴を避けます。最後に、Laravelでセッションデータをテストする方法を学びます。
会話とは何ですか?
要するに、セッションは複数のリクエスト間でデータを維持するための安全な方法です。
セッションデータを使用して、次のコンテンツを保存できます。
ユーザー認証ステータス。
データベース
次のキーは、Laravelフレームワーク自体によって追加されています:
CSRF攻撃を防ぐために、
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>
値を使用します。
値は、以前に要求されたURLを保存するために使用されます。_token
値は、Flashセッションデータのキーを前のリクエストに保存するために使用されます。この場合、それは前のリクエストで_previous.url
_flash.old
success
次のキーが私によって追加されています:_flash.new
success
デフォルトでは、Laravelは次のセッションドライバーをサポートしています:cookie
- セッションデータは、安全で暗号化されたCookieに保存されます。 database
- セッションはデータベースに保存されます(たとえば、mysql、postgresql、sqlite)。 memcached
/ redis
- セッションデータは、これらの高速キャッシュストレージに保存されます。 dynamodb
- セッションデータはAWS dynamodbに保存されます。 file
- セッションデータはstorage/framework/sessions
に保存されます。 array
- セッションデータはメモリのPHPアレイに保存され、持続しません。 これらのドライバーの一部には、セットアップ要件があります。したがって、それらを使用する前に、Laravelドキュメントを確認して、それらをセットアップする方法を学習してください。
Laravelのセッションを使用Laravelはセッションを使用して非常にシンプルにします。ドキュメントでは、セッションとうまくやり取りする方法を説明しています。しかし、基本を簡単に見てみましょう。
この例では、複数のページにまたがるステップバイステップのウィザードを構築していると仮定します。現在のステップと各ステップに入力されたデータをセッションに保存します。このようにして、ユーザーがすべての手順を完了すると、ウィザードの最後に提出されたすべてのデータを読み取ることができます。
例をシンプルにするには、session()
ヘルパー関数も使用します。ただし、後でSession
ファサードまたはリクエストクラスを使用してセッションデータにアクセスします。
get
上記のコードを実行すると、セッションに保存されている値がキーとして返されます。キーがセッションに保存された値を持っていない場合、<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>を返します。
wizard:current_step
このメソッドでは、デフォルト値を定義することもできます。これは、キーが存在しない場合はnull
キーとして返されます。キーがセッションに保存された値を持っていない場合、
を返します。<code>$currentStep = session()->get(key: 'wizard:current_step');</code>
セッションのデータを読み取って同時に削除する場合もあります(したがって、再度アクセスできません)。これにはwizard:current_step
関数を使用できます
1
上記のコードを実行すると、セッションに保存されている値が
pull
#セッションにデータを書き込みます
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>セッションにデータを記述するには、以下に示すように
関数を使用できます。
wizard:current_step
上記のコードを実行すると、
put
同様に、
<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>
wizard:step_one:form_data
キーに次のデータがあると仮定します。
メソッド)はセッション値を更新します:push
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>
wizard:step_one:form_data:languages
値がまだ存在しない場合は、push
を使用してセッションキーを作成し、渡された値を含む配列に値を設定します。
Laravelは、セッションで値を増やして減らすことができる便利なヘルパーメソッドも提供します。
このようなセッションの値を増やすことができます:
<code>$currentStep = session()->get(key: 'wizard:current_step');</code>上記のコードを実行すると、
セッション値が3の場合、4に増加します。 wizard:current_step
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>セッションに値がまだ存在しない場合、それらは0として扱われます。したがって、空のセッション値で
を呼び出すと、値が1に設定されます。空のセッション値でincrement
を呼び出してください。値を-1に設定します。 decrement
#セッション
<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>からデータを削除します メソッドを使用してセッションからデータを削除することもできます。
上記のコードを実行すると、セッションからforget
キーに属するデータが削除されます。
<code>session()->put( key: 'wizard:step_one:form_data', value: [ 'name' => 'Ash Allen', 'email' => 'ash@example.com', ], );</code>複数のキーを一度に削除する場合は、キー配列を
関数に渡すことができます:wizard:current_step
または、セッションからすべてのデータを削除する場合は、forget
関数を使用できます。
<code>session()->push( key: 'wizard:step_one:form_data:languages', value: 'javascript', );</code>#セッションにデータがあるかどうかを確認
また、Laravelは、セッションにデータが存在するかどうかを確認するための便利なヘルパー関数を提供します。 flush
<code>[ `php`, ]</code>メソッドを使用して、セッションにキーがあるかどうか、およびその値が
値が存在していて
ではない場合、上記のコードはhas
に戻ります。値がnull
またはキーが存在しない場合、
<code>[ `php`, `javascript`, ]</code>
同様に、null
メソッドを使用して、キーがセッションに存在するかどうかを確認することもできます(値がnullであることに関係なく)true
null
false
セッションがまったく存在しないかどうかを確認することもできます:
exists
#session
<code>session()->increment(key: 'wizard:current_step');</code>セッションでいくつかのデータを保持することがありますが、次のリクエストのためにのみです。たとえば、ユーザーがフォームを提出した後、ユーザーに成功通知を表示することをお勧めします。
これを行うには、
メソッド:<code>session()->decrement(key: 'wizard:current_step');</code>を使用できます
のようなものを使用)の値を表示できます。次に、次のリクエストで利用できないように削除します。
フラッシュデータ(前のリクエストに追加)がある場合があり、次のリクエストに保持したい場合があります。 flash
<code>session()->increment(key: 'wizard:current_step', amount: 2); session()->decrement(key: 'wizard:current_step', amount: 2);</code>メソッドを使用してすべてのフラッシュデータを更新できます:
session()->get('success')
メソッドを使用できます:
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>上記のコードを実行すると、
およびsuccess
フラッシュセッション値が保持されますが、次のリクエストのために他のフラッシュデータを削除します。 error
ヘルパー関数のみを使用しています。 session()
ファサードまたはIlluminateSupportFacadesSession
クラスを使用してセッションと対話することもできます。 IlluminateHttpRequest
ファサードを使用するには、次のような方法を呼び出すことができます。
Session
代わりに、コントローラーメソッドに注入された
<code>$currentStep = session()->get(key: 'wizard:current_step');</code>
IlluminateHttpRequest
各方法は完全に効果的であるため、あなたとあなたのチームがどちらを好むかを決定できます。 session
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>
小規模なプロジェクトでは、前述の方法を使用してセッションと対話してもまったく問題ありません。ただし、Laravelプロジェクトが成長するにつれて、エラーを引き起こし、コードの維持をより困難にする可能性のある問題に遭遇する可能性があります。
セッションの現在のステップを保存したいと仮定して、ウィザードの例に固執します。したがって、私たちのコードは次のようになるかもしれません:
その後、コードベースのさまざまな部分で、セッションの現在のステップを読みたいと思うかもしれません。
私が今した間違いを見ましたか?私は誤って
キーの代わりに<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>キーを読んでみました。
これは簡単な例ですが、大規模なコードベースでは、そのような間違いを犯すのは簡単です。これらの明らかな間違いは、見つけるのが最も難しいかもしれません。
<code>session()->put( key: 'wizard:step_one:form_data', value: [ 'name' => 'Ash Allen', 'email' => 'ash@example.com', ], );</code>したがって、これらのタイプミスを回避する便利な方法は、定数または方法を使用してセッションキーを生成することです。
たとえば、セッションキーが静的である場合、次のように定数(おそらくセッションクラスで説明します)を定義できます。
wizard:step
これは、コードベースで使用される生文字列の数を減らすことを意味し、タイプミスの数を減らすのに役立ちます。 wizard:current_step
キーが必要だとします。次のようにキーを生成する方法を作成できます。
上記のコードで見ることができるように、セッションキーを動的に生成して、異なる方法で使用できるようにしています。たとえば、ID 1のチームの現在のステップを見つけようとすると、キーは
になります。しばらくの間存在していたプロジェクトを扱うときに見られる別のtrapは、セッションの重要な競合です。
たとえば、数年前に新しいユーザーアカウントを作成するためのウィザードを作成したと想像してください。したがって、このようなセッションデータを保存することができます:
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>あなたは今、魔法使いを備えた新しい機能を構築するために割り当てられており、あなたが使用した古いウィザードと命名規則を完全に忘れてしまいました。新しいウィザードに誤って同じキーを使用して、データの競合を引き起こし、潜在的なエラーを導入することができます。
これを避けるために、セッションキーのプレフィックスとして関数名を使用するのが好きです。したがって、新しいユーザーを作成するためにウィザードデータを保存するために、次のキーがある場合があります。
new_user_wizard:current_step
new_user_wizard:step_one:form_data
new_user_wizard:step_two:form_data
new_team_wizard:current_step
new_team_wizard:step_one:form_data
new_team_wizard:step_two:form_data
この記事の後半で、これらのプレフィックスをセッションクラスに追加する方法について説明します。
話して話しているだけで、セッションからデータを読んだときに、使用しているデータの種類が常にすぐにクリアされるとは限らないことを明確にしたいと思います。最終的には、セッションにデータを書き込むコードを見て、それが何であるかを把握する必要があります。これは気を散らし、時間がかかる可能性があり、エラーにつながる可能性があります。
<code>$currentStep = session()->get(key: 'wizard:current_step');</code>
セッションデータを読み取るコードにコメントまたはドキュメントブロックを追加できます。しかし、これは単なるヒントです。コメントが最新の状態に保たれない場合(セッションデータ型が変更された場合)、それは役に立たず、エラーの可能性を高めます。 AppDataTransferObjectsWizardsFormData
たとえば、
このコードを見てみましょう
メソッドが
インスタンスを返すことがわかります。これは、使用しているデータの種類を明確に示しています。次に、このようにコントローラーでこのメソッドを呼び出すことができます:
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>#セッションクラスのプロセスセッションデータ
前のセクションで見たように、Laravelでセッションを使用する場合、いくつかの簡単な(しかし一般的な)落とし穴があります。 stepOneFormData
「セッションクラス」を使用することにより、これらのトラップはそれぞれ回避できます(または少なくとも削減されます)。セッションクラスを使用して、1つの場所で単一の関数に関連するセッションデータ処理ロジックをカプセル化するのが好きです。 AppDataTransferObjectsWizardsFormData
たとえば、
ユーザーを作成するためのウィザードがあり、チームを作成するための別のウィザードがあるとします。これらの魔法使いのそれぞれのセッションクラスを作成します:
AppSessionsUsersNewUserWizardSession
AppSessionsTeamsNewTeamWizardSession
セッションクラスを使用することで、
を使用できます前の例では、セッションクラスの使用を既に提案しています。しかし、私がこれらのクラスをどのように構築するのが好きかをもっとよく見てみましょう。
新しいユーザーウィザードの次のセッションクラスがあるとします。一見、それは少し圧倒されるかもしれませんが、コードを見てそれを分解しましょう:
上記のクラスでは、最初に
インスタンスを受け入れるコンストラクターを定義します。これを行うことにより、Laravelは、サービスコンテナから<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>クラスを解析するときに、セッションインスタンスを自動的に注入します。後でコントローラーでこれを行う方法をお見せします。
AppSessionsUsersWizardSession
次に、5つの基本的なパブリックメソッドを定義します:IlluminateContractsSessionSession
AppSessionsUsersWizardSession
- ウィザードの現在のステップに戻ります。セットアップステップがない場合、デフォルトは
です。getCurrentStep
- セットアップウィザードの現在のステップ。 1
setCurrentStep
の例が掲載されています。 setFormDataForStep
- ウィザードの指定されたステップのフォームデータを取得します。このメソッドはステップ番号を取得し、AppDataTransferObjectsWizardsUsersFormData
インスタンスを返します。または、データが存在しない場合。 getFormDataForStep
- セッションからウィザードに関連するすべてのデータを削除します。ウィザードが完了またはキャンセルされた場合は、この方法を呼び出すことができます。 AppDataTransferObjectsWizardsUsersFormData
null
flush
これらの重要な生成方法を使用することの追加の利点は、競合を回避するためにキーを簡単に接頭することができることです。この例では、すべてのキーのプレフィックスをこのクラスが設定されたので、コントローラーでどのように対話するかを見てみましょう。
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>上記の例では、コントローラーメソッドに
クラスを挿入します。 Laravelは、セッションインスタンスを自動的に解析します。 AppSessionsUsersWizardSession
最初は、これは過剰補償のように感じられ、より多くのコードメンテナンスが必要になる場合があります。ただし、プロジェクトが成長するにつれて、型プロンプト、リターンタイプ、主要な生成方法、さらには命名方法(操作をより説明的にする)さえ非常に便利です。
Laravelのテストセッション
セッションクラスを使用することの大きな利点の1つは、クラス内の各メソッドの集中型ユニットスタイルのテストを簡単に記述できることです。
たとえば、
クラスのメソッドのテストをいくつか書くことができます。リマインダーとして、メソッドは次のとおりです
AppSessionsUsersWizardSession
getFormDataForStep
ここでは、いくつかのシナリオをテストできます:
<code>$currentStep = session()->get(key: 'wizard:current_step');</code>
ステップの
オブジェクトを返します。AppDataTransferObjectsWizardsUsersFormData
を返します。 null
テストクラスは次のようになる場合があります:これらのユニットスタイルのテストは、セッションクラスがセッションデータの読み取りと書き込みのために正しく構成されていることを確認するのに最適です。しかし、彼らは必ずしもあなたが彼らが残りのコードベースで正しく使用されていると信じさせるわけではありません。たとえば、
<code>$currentStep = session()->get(key: 'wizard:current_step', default: 1);</code>を呼び出している可能性があり、
に電話する必要があります。
このため、機能テスト(通常はコントローラーのために書くもの)でセッションデータをアステル化することを検討することもできます。 getFormDataForStep(1)
たとえば、getFormDataForStep(2)
コントローラーに次の基本的な方法があり、ウィザードの次のステップに進むとします。
上記の方法では、最初にセッションの現在のステップを読みます。次に、セッションの現在のステップのフォームデータを保存します。最後に、現在のステップを増やし、ウィザードの次のステップにリダイレクトします。
クラスは、フォームデータの検証に責任を負い、
<code>$currentStep = session()->pull(key: 'wizard:current_step');</code>メソッドを呼び出すときに
インスタンスを返すと想定します。
また、ルート(名前AppHttpRequestsUsersWizardNextStepRequest
)へのPOSTリクエストを介してアクセスできると仮定します。 toDto
AppDataTransferObjectsWizardsUsersFormData
フォームデータがセッションに正しく保存されていることを確認するために、次のテストを作成する場合があります。
<code>[ '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW' '_previous' => [ 'url' => 'https://my-app.com/users' ] '_flash' => [ 'old' => [ 'success', ], 'new' => [] ] 'success' => 'User created successfully.' 'current_team_id' => 123 ]</code>
上記のテストでは、何らかの形のデータを使用して、/users/wizard/next-step
ルートへのPOSTリクエストを発行しています。 withSession
を使用していることに気付くかもしれません。この方法により、セッションデータを設定して、正しく読み取られていると主張できるようにします。
次に、ユーザーがウィザードの次のステップにリダイレクトされ、セッションの現在のステップが3
に設定されていると主張します。また、ステップ2
のフォームデータがセッションに正しく保存されていると主張します。
テストで見たように、セッションから2つの方法で読みます。
assertSessionHas
session()
結論
以上がLaravelのセッションに深く飛び込みますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。