Laravel例外コンテキストソリューションを共有する
次のコラムでは、Laravel チュートリアル コラムの Laravel 例外コンテキスト ソリューションを紹介します。困っている友人の役に立てば幸いです。
最近、プロジェクトで問題が発生しました。特定の情報へのアクセス権限を持たないユーザーに遭遇した場合、詳細な理由を提示したいと考えています。たとえば、チーム リソースへのアクセスやメンバー以外のアクセスの場合などです。 あなたは [xxxxxx] チームのメンバーではないため、一時的に表示できません。<参加を申請>
できます。同時に、コード化されたチーム名と参加ボタンを表示する必要がありますが、インターフェースのロジックとしては権限がありません。その際、abort
を直接実行しました:
abort_if(!$user->isMember($resouce->team), 403, '您无权访问该资源');
得られた応答結果は次のとおりです:
HTTP/1.0 403 Forbidden{ "message": "您无权访问该资源"}
HTML を使用してフロントエンド プロンプト ページを表示することは不可能です。これは結合されすぎます。強力で、フロント エンドとバック エンドの分離の原則に違反します。私たちの目標は、問題を解決するために次の形式を返すことです:
HTTP/1.0 403 Forbidden{ "message": "您无权访问该资源", "team": { "id": "abxT8sioa0Ms", "name": "CoDesign****" }}
コンテキストを保持してデータを渡すことで、フロントエンドの学生が自由に組み合わせることが容易になります。
変換の開始
もちろん、これは複雑な問題ではなく、元の abort_if を直接変更することで解決できます。
:
- abort_if(!$user->isMember($resouce->team), 403, '您无权访问该资源'); + if (!$user->isMember($resouce->team)) { + return response()->json([ + 'message' => '您无权访问该资源', + 'team' => [ + 'id' => $resouce->team_id, + 'name'=> $resouce->team->desensitised_name, + ] + ], 403); + }
これで問題は解決したように見えますが、想像してみてください。クロージャで例外が検出され、終了したい場合、上記の return
スタイルの記述は次のようになります。結局のところ、return
は最新のコンテキスト環境を終了するだけであり、abort
のようにアプリケーション全体の実行を終了してから、別の変換を実行したいと考えています。 。
最適化の実装
abort
ソース コードを読んだ後、その最初のパラメータが実際に をサポートしていることがわかりました。 \Symfony\Component\HttpFoundation\Response
インスタンス、および上記の return
の結果がそのインスタンスであるため、これを次のように変更するだけで済みます:
if (!$user->isMember($resouce->team)) { abort(response()->json([ 'message' => '您无权访问该资源', 'team' => [ 'id' => $resouce->team_id, 'name'=> $resouce->team->desensitised_name, ] ], 403)); }
次のようになります。異常中断を実装したのですが、新たな問題が発生しました 再利用するのはやはり恥ずかしいです この許可を判定する箇所でこのコードが繰り返し登場することになります これは我々が望んでいることではありません
論理再利用
論理再利用を実現するために、\App\Exceptions\Handler
の実装を調べ、## を見つけました。親クラスの #render メソッドも次のような設計になっています:
public function render($request, Throwable $e) { if (method_exists($e, 'render') && $response = $e->render($request)) { return Router::toResponse($request, $response); } elseif ($e instanceof Responsable) { return $e->toResponse($request); } //...
render メソッドを実装できます:
$ ./artisan make:exception NotTeamMemberException
<?php namespace App\Exceptions; use App\Team; class NotTeamMemberException extends \Exception { public Team $team; public function __construct(Team $team, $message = "") { $this->team = $team; parent::__construct($message, 403); } public function render() { return response()->json( [ 'message' => !empty($this->message) ? $this->message : '您无权访问该资源', 'team' => [ 'id' => $this->team->id, 'name' => $this->team->desensitised_name, ], ], 403 ); } }
if (!$user->isMember($resouce->team)) { throw new NotTeamMemberException($resouce->team, '您无权访问该资源'); }
\throw_if(!$user->isMember($resouce->team), NotTeamMemberException::class, $resouce->team, '您无权访问该资源');
以上がLaravel例外コンテキストソリューションを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています

初心者にとって、CodeIgniter は学習曲線が緩やかで機能は少ないですが、基本的なニーズはカバーしています。 Laravel は幅広い機能セットを提供しますが、学習曲線はわずかに急になります。パフォーマンスの点では、Laravel と CodeIgniter はどちらも良好なパフォーマンスを示します。 Laravel にはより広範なドキュメントとアクティブなコミュニティ サポートがあり、CodeIgniter はよりシンプルで軽量で、強力なセキュリティ機能を備えています。ブログアプリケーションを構築する実際のケースでは、Laravel の EloquentORM を使用するとデータ操作が簡素化されますが、CodeIgniter ではより手動の構成が必要になります。

大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

小規模なプロジェクトの場合、Laravel は強力な機能とセキュリティを必要とする大規模なプロジェクトに適しています。 CodeIgniter は、軽量さと使いやすさを必要とする非常に小規模なプロジェクトに適しています。

Laravel の Blade と CodeIgniter の Twig テンプレート エンジンを比較し、プロジェクトのニーズと個人的な好みに基づいて選択してください。Blade は MVC 構文に基づいており、適切なコード編成とテンプレートの継承を促進します。 Twig は、柔軟な構文、強力なフィルター、拡張サポート、セキュリティ サンドボックスを提供するサードパーティ ライブラリです。

Laravel - ページネーションのカスタマイズ - Laravel には、ユーザーまたは開発者がページネーション機能を組み込むのに役立つページネーションの機能が含まれています。 Laravel ページネーターは、クエリ ビルダーおよび Eloquent ORM と統合されています。自動ページネーションメソッド
