首页 > 解决方案 > laravel 服务使用模型和服务

问题描述

我正在尝试正确地削减我的代码,我想听听你的意见。我可以在另一个服务中调用一个服务吗?

我在网上找到了一些简单的例子

这是我的架构:

UserController
    UserService
        User
            Fields => id, name

AliasController
    AliasService
        Alias
            Fields => id, user_id, name

1个用户有很多别名如果没有定义别名,则生成

形式

<input type="text" name="name">
<input type="text" name="alias">

用户控制器

public function store(StoreUserRequest $request)
{
    $request->validated();

    $this->userService->create(request()->except(['_token']));

    return back()->with('success', 'created');
}

用户服务

class UserService
{
    protected $user;
    protected $alias;

    public function __construct(User $user, AliasService $aliasService)
    {
        $this->user = $user;
        $this->alias = $alias;
    }

    public function create(array $attributes)
    {
        // create user
        $user = $this->user->create($attributes);

        // create or generate alias
        if (isset($attributes['alias'])) {
            $aliasName = $attributes['alias'];
        } else {
            $aliasName = $this->aliasService->generate($user->name);
        }

        $this->aliasService->create([
            'user_id' => $user->id,
            'alias' => $aliasName
        ]);

        return $user;
    }
}

编辑 2019 年 2 月 18 日:

我有一个问题:如果我必须在我的控制器中使用单个服务,我如何在 create 方法中获取角色列表?

类 UserController 扩展控制器 { 保护 $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function create()
    {
        $user = new User();

        $roles = Role::all(); <= ???
        or
        $roles = $this->roleService->getAll(); <= ???

        return view('users.create', array(
            'user' => $user,
            'roles' => $roles
        ));
    }
}

标签: laravelservicemodelusing

解决方案


我觉得当你想分离一个涉及模型创建更新功能的逻辑时,你可以使用Repository概念。本质上只是一个处理特定模型上发生的动作的类。

服务更像是专用于特定领域概念的类。服务的目的是提供帮助函数来处理服务所代表的领域概念。

为了简化,例如:

您可能有一个用户模型。每个用户都可以获取他的 facebookfeeds。他也可以报名参加小组讨论。在这种情况下,您可以拥有 2 项服务:

FacebookService它会处理您需要的与 facebook 发布相关的所有操作。 DiscussionService它会处理您需要的与小组讨论相关的所有操作。

现在,您可能希望在讨论中添加一项功能,以便在 facebook 上发布最近的讨论。这意味着 DiscussionService可以在内部访问FacebookService以利用它的某些辅助功能。

即使在此示例中,两个服务一起使用,但每个服务仍然只根据分配给它的域概念做它所知道的事情。如果出现超出服务范围的内容,我们将调用相应的服务函数。希望有帮助...


推荐阅读