Rumah >pembangunan bahagian belakang >tutorial php >Mereka bentuk Struktur Repositori Boleh Skala dalam Laravel dengan queryFi
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.
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.
# 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; }
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.
<?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'])
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
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!