新しい Laravel プロジェクトを開始するとき、どのような構造を使用すべきかよく考えました。
Laravel は非常によく構造化されており、誤解しないでください。混乱するのは困難です。
ただし、落とし穴があります。UserController.php など、必要なすべてのロジックをコントローラーに入れないようにする方法はありますか?
この記事では、この問題に焦点を当てます。私のユースケースをカバーするために私が好む構造をいくつかのベストプラクティスとともに共有し、queryFi を統合する方法を説明します。
ここに来ているので、あなたはすでに Laravel プロジェクトを持っているか、プロジェクトの作成方法を知っていると仮定します。そのため、そのステップはスキップできます。 API が設定されていることを確認してください。
次の構造を使用します:
app ├── Repositories | ├── Interfaces | | ├── EloquentRepositoryInterface.php | └── Eloquent | ├── BaseRepository.php | └── UserRepository.php ├── Resources ├── BaseResource.php └── ExtendedJsonResource.php
ここに Resources フォルダーとカスタム ロガーがあります。
# Backend composer require z3rka/queryfi # Frontend npm i queryfi
<?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 つだけ追加します。
残りはここで見つけることができます。
<?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() が自動的にカバーされます。
<?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); } }
<?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." ); } }
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 サイトの他の関連記事を参照してください。