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
Lepaskan: 2024-12-25 18:03:17
asal
562 orang telah melayarinya

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
Salin selepas log masuk

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


1. Pasang queryFi

# Backend
composer require z3rka/queryfi

# Frontend
npm i queryfi
Salin selepas log masuk

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;
}

Salin selepas log masuk

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,
                ]
            );
        }
    }
}
Salin selepas log masuk

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)
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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."
        );
    }
}
Salin selepas log masuk

6. Laluan api

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

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
Salin selepas log masuk

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.
Salin selepas log masuk

Pertanyaan yang dijana akan kelihatan seperti

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

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.
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan