使用 queryFi 在 Laravel 中设计可扩展的存储库结构
介绍
当我开始一个新的 Laravel 项目时,我经常想知道我应该使用什么结构。
Laravel 的结构非常好,不要误会我的意思,它很难把事情搞砸。
然而,有一个问题,我们如何避免将我们需要的所有逻辑放入控制器中,例如 UserController.php?
在这篇文章中,我们将重点讨论这个问题。我将分享我的首选结构来涵盖我的用例,以及一些最佳实践,并解释如何集成 queryFi。
入门
既然你在这里,我假设你已经有一个 Laravel 项目或知道如何创建一个项目,所以我们可以跳过这一步。只需确保 API 已设置即可。
我们将使用以下结构:
app ├── Repositories | ├── Interfaces | | ├── EloquentRepositoryInterface.php | └── Eloquent | ├── BaseRepository.php | └── UserRepository.php ├── Resources ├── BaseResource.php └── ExtendedJsonResource.php
您可以在此处找到资源文件夹,以及自定义记录器。
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.添加存储库基类
我将在此处仅添加三个方法,以保持内容整洁并避免重复代码使空间混乱。
您可以在这里找到其余的内容。
<?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 和 ->first(),这里的情况并非如此,因为我们使用的是 queryFi 包,我们可以这样做:
$this->processModel($request, $this->model)
如果查询中没有配置 getter(在此处检查 getter),默认情况下会自动覆盖 ->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(),它将返回一个数组。
您可以在 Playground 中尝试一下,看看响应结果如何。
由于我们使用 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
