gpt4 book ai didi

php - laravel 中的存储库模式相对于在 Controller 构造函数中实例化模型的优势

转载 作者:可可西里 更新时间:2023-11-01 13:14:39 24 4
gpt4 key购买 nike

举两个例子。

示例 1(存储库模式)

界面

interface FooInterface {
public function all();
}

模型(在一个宽松的术语中使用它)

class FooModel implements FooInterface {
public function all()
{
return DB::('sometable')->get();
}
}

服务提供商

  class FooServiceProvider extends ServiceProvider {

public function register()
{
$this->app->bind(
'Foo\FooInterface',
'Foo\FooModel'
);
}

config/app.php

'providers' => array(
// --
'Foo\FooServiceProvider'
),

最后 Controller :

use Foo\FooInterface as Model;

public function __construct(Model $model)
{
$this->model = $model;
}

现在我可以访问方法作为$this->model->all()。那太棒了!我们来看第二个例子。

示例 2:

Controller :

public function __construct()
{
$this->model = new \Foo\FooModel();
}

现在我也可以访问与 $this->model->all();

相同的方法



问题

正如我读到的,使用存储库模式的优势在于,将来可以轻松配置/更改接口(interface)系统。例如

如果我更改数据库系统,我只需要更改服务提供商中的绑定(bind)

但是,我也可以轻松地更改 Controller 构造中的模型实例化以实现相同的效果。比如,将 $this->model = new\Foo\FooModel() 更改为 $this->model = new\Bar\BarModel(); 其中 BarModel 将保存不同系统的方法。

存储库模式的优点方面,我到底缺少什么?或者在这种特殊情况下,存储库模式还没有提供太多优势,在其他一些情况下可能吗?如果是,那可能是什么情况?

附注术语模型 只是为了方便而使用。

最佳答案

这实际上取决于您如何设置代码。在您的特定情况下,似乎没有太大好处。

但是,如果您的代码要求您在多个不同的 Controller 上对模型进行多个实例化,该怎么办?例如,您的用户存储库可能有一个模型。可能有许多 Controller 需要获取有关用户的信息。

然后通过所有 Controller 更改所有引用(即您的示例 2)将很麻烦。最好只更改一次存储库(即您的示例 1)。

在编码中从来没有一种适合所有人的尺寸。你能做的最好的事情就是为你现在需要的东西编写代码,并了解任何可能有助于将来提高灵 active 的潜在解决方案。我的观点是存储库模式是有助于提高灵 active 的解决方案之一。您可能永远不需要更改模型或移动到不同的数据库,但与如果您确实想要更改数据库时遇到的麻烦相比,现在使用它进行编码的工作量是最小的。

关于php - laravel 中的存储库模式相对于在 Controller 构造函数中实例化模型的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com