lagumen/laravel-essentials

Laravel 包,包含构建从小型到大型项目所需的基本实用工具

v1.5 2020-12-18 19:45 UTC

This package is auto-updated.

Last update: 2024-09-19 04:23:06 UTC


README

此包提供可以帮助您构建小型到大型项目的实用工具。

灵感来源于 Laravel Query Filters

Build Status StyleCI

特性

此包允许您创建 RepositoriesActionsValidations 类。它还为您 eloquent 模型提供搜索、过滤和排序功能。

安装

在您的项目中运行以下命令。

composer require lagumen/laravel-essentials

您可以选择通过运行以下命令发布配置文件。

php artisan vendor:publish --tag=laravel-essential-config

配置文件包含 ActionsValidationsRepositoriesFilters 的默认命名空间。您可以根据您的偏好更改默认命名空间。

使用方法

仓库

您可以通过运行以下命令创建您的 Repository 类。

php artisan make:essential-repository UserRepository

这将默认在 App\Repositories 上创建一个 Repository 类。

use Lagumen\LaravelEssential\Concerns\LaravelEssentialRepository;
use Lagumen\LaravelEssential\Interfaces\LaravelEssentialRepositoryInterface;
use Lagumen\LaravelEssential\LaravelEssentialSearchableModel;
use App\Models\User;

class UserRepository extends LaravelEssentialRepository implements LaravelEssentialRepositoryInterface
{
    public function __construct(User $model)
    {
        $this->model = $model;
    }
    
    // We will use this later. ;)
    public function getAllFilteredUsers(array $filters = [])
    {
        return $this->model->query()->filter($filters);
    }

    public function createUser(array $data)
    {
        /** @var User $user */
        $user = $this->create($data);

        $user->setting()->create(['timezone' => $data['timezone'] ?? 'UTC']);

        return $user->load('setting');
    }
}

要应用此功能,只需将您的 Repository 类初始化到您的控制器中即可。

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;

class UsersController extends Controller
{
    protected $repository;

    public function __construct(UserRepository $repository)
    {
        $this->repository = $repository;
    }
    
    public function index(Request $request)
    {
        $users = $this->repository->getAllFilteredUsers($request->all());

        return response()->json($users);
    }
    
    public function store(Request $request)
    {
        $user = $this->repository->createUser($request->all());

        return response()->json($user);
    }
}

验证

当然,在将数据插入或更新到您的数据库之前,您需要验证您的请求。

您可以通过运行以下命令创建您的验证类。

php artisan make:essential-validation UserValidation

这将默认在 App\Http\Validations 上创建一个验证类。

use Lagumen\LaravelEssential\Interfaces\LaravelEssentialValidationInterface;

class UserValidation implements LaravelEssentialValidationInterface
{
    public function save(array $data = [])
    {
        return [
            'name'  => 'required|string',
            'email' => 'required|unique:users,email',
        ];
    }

    public function update(array $data = [])
    {
        return [
            'name'  => 'sometimes|string',
            'email' => 'sometimes|unique:users,email,'.$data['id'], // ignore self
        ];
    }
}

要应用此功能,只需在控制器内部调用 Validator Facade 即可。

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use App\Http\Validations\UserValidation;
use App\Repositories\UserRepository;

class UsersController extends Controller
{
  protected $validations;
  
  protected $repository;

  public function __construct(UserValidation $validation, UserRepository $repository)
  {
      $this->validations = $validation;
      $this->repository = $repository;
  }
  
  public function store(Request $request)
  {
      Validator::make($request->all(), $this->validations->save())->validate();

      $user = $this->repository->createUser($request->all());

      return response()->json($user);
  }
  
  public function update(Request $request, $id)
  {
      $data = $request->all();
      
      Validator::make($data, $this->validations->update($data))->validate();

      $user = $this->repository->updateById($id, $request->all());

      return response()->json($user);
  }
}

无需为单个控制器创建多个 Request 类。

操作

您可以通过运行以下命令创建您的 Action 类。

php artisan make:essential-action UserTypeAction

这将默认在 App\Actions 上创建一个 Action 类。

use Lagumen\Essential\Interfaces\LaravelEssentialActionInterface;
use App\Models\User;

class UserTypeAction implements LaravelEssentialActionInterface
{
    protected $user;
    
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    /**
     * Execute action
     *
     * @param  array  $data
     * @return mixed
     */
    public function execute(array $data = [])
    {
        if ($this->user->isAdmin()) {
           // do logic here...
        }
        
        if ($this->user->isEmployee()) {
           // do logic here...
        }
    }
}

这将帮助您使控制器更易于管理并使其看起来更整洁。

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Actions\UserTypeAction;

class UsersController extends Controller
{
  public function store(Request $request)
  {
      // Instead of doing this..
      if ($user->isAdmin()) {
         // do logic here...
      }

      if ($user->isEmployee()) {
         // do logic here...
      }
      
      // Try doing this..
      app(UserTypeAction::class, ['user' => $user])->execute();
      

      return response()->json($user);
  }
}

过滤器

要允许您的应用程序过滤、搜索或排序数据,请遵循以下指南...

首先,让我们创建我们的过滤器。您可以通过运行以下命令来完成。

php artisan make:essential-filter User/Active

请注意,我使用了正斜杠,这将在 App\Filters\User\Active.php 上创建一个类。

use Illuminate\Database\Eloquent\Builder;

class Active
{
    /**
     * Handle filtering.
     *
     * @param Illuminate\Database\Eloquent\Builder $builder
     * @param string|null                          $value
     *
     * @return Illuminate\Database\Eloquent\Builder
     */
    public function __invoke(Builder $builder, $value)
    {
        return !$value
            ? $builder
            : $builder->where('active', $value);
    }
}

接下来,让我们在您想要允许搜索的模型上应用 CanPerformSearch 特性,并通过调用 $searchableColumns 设置您想要允许搜索的列。

use Illuminate\Database\Eloquent\Model;
use Lagumen\LaravelEssential\Concerns\CanPerformSearch;

class User extends Model
{
    use CanPerformSearch;

    /**
     * The attributes that are guarded.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
    ];

    protected $searchableColumns = [
        'name',
        'setting' => ['timezone'] // this will allow searching of timezone on user setting.
    ];

    public function setting()
    {
        return $this->hasOne(UserSetting::class, 'user_id');
    }
}

您还需要调用模型上的 filter 范围。您可以这样做。

return User::withTrashed()->filter($arrayOfFilters);

或者,您可以查看我上面在 仓库 中所做的事情。 ;)

现在,您可以通过将请求参数传递到 URL 来执行过滤、搜索和排序。

/users?sort=id|desc&search=John&active=1

以下是我之前使用过且值得提及的包

Laravel Fuse