kblais / laravel-helpers
为您的 Laravel 应用程序提供的一组辅助工具。
Requires
- php: ^8.0
- illuminate/database: ^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- larastan/larastan: ^2.0
- orchestra/testbench: ^7.0|^8.0|^9.0
This package is auto-updated.
Last update: 2024-09-16 13:11:01 UTC
README
Laravel-helpers 是一组为您的 Laravel 应用程序提供的辅助工具。
安装
使用 Composer 需求此包
composer require kblais/laravel-helpers
辅助工具列表
SingularTableNameTrait
使用单数表名而不是默认的复数表名。
用法
将特性添加到您的模型中
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Kblais\LaravelHelpers\Eloquent\SingularTableNameTrait; class User extends Model { use SingularTableNameTrait; }
OrderByDefaultOrderTrait
和 OrderByDefaultOrderInterface
一个全局作用域,用于在 Eloquent 模型上应用默认排序,以及一个特性,您可以直接在模型属性中定义默认排序。
用法
namespace App; use Illuminate\Database\Eloquent\Model; use Kblais\LaravelHelpers\Eloquent\OrderByDefaultOrderTrait; use Kblais\LaravelHelpers\Eloquent\OrderByDefaultOrderInterface; class User extends Model implements OrderByDefaultOrderInterface { use OrderByDefaultOrderTrait; /** * Defaults to : * - column: `created_at` * - asc: `true` */ protected $defaultOrder = [ 'column' => 'last_login_at', 'asc' => 'false', ]; }
关系辅助工具
一组用于您的 Eloquent 关系的辅助工具。
syncHasManyRelation
同步 hasMany 关系,删除旧项,更新现有项并创建新项。
用法
从以下模型开始
namespace App; use App\Cat; use Illuminate\Database\Eloquent\Model; use Kblais\LaravelHelpers\Eloquent\RelationshipHelpersTrait; class User extends Model { use RelationshipHelpersTrait; protected $fillable = [ 'name', 'email', 'cats', ]; protected static function boot() { parent::boot(); self::saved(function ($user) { $user->syncHasManyRelation('cats'); }); } public function cats() { return $this->hasMany(Cat::class); } public function setCatsAttribute($cats) { $this->setHasManyItems('cats', $cats); } }
基于此,您可以直接将猫添加到您的用户中,如下所示
$user->create([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'cats' => [ [ 'name' => 'Garfield', 'color' => 'orange', ], [ 'number' => 'Fuzzy', 'color' => 'yellow', ], ], ]);
当您更新模型时,如果您传递一个 cats
键,如果不存在,则会自动创建猫,如果存在于 cats
数组中,则会更新或删除。
syncHasOneRelation
同步 hasOne 关系,创建新的关系项或更新它。
用法
namespace App; use App\Cat; use Illuminate\Database\Eloquent\Model; use Kblais\LaravelHelpers\Eloquent\RelationshipHelpersTrait; class User extends Model { use RelationshipHelpersTrait; protected $fillable = [ 'name', 'email', 'address', ]; protected static function boot() { parent::boot(); self::saved(function ($user) { $user->syncHasOneRelation('address'); }); } public function address() { return $this->hasOne(Address::class); } public function setAddressAttribute($address) { $this->setHasOneItem('address', $address); } }
要创建包含地址的用户,您只需要以下内容
$user->create([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'address' = [ 'number' => '18', 'street' => 'rue Scribe', 'city' => 'Nantes', 'country' => 'France', ], ]);
在 update()
方法中传递 address
数组也会更新用户的地址。
Routing\Middleware\AreRelated
AreRelated
中间件允许您检查两个路由资源是否相关。它目前仅适用于 HasOneOrMany
/BelongsTo
关系。
用法
在您的 app/Http/Kernel.php
中,在 $routeMiddleware
数组中添加以下行
'areRelated' => \Kblais\LaravelHelpers\Routing\Middleware\AreRelated::class,
然后,让我们假设我们有两个模型 Channel
和 Message
use \Illuminate\Database\Model; class Channel extends Model { // } class Message extends Model { public function channel() { return $this->belongsTo(Channel::class); } }
并且,在您的路由中
Route::resource('channel.message', 'MessageController');
因为您的资源和您的关联具有相同的名称(channel
和 message
),您可以将中间件添加到您的资源路由中,以确保您尝试访问的消息属于其频道
Route::resource('channel.message', 'MessageController') ->middleware('areRelated:channel,message');
如果您使用自定义路由绑定,则中间件接受第三个属性来定义关系名称。例如,如果这些绑定如下定义
Route::bind('discussion', function ($value) { return Channel::find($value); });
您的路由定义将是
Route::resource('discussion.message', 'MessageController') ->middleware('areRelated:discussion,message,channel');
贡献
指南
- 此项目遵循 PSR-2 编码标准,确保您编写的代码也遵循。
- 在添加新功能时考虑编写测试。
运行测试
您可以使用以下命令运行测试(在运行之前请确保已执行 composer install
)
composer run-script test