gpapakitsos/laravel-traits

一些有用的 Laravel 模型/控制器特性集合

v1.2.1 2023-09-14 11:54 UTC

This package is auto-updated.

Last update: 2024-09-14 14:19:28 UTC


README

一些有用的 Laravel 模型 & 控制器特性集合。

要求

安装

您可以通过 composer 安装此包

composer require gpapakitsos/laravel-traits

服务提供程序将自动注册。您可以选择手动在您的 config/app.php 文件中添加服务提供程序

'providers' => [
    // ...
    GPapakitsos\LaravelTraits\TraitsServiceProvider::class,
];

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="GPapakitsos\LaravelTraits\TraitsServiceProvider"

TimestampsAccessor 特性

将模型的 created_atupdated_at 属性转换为在您的 config/laraveltraits.php 文件中配置的格式。

要在一个模型上启用此功能,您必须使用 GPapakitsos\LaravelTraits\TimestampsAccessor 特性。

ModelActive 特性

一些有用的方法和作用域来处理模型的 activeinactive 状态。您可以在 config/laraveltraits.php 文件中配置模型的 "active" 属性。

要在一个模型上启用此功能,您必须使用 GPapakitsos\LaravelTraits\ModelActive 特性。

可用方法

/**
 * Checks if model’s state is active
 *
 * @return bool
 */
$model->isActive();
/**
 * Returns the title of model’s state
 *
 * @return string
 */
$model->getActiveTitle();

可用作用域

/**
 * Scope a query to only include active models
 *
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return void
 */
$model->active()->get();
/**
 * Scope a query to only include inactive models
 *
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return void
 */
$model->notActive()->get();

ModelOrdering 特性

一些有用的方法来处理模型的 ordering 功能。您可以在 config/laraveltraits.php 文件中配置模型的 "ordering" 属性。

要在一个模型上启用此功能,您必须使用 GPapakitsos\LaravelTraits\ModelOrdering 特性。

可用方法

/**
 * Returns next available ordering value
 *
 * @param  array  $fieldsAndValues
 * @return int
 *
 * @throws ErrorException
 */
$model::getNewOrdering();
// or
$model::getNewOrdering(['category' => 1]);
/**
 * Resets ordering
 *
 * @param  array  $fieldsAndValues
 * @return void
 *
 * @throws ErrorException
 */
$model::resetOrdering();
// or
$model::resetOrdering(['category' => 1]);

ModelFile 特性

一些有用的方法来处理模型上的文件上传;例如用户的头像。

要在一个模型上启用此功能,您必须使用 GPapakitsos\LaravelTraits\ModelFile 特性,并且您必须定义以下常量

<?php

namespace App\Models;

use GPapakitsos\LaravelTraits\ModelFile;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use ModelFile;

    const FILE_MODEL_ATTRIBUTE = 'avatar'; // The model’s attribute name
    const FILE_INPUT_FIELD = 'avatar_input'; // The form’s input field name
    const FILE_FOLDER = 'avatars'; // The folder name of the storage disk
    const FILE_STORAGE_DISK = 'local'; // The storage disk
    const FILE_DEFAULT_ASSET_URL = 'avatars/default.png'; // The default asset if file does not exist
}

可用方法

/**
 * Stores file if exists & adds the path of the uploaded file into request object
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 *
 * @throws ErrorException|\Illuminate\Validation\ValidationException
 */
$user::storeFile($request);
/**
 * Deletes model’s file if exists
 *
 * @return void
 */
$user->deleteFile();
/**
 * Removes the previous file if exists & stores the new one
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 *
 * @throws ErrorException|\Illuminate\Validation\ValidationException
 */
$user::changeFile($request);
/**
 * Returns file’s URL
 *
 * @return string|null
 */
$user->getFileURL();
/**
 * Returns file’s path
 *
 * @return string|null
 */
$user->getFilePath();

CRUDController 特性

一个有用的特性,用于在控制器中处理模型的 CRUD 功能。

要在一个控制器上启用此功能,您必须使用 GPapakitsos\LaravelTraits\CRUDController 特性,并且您必须在您的控制器中定义 requestmodel 属性

<?php

namespace App\Http\Controllers;

use App\Models\User;
use GPapakitsos\LaravelTraits\CRUDController;
use Illuminate\Http\Request;

class UsersController extends Controller
{
    use CRUDController;

    protected $request;
    protected $model;

    // You can set the property $returnModelsFromCRUD as `true` if you would like the methods `doAdd` & `doEdit` to return the model
    // protected $returnModelsFromCRUD = true;

    public function __construct(Request $request, User $model)
    {
        $this->request = $request;
        $this->model = $model;
    }
}

之后,您必须在您的 routes/web.php 文件中定义控制器的路由

Route::prefix('users')->group(function () {
    Route::get('get-resource/{id?}', 'UsersController@getResource');
    Route::post('add', 'UsersController@doAdd');
    Route::post('edit', 'UsersController@doEdit');
    Route::post('delete', 'UsersController@doDelete');
});

最后,您必须定义模型的 fillable 属性和验证规则

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that are mass assignable
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password'];

    /**
     * Validation rules of the model
     *
     * @var array
     */
    public $validations = [
        'add' => [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:8|max:30',
        ],
        'edit' => [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users,email',
            'password' => 'nullable|min:8|max:30',
        ],
        // or you can set only the array with key `all`, if the rules are the same between `add` & `edit`
        // 'all' => [
        //     'name' => 'required|max:255',
        //     'email' => 'required|email|max:255',
        //     'password' => 'required|min:8|max:30',
        // ],
    ];
}

可用控制器方法

/**
 * Returns model’s JSON response by provided id
 *
 * @return \Illuminate\Http\JsonResponse
 *
 * @throws ErrorException|\Illuminate\Database\Eloquent\ModelNotFoundException
 */
getResource();
/**
 * Creates a new model if the request is valid
 *
 * @return \Illuminate\Http\JsonResponse|\Illuminate\Database\Eloquent\Model
 *
 * @throws ErrorException|\Illuminate\Validation\ValidationException
 */
doAdd();
/**
 * Updates the model if the request is valid
 *
 * @return \Illuminate\Http\JsonResponse|\Illuminate\Database\Eloquent\Model
 *
 * @throws ErrorException|\Illuminate\Validation\ValidationException|\Illuminate\Database\Eloquent\ModelNotFoundException
 */
doEdit();
/**
 * Deletes a model
 *
 * @return \Illuminate\Http\JsonResponse
 *
 * @throws ErrorException|\Illuminate\Database\Eloquent\ModelNotFoundException
 */
doDelete();