emmanuelpcg/laravel-basics

为 Laravel 提供基本功能包,包括实体 CRUD 操作、图像处理、简单查询等。

v0.5.1 2024-05-07 12:27 UTC

This package is auto-updated.

Last update: 2024-09-07 13:07:11 UTC


README

Stars GitHub license Latest Stable Version Total Downloads

描述

包含 Laravel 基本启动功能的包。

安装

composer require emmanuelpcg/laravel-basics

如果 Builder

创建一个执行条件检查的 eloquent 构建器

app/providers/AppServiceProvider.php 中添加

public function register()
{
    BuilderQueries::builderIf();
}

无操作符参数

$cars = Cars::where('color', 'red')
        ->if(auth()->check(), 'color', 'blue')
        ->get();

有操作符参数

$cars = Cars::where('color', 'red')
        ->if(auth()->check(), 'color', '!=', 'red')
        ->get();

常量

创建具有常量额外功能的对象

class CarTypes extends Constants
{
    const MUSCLE = 1;
    const SPORT = 2;
}


CarTypes::getConstants();

/**
[
    "MUSCLE" => 1,
    "SPORT" => 2
 ]
*/

CarTypes::getValues();

/** [1, 2] */

CarTypes::toSelectOptions();

/**
[
    [
        'value' => 1,
        'text' => "MUSCLE"
    ],
    [
        'value' => 2,
        'text' => "SPORT"
    ]
]
*/

查询构建器应用过滤器

在管道请求中添加查询过滤器

例如:我有一个 Car 模型,并希望根据颜色属性应用过滤器

创建一个以属性名称命名的类

<?php

namespace App\QueryFilters\Cars;

use Emmanuelpcg\Basics\QueryFilters\Operators\Equals;

class Color extends Equals { }

例如在服务仓储模式中

在你的仓储中,你可以这样做

<?php

namespace App\Repositories;

use App\Models\Car;
use App\QueryFilters\Cars\Color;
use Emmanuelpcg\Basics\Repositories\ModelBasic;
use Illuminate\Database\Eloquent\Model;

class CarsRepository extends ModelBasic
{
    protected function getEntityInstance(): Model
    {
        return new Car();
    }

    public function paginated(int $perPage) 
    {
        return parent::__pipeApplyFilter(
            [Color::class],
            $this->getEntityInstance()->query()
        )->paginate($perPage);
    }
}

现在,如果你通过 GET 请求参数传递颜色,将应用该过滤器。

模型基础示例

<?php

namespace App\Repositories;

use App\Models\User;
use App\Repositories\Contracts\IUserRepository;
use Emmanuelpcg\Basics\Repositories\ModelBasic;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;

class UserRepository extends ModelBasic implements IUserRepository
{
    protected function getEntityInstance(): Model
    {
        return new User();
    }

    public function getByEmail(string $email): ?User
    {
        return parent::__byColumn('email', $email);
    }

    public function getByKey(int $id): ?User
    {
        return parent::__byKey($id);
    }

    public function create(array $data): ?User
    {
        return parent::__create($data);
    }

    public function update(int $id, array $data): ?User
    {
        return parent::__updateByKey($id, $data);
    }

    // if isset $data['id'] is update if not, is create
    public function save(array $data): ?User
    {
        return parent::__save($data);
    }

    public function get(): ?Collection
    {
        return parent::__all();
    }

    public function getWhereActive(): ?Collection
    {
        return parent::__allWhere('active', 1);
    }

    public function delete(int $id): bool
    {
        return parent::__delete($id);
    }

    public function getPrimaryKeyName(): string
    {
        return parent::__getEntityKeyName();
    }
}

图像处理

<?php

namespace App\Http\Controllers;

use Emmanuelpcg\Basics\ImageManipulation\ImageManipulation;
use Illuminate\Http\Request;
use Exception;

class UploadsController extends Controller
{
    use ImageManipulation;

    public function upload(Request $request)
    {
        try {
            return $this->resizeAndSaveImage(
                'avatar', // name of field
                'avatars', // name of disk 
                300, // width
                300, // height
                'user-upload', // new name of image, will be concatenated with timestamp
                'png' // format to save 
            );
        } catch (Exception $exception) {
            return abort(400, $exception->getMessage());
        }
    }
}