gerson/laravel-base

一个用于简化Laravel框架使用的工具包


README

Logo LaraBase

Total Downloads Latest Stable Version License

简介

Laravel Base是一个旨在简化使用Laravel框架开发应用程序的包。它提供了一个应用程序开发的基础,为服务、仓库和控制器提供了开发结构,并为资源开发提供了基础。

需求

PHP ^8.1

如何安装

要安装此包,只需在项目的根目录中运行以下命令。

composer require gerson/laravel-base

让我们打开文件

config/app.php

并搜索

'providers' => [ ...

到数组末尾,只需添加

gersonalves\laravelBase\BaseLaravelServiceProvider::class

在您的项目中,在App内创建两个目录。 ServicesRepositories

在app/Http/Controllers内的"Controller.php"文件中替换

use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

use AuthorizesRequests, DispatchesJobs, ValidatesRequests, ControllerTrait;

并将其添加到文件标题中。

use gersonalves\laravelBase\Traits\ControllerTrait;

如何使用

使用它非常简单,您可以使用简单命令生成资源。唯一的要求是您已经生成了您的 模型

只需运行以下命令

php artisan larabase:resource

并回答问题。

建议:在第一个问题(询问服务名称)中使用模型名称。如果您对所有项目都回答“是”,最终将有一个仓库

1 - 服务1 - 控制器。(已包含可执行CRUD)。

工作原理

get()方法将检索模型中的所有条目,您可以应用关系,只需在模型中创建一个名为scopeWithRelations的函数即可,参考以下示例

public function scopeWithRelations(Illuminate\Database\Eloquent\Builder $query)
{
    return $query->with(['address', 'people']);
}

这样,它将对INDEX和SHOW方法生效。

至于持久性(存储和更新),如果请求中来的索引与数据库中的列名相同,它将进行持久化。注意:您的Fillable需要包含这些列,这就是它从中提取的地方。此外,您可以在服务中覆盖store和update方法,从而应用其特定规则。

一些功能

在您的控制器中,您可以按以下方式配置验证

#1 - 控制器

  protected ?array $validators = [
        'email' => 'required|unique:users,email',
        'password' => 'required|min:8|string',
        'cpf' => 'required|cpf|formato_cpf',
    ];

因此,任何存储或更新请求都将应用这些规则。但随后,我们遇到了一个问题。在指定电子邮件必须唯一时,更新会中断并指出电子邮件已存在,因为验证是在之前应用的,要解决这个问题,我们有两种选择,第一种是覆盖更新时的电子邮件规则,如下所示

  protected ?array $replaceOnUpdate = [
        'email' => 'required'
    ];

这样,它将合并两个数组,在更新时电子邮件将继续被要求,但是没有唯一验证。此外,它将保持其他规则,对于cpf和密码,如果我想删除它们,可以这样做

protected ?array $excludeOnUpdate = ['cpf', 'password'];

这样,使用所有3个,结果将是,您将只在创建新记录时应用$validators,在更新时只需填写电子邮件。

#2 - 服务

在之前的版本中,我们需要这样做才能在多级别上保存东西

  public function store(Request $request)
    {
        $eventAddress = new EventAddressRepository();
        $address = $eventAddress->store(new Request($request->get('event_address')));
        $request = $this->mergeRequest($request, ['id_event_address' => $address['id_event_address']]);
        $events = $this->repository->store($request);
        return array_merge($events, ['event_address' => $address]);
    }

在新版本中,我们不再需要这样做,请看以下示例

 protected ?array $parentStore = [
        EventAddressService::class => 
        [
          'persist' => PersistEnum::BEFORE_PERSIST,
          'callback' => 'NomeDaFuncaoDoCallBack'
        ]
    ];
    
    public function NomeDaFuncaoCallBack($model){
      
    }

我只需要告诉仓库它成为对象的“子”对象,并在何时应该持久化,是在主对象之前还是之后。

#3 - 仓库

如果需要存储图片,考虑到我会通过JSON请求以base64接收它,以下是一个示例

{
  "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII="
}

我可以在我的仓库中配置以下内容

protected ?array $storeFile = [
  'logo' => [
    'type' => fileEnum::BASE64_IMAGE,
    'path' => 'public/'
  ]
];

这样,它将base64编码转换为文件,将其保存在预定义路径的存储中,并返回访问文件的URL。如果数据库中有一个名为"logo"的列,则将其添加到数据库中。

{
  "logo": "localhost/storage/asdf-asdf-asdf-asdf.png"
}