Rumah >pembangunan bahagian belakang >tutorial php >Mereka bentuk Struktur Repositori Boleh Skala dalam Laravel dengan queryFi

Mereka bentuk Struktur Repositori Boleh Skala dalam Laravel dengan queryFi

Linda Hamilton
Linda Hamiltonasal
2024-12-25 18:03:17567semak imbas

Designing a Scalable Repository Structure in Laravel with queryFi

pengenalan

Apabila saya memulakan projek Laravel baharu, saya sering tertanya-tanya apakah struktur yang patut saya gunakan.
Laravel sangat berstruktur, jangan salah faham, menyukarkan untuk mengacaukan keadaan.
Walau bagaimanapun, terdapat masalah, bagaimana kita mengelak daripada meletakkan semua logik yang kita perlukan ke dalam pengawal, seperti UserController.php?
Dalam artikel ini, kami akan memberi tumpuan kepada isu ini. Saya akan berkongsi struktur pilihan saya untuk meliputi kes penggunaan saya, bersama beberapa amalan terbaik dan menerangkan cara menyepadukan queryFi.


Bermula

Memandangkan anda berada di sini, saya akan menganggap anda sudah mempunyai projek Laravel atau tahu cara menciptanya, jadi kita boleh melangkau langkah itu. Cuma pastikan API disediakan.

Kami akan menggunakan struktur berikut:

app
├── Repositories
|   ├── Interfaces
|   |   ├── EloquentRepositoryInterface.php
|   └── Eloquent
|       ├── BaseRepository.php
|       └── UserRepository.php
├── Resources
    ├── BaseResource.php
    └── ExtendedJsonResource.php

Anda boleh menemui folder Sumber di sini, serta pembalak tersuai.


1. Pasang queryFi

# Backend
composer require z3rka/queryfi

# Frontend
npm i queryfi

2. Tambah Antara Muka repositori

<?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. Tambah kelas repositori asas

Saya akan menambah hanya tiga kaedah di sini untuk memastikan keadaan bersih dan mengelak daripada mengacaukan ruang dengan kod berulang.
Anda boleh dapatkan selebihnya di sini.

<?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,
                ]
            );
        }
    }
}

Biasanya, untuk mengembalikan sesuatu daripada model anda perlu ->get() atau untuk mencari dan ->first(), itu tidak berlaku di sini kerana kami menggunakan pakej queryFi dan kami boleh melakukan ini:

$this->processModel($request, $this->model)

Ini secara automatik meliputi ->get() secara lalai jika tiada getter(semak getter di sini) dikonfigurasikan dalam pertanyaan.


4. Repositori pengguna

<?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. Pengawal pengguna

<?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. Laluan api

Route::resource('users', UserController::class)->only(['index', 'show'])

Setelah kami menyediakan segala-galanya, kami boleh membuat permintaan daripada penyemak imbas dengan menghantar parameter pertanyaan secara terus, seperti:

url?where[name]=john&select=name&getter=first

Sebagai alternatif, kita boleh menggunakan pakej queryFi TypeScript pada bahagian hadapan untuk pendekatan yang lebih bersih.

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.

Pertanyaan yang dijana akan kelihatan seperti

http://localhost:8000/api/users?where[id]=1&getter=first

Sekeping kod ini akan mengembalikan pengguna dengan id = 1.
Apabila anda menggunakan .find(), respons akan menjadi objek secara automatik.
Jika anda menggunakan .get(), ia akan mengembalikan tatasusunan.

Anda boleh mencubanya di taman permainan untuk melihat bagaimana tindak balas kelihatan.

Memandangkan kami menggunakan ciri HasRelations, kami boleh merangkaikan pertanyaan bahagian hadapan untuk mengubah data secara langsung pada bahagian belakang sebelum ia dikembalikan, seperti yang ditunjukkan di sini.

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.

Untuk lebih banyak kaedah yang boleh anda gunakan, lihat dokumentasi queryFi


TAMAT

Dan itu sahaja! ? Kini anda mempunyai titik permulaan yang kukuh dan berkuasa untuk membina API anda seperti seorang profesional.
Teruskan, lenturkan otot pengekodan itu, dan buat sesuatu yang hebat! ??

Hubungi github, Linkedin, queryFi

Atas ialah kandungan terperinci Mereka bentuk Struktur Repositori Boleh Skala dalam Laravel dengan queryFi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn