【问题标题】:should I use new keywords in laravel's controllers我应该在 laravel 的控制器中使用新的关键字吗
【发布时间】:2018-11-21 02:46:21
【问题描述】:

我可能知道 DI、Solid Principles、工厂模式、适配器模式等等。现在假设我正在创建一个 laravel 应用程序,它会很大。假设我有一个 postcontroller,它是资源并且具有 CRUD 方法。现在让我们说在那个控制器的函数中,我有一个后模型并使用它从数据库中检索数据。我有一个 store 函数,我在其中创建 new Post() 然后将其放入数据库。

1) 直接在 PostController 的函数中使用 Post 模型并使用 new Post() 是一种好习惯吗?有什么不好的?我知道这样我没有使用依赖注入和模式,但为什么还是不好?如你所知,我仍然可以在没有依赖注入的情况下模拟对象,因为 laravel 有很多令人惊叹的测试功能。那为什么在controller的函数里写new关键字,直接用Post模型就这么不好呢?

【问题讨论】:

  • 它在哪里说你不应该在 Laravel 控制器函数中使用new {Model}?另外,这个问题有太多的问题......
  • 因为我可以在 IOC 的帮助下通过 CONSTRUCTOR 注入这个模型,这样更好,因为在以后,它会更好地用于测试或许多其他事情。
  • 对,但这并不意味着你不应该使用new {Model},它只是意味着有一个替代。另外,请不要全部输入大写;它显得粗鲁。
  • 无论如何测试控制器都是有问题的。你必须嘲笑太多东西。

标签: laravel design-patterns


【解决方案1】:

为您的问题提供一个答案。有这个“超薄控制器,胖模型”的概念。我曾经通过 Named Constructers 将对象创建推迟到对象本身。

class UserController 
{
    public function create(UserCreateRequest $request)
    {
        $user = User::createFromRequest($request);

        // do anything else
    }
}

class User
{
    public static function createFromRequest(UserCreateRequest $request)
    {
        $user = new User;
        $user->first_name = $request->first_name;
        // ...
        $user->save();

        return $user;
    }
}

有了这个,您可以拥有更多不同的构造函数,例如 User::createAdmin 及其可测试的。您只需要模拟请求。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2021-09-11
    • 2021-10-08
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多