kblais/laravel-helpers

为您的 Laravel 应用程序提供的一组辅助工具。

v2.2.0 2024-04-16 12:11 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;
}

OrderByDefaultOrderTraitOrderByDefaultOrderInterface

一个全局作用域,用于在 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,

然后,让我们假设我们有两个模型 ChannelMessage

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');

因为您的资源和您的关联具有相同的名称(channelmessage),您可以将中间件添加到您的资源路由中,以确保您尝试访问的消息属于其频道

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