ez-laravel/model-services

简易Laravel模型服务。

v1.0.1 2020-09-10 09:56 UTC

This package is auto-updated.

Last update: 2024-09-10 19:26:36 UTC


README

StyleCI

此包为基于模型的服务的默认服务功能提供支持。我倾向于将其用作一种仓库类。

我也遇到了在Vue组件中使用(深层)集合时JSON无法正确渲染的问题。因此,我决定在模型服务中手动定义额外的属性,使用预加载方法处理在Vue组件中需要的属性添加/编辑。

安装

在项目目录中运行以下命令以安装包:

composer require ez-laravel/model-services

使用方法

现在您可以这样定义基于模型的服务的代码

<?php

namespace App\Services\ModelServices;

use EZ\ModelServices\Traits\ModelServiceGetters;
use EZ\ModelServices\Contracts\ModelServiceContract;

class UserService implements ModelServiceContract
{
    use ModelServiceGetters;

    private $model;
    private $records;
    private $preloadedRecords;

    public function __construct()
    {
        $this->model = "App\Models\User";
    }

    public function preload($instance)
    {
        return $instance;
    }
}

方法

一旦注册了服务,以下方法将自动可用:

$users = Users::getAll();
$users = Users::getAllPreloaded();
$numUsers = Users::countAll();
$user = Users::find($id);
$user = Users::findBy($field, $value);
$user = Users::findPreloaded($id);
$user = Users::findPreloadedBy($field, $value);

注册模型服务

为了使类可用,您应该创建一个门面(Facade),并在您的应用程序中注册服务和门面。

注册服务

通过更新app\Providers\AppServiceProvider.php文件来在IoC容器中注册服务。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\ModelServices\UserService;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton("users", function() {
            return new UserService;
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

创建门面

例如

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class UsersFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return "users";
    }
}

注册门面

最后,更新app/config/app.php配置文件以注册门面。

<?php

return [
    ...
    'aliases' => [
        ...
        'Users' => App\Facades\UsersFacade::class,
    ],
];

贡献

我正在寻找反馈!

由于我并不完全确定这是解决最初问题的最佳方法(Vue组件中缺少属性和需要某些类型的仓库类)。

目前,在模型服务被大量使用时,所有记录都被检索以减少执行的查询数量。这可能不是最佳方法,我正在寻找更好的方法。因此,如果您有任何建议,请随时联系我或提交PR!