lagumen / laravel-essentials
Laravel 包,包含构建从小型到大型项目所需的基本实用工具
Requires
- php: ^7.4
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^5.5
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-19 04:23:06 UTC
README
此包提供可以帮助您构建小型到大型项目的实用工具。
灵感来源于 Laravel Query Filters
特性
此包允许您创建 Repositories
、Actions
、Validations
类。它还为您 eloquent 模型提供搜索、过滤和排序功能。
安装
在您的项目中运行以下命令。
composer require lagumen/laravel-essentials
您可以选择通过运行以下命令发布配置文件。
php artisan vendor:publish --tag=laravel-essential-config
配置文件包含 Actions
、Validations
、Repositories
和 Filters
的默认命名空间。您可以根据您的偏好更改默认命名空间。
使用方法
仓库
您可以通过运行以下命令创建您的 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