Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel中存储库模式相对于在控制器构造函数中实例化模型的优势_Php_Dependency Injection_Laravel_Laravel 4_Repository Pattern - Fatal编程技术网

Php laravel中存储库模式相对于在控制器构造函数中实例化模型的优势

Php laravel中存储库模式相对于在控制器构造函数中实例化模型的优势,php,dependency-injection,laravel,laravel-4,repository-pattern,Php,Dependency Injection,Laravel,Laravel 4,Repository Pattern,让我们举两个例子 示例1(存储库模式) 接口 模型(松散地使用它) 服务提供商 config/app.php 最后控制器: 现在我可以通过$this->model->all()访问这些方法。太好了!让我们看第二个例子。 示例2: 控制器: 现在我还可以访问与$this->model->all()相同的方法 问题 正如我所读到的,使用存储库模式的优点是,在将来,易于配置/更改接口系统。e、 g 如果我更改了db系统,我只需要更改服务提供者中的绑定 但是,我也可以轻松地更改控制器结构中的模型安装

让我们举两个例子

示例1(存储库模式)

接口

模型(松散地使用它)

服务提供商

config/app.php

最后控制器:

现在我可以通过
$this->model->all()访问这些方法。太好了!让我们看第二个例子。


示例2

控制器:

现在我还可以访问与
$this->model->all()相同的方法



问题

正如我所读到的,使用存储库模式的优点是,在将来,易于配置/更改接口系统。e、 g

如果我更改了db系统,我只需要更改服务提供者中的绑定

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

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


p、 “模型”一词仅用于方便

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

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

然后,通过所有控制器更改所有引用(即示例2)将是一件麻烦的事情。最好只更改一次存储库(即示例1)


编码从来没有一刀切的方法。您所能做的最好的事情就是为您现在需要的东西编写代码,并意识到任何可能有助于未来灵活性的潜在解决方案。我的观点是,存储库模式是帮助灵活性的解决方案之一。您可能永远不需要更改模型,或移动到其他数据库,但与更改数据库所带来的麻烦相比,现在使用它进行编码的工作量是最小的。

准备切换数据库是存储库模式中最烦人的论据之一。这一次之后通常是无知的“我永远不会切换数据库”。如果每次我都有一个向上的投票权,我就有了这个对话

现在想象一下,您想要添加一个后端缓存或一些搜索引擎来优化搜索。这非常适合存储库模式

存储库模式的主要好处是,与后端相关的所有更改都比其他更改更易于管理


演示为什么你不想在模型中使用这些东西;如果要迁移模型的属性,则需要以不同的方式从后端获取模型。在某些情况下,您可能需要两个模型。当你在一个模型中实现了这一点,你需要应用大量的黑客技术,才能使这一点更加有效。如果存储库管理这些更改,那么模型将保持清晰,代码也将变得可管理。

您不应该在构造函数中实例化对象,因为它创建了与特定类名的紧密耦合。它与MVC无关。+1用于存储库模式的独特用法,如
缓存
。并非每个博客(答案)都会解释(或给出)这种用法。感谢不同的数据库参数-为什么在切换DB时需要更改调用模型的方式?我的意思是你仍然会调用
$this->model=new\Foo\FooModel()无论您使用Mongo、SQLite、MySql还是其他,对吗?如果您有一个只适合一个数据库的复杂原始查询,那么您可以将其添加到模型的作用域函数中,这是关于抽象级别的。模型!=存储库。
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'
      );
   }
'providers' => array(
  // --
  'Foo\FooServiceProvider'
),
use Foo\FooInterface as Model;

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