導入
新しい Laravel プロジェクトを開始するとき、どのような構造を使用すべきかよく考えました。
Laravel は非常によく構造化されており、誤解しないでください。混乱するのは困難です。
ただし、落とし穴があります。UserController.php など、必要なすべてのロジックをコントローラーに入れないようにする方法はありますか?
この記事では、この問題に焦点を当てます。私のユースケースをカバーするために私が好む構造をいくつかのベストプラクティスとともに共有し、queryFi を統合する方法を説明します。
はじめる
ここに来ているので、あなたはすでに Laravel プロジェクトを持っているか、プロジェクトの作成方法を知っていると仮定します。そのため、そのステップはスキップできます。 API が設定されていることを確認してください。
次の構造を使用します:
app ├── Repositories | ├── Interfaces | | ├── EloquentRepositoryInterface.php | └── Eloquent | ├── BaseRepository.php | └── UserRepository.php ├── Resources ├── BaseResource.php └── ExtendedJsonResource.php
ここに Resources フォルダーとカスタム ロガーがあります。
1.queryFiをインストールする
# Backend composer require z3rka/queryfi # Frontend npm i queryfi
2. リポジトリインターフェースの追加
<?php namespace App\Repositories\Interfaces; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; interface EloquentRepositoryInterface { public function create(array $attributes = [], ?string $successMessage, ?string $errorMessage): JsonResource; public function all(Request $request, ?string $errorMessage): JsonResource; public function one(Request $request, Model $model, ?string $errorMessage): JsonResource; public function update(Request $request, Model $model, ?string $successMessage, ?string $errorMessage): JsonResource; public function destroy(Request $request, ?string $successMessage, ?string $errorMessage): JsonResource; }
3. 基本リポジトリ クラスを追加します。
ここでは、内容を整理し、繰り返しのコードでスペースが乱雑になるのを避けるために、メソッドを 3 つだけ追加します。
残りはここで見つけることができます。
<?php namespace App\Repositories\Eloquent; use Z3rka\Queryfi\HasRelations; class BaseRepository implements EloquentRepositoryInterface { use HasRelations; public function __construct(protected Model $model) { // } public function create(array $attributes = [], ?string $successMessage, ?string $errorMessage): BaseResource { try { return new BaseResource( true, $successMessage, $this->model->create($attributes) ); } catch (Exception $e) { return new BaseResource( false, $errorMessage, [ 'error' => $e ] ); } } public function all(Request $request, ?string $errorMessage): BaseResource { try { return new BaseResource( true, 'Success', $this->processModel($request, $this->model) ); } catch (Exception $e) { $this->spitError($e); return new BaseResource( false, "Fail", $this->model->get(), [ "error" => $e, ] ); } } public function one(Request $request, Model $model, ?string $errorMessage): BaseResource { try { return new BaseResource( true, "success", $this->processModel($request, $model) ) } catch (Exception $e) { $this->spitError($e); return new BaseResource( false, "Fail", $model, [ "error" => $e, ] ); } } }
通常、モデルから何かを返すには、 ->get() または find and ->first() する必要がありますが、ここでは当てはまりません。queryFi パッケージを使用しており、これを行うことができます。
$this->processModel($request, $this->model)
クエリでゲッター (ここでゲッターを確認してください) が設定されていない場合、デフォルトで ->get() が自動的にカバーされます。
4. ユーザーリポジトリ
<?php namespace App\Repositories\Eloquent; use App\Models\User; use Z3rka\Queryfi\HasRelations; class UserRepository extends BaseRepository { use HasRelations; public function __construct(User $model) { parent::__construct($model); } }
5. ユーザーコントローラー
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Repositories\Eloquent\UserRepository; class UserController extends Controller { public function __construct(public UserRepository $userRepository) { } public function index(Request $request) { return $this->userRepository ->all($request, "Ooops, there was an error fetching all the users.") } public function show(Request $request, User $user) { return $this->userRepository->one( $request, $user, "Ooops, there was an error fetching the user." ); } }
6. APIルート
Route::resource('users', UserController::class)->only(['index', 'show'])
すべての設定が完了したら、次のようにクエリ パラメーターを直接渡すことで、ブラウザからリクエストを行うことができます。
url?where[name]=john&select=name&getter=first
あるいは、よりクリーンなアプローチとして、フロントエンドで queryFi TypeScript パッケージを使用することもできます。
import { createQuery } from "queryfi"; const query = createQuery('/api/users', { baseUrl: "http://localhost:8000" }) .where({ id: 1 }) .first() // will return an object with the user if it exists.
生成されたクエリは次のようになります
http://localhost:8000/api/users?where[id]=1&getter=first
このコード部分は、ID = 1 のユーザーを返します。
.find() を使用すると、応答は自動的にオブジェクトになります。
.get() を使用すると、配列が返されます。
プレイグラウンドで試して、応答がどのように見えるかを確認できます。
HasRelations トレイトを使用しているため、ここに示すように、フロントエンド クエリを連鎖して、データが返される前にバックエンドでデータを直接変換できます。
import { createQuery } from "queryfi"; const query = createQuery('/api/users', { baseUrl: "http://localhost:8000" }) .where({ id: 1 }) .select(['email', 'id', 'name']) .get() // will return an array with one entry if it exists.
使用できるその他のメソッドについては、queryFi のドキュメントを参照してください
終わり
それで終わりです! ?これで、プロのように API を構築するための強力で強力な出発点が得られました。
さあ、コーディングの筋肉を鍛えて、素晴らしいものを作りましょう! ??
github、Linkedin、queryFi に連絡してください
以上がqueryFi を使用した Laravel でのスケーラブルなリポジトリ構造の設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

WebStorm Mac版
便利なJavaScript開発ツール
