ホームページ >バックエンド開発 >PHPチュートリアル >queryFi を使用した Laravel でのスケーラブルなリポジトリ構造の設計

queryFi を使用した Laravel でのスケーラブルなリポジトリ構造の設計

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 18:03:17567ブラウズ

Designing a Scalable Repository Structure in Laravel with queryFi

導入

新しい 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。