Laravel 门面有依赖性吗?

2024-04-22

我读到,一个类不应该有太多的依赖关系。在一本书中,它指出 4 个依赖项可能表明类可能做了太多事情。

假设我编写了一个使用 10 个依赖项的类:6 个类和 4 个外观。我应该只关心这 6 个类并将它们分开,还是也关心 4 个外观?

如果有人想知道我是如何得到这么多门面的:

use Input;
use App;
use Session;
use Log;

这些都是经常需要的。我听到一个问题 - 为什么我需要应用程序?调用函数:

App::setLocale('lt');

有人说门面不是依赖,也在这里:

多态性和依赖注入——太多的依赖 https://stackoverflow.com/questions/27922492/polymorphism-and-dependency-injection-too-many-dependencies

关于这个问题有很多不同的观点(什么时候上课? 依赖于某些东西),但类依赖通常被视为 传递给构造函数的内容,即类需要什么 被实例化为对象。

我想我自己可以从一个类创建一个外观,并且我将通过这种方式减少依赖关系。但这有什么意义吗?

例如这篇文章指出 - 我们不应该使用外观:

http://taylorotwell.com/response-dont-use-facades/ http://taylorotwell.com/response-dont-use-facades/

从这里我知道门面并没有那么糟糕,但糟糕的是类开始做太多的事情。

我说的是 Laravel 4,但可能同样适用于 Laravel 5 或其他使用相同框架的框架。我刚刚听说 Laravel 5 使用的门面数量没有 Laravel 4 那么多。

Update:

我也想得到这样的论点,以便我可以在讨论这个话题时与其他人一起使用它。就像我说的那样——互联网上的一些人(即使拥有良好的 stackoverflow 配置文件)对我说外观很糟糕,它们就像全局变量,他们会立即告诉我——这与全局不同,它们是可嘲笑的,你不应该关心。他们也可能会说,这是他们的意见。所以我想要用强项来捍卫自己。所以我可以像 2*2 = 4 一样解释它,没有人会不同意。或者至少接近那个。

Update:

如果这些是依赖项,并且我希望一个类最多有大约 4 个依赖项,那么我只有一个想法 - 创建分组类,就像类树一样。但我最终还是为小功能开设了很多课程。就像这 10 个依赖项一样,如果我想要最多 4 个依赖项,我想我需要 3-5 个类,而不是 1 个。所以,如果我有一个大项目,你将有数百万个小类。那样的话是不是会显得更复杂呢?就像 Laravel 一样,我看到有很多类,而 CodeIgniter 的类少得多,并且看起来更易于阅读/遵循和扩展。


Laravel 外观绝对是依赖项,它们的预期用途是用于控制器,在构建服务和业务逻辑时,您应该尝试使依赖项尽可能透明。

如果您的目标是实现 SOLID 实现,您将希望将所有依赖项作为参数或在类构造函数中传递。

让我们稍微说明一下这个抽象:

重构前

Class PhotoService {

    protected $photosModel = null;

    public function getPhotos()
    { 
        $photos = Cache::get('photos');

        if (is_null($photos)) {
           return Photo::all();
        }
    }
}

仍然使用门面,但通过 IOC 解决其他依赖关系

Class PhotoService {

    protected $photosModel = null;

    public function __construct(PhotoInterface $photoModel) {
       $this->photosModel = $photoModel;
    }

    public function getPhotos()
    {
       $photos = Cache::get('photos');

       if (is_null($photos)) {
          return $this->photosModel->getPhotos();
       }
    }
}

通过IOC解决

Class PhotoService {

    protected $photosModel = null;

    public function __construct(PhotoInterface $photoModel) {
       $this->photosModel = $photoModel;
    }

    public function getPhotos(CacheInterface $cache)
    {
       $photos = $cache->get('photos');

       if (is_null($photos)) {
          return $this->photosModel->getPhotos();
       }
    }
}

在我看来,最好的例子就是外部化代码的情况,即使您在自己的项目之间共享代码也是如此。如果提供以下内容,新的实现会更容易工作通过接口进行完整签名,而不必查看旧代码或测试来寻找任何外观。

不过,我认为在控制器中使用 Facades 没有任何坏处。

这种设置仅提供以下优点:

  • 能够轻松切换缓存策略
  • 切换数据库类型的能力
  • 通过 ioc 注入模拟来关闭功能的能力
  • 通过易于实施来鼓励 TDD
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 门面有依赖性吗? 的相关文章

随机推荐

  • 在 Windows 上使用 OpenBLAS 安装 numpy 的教程

    拜托 我这里确实需要一盏灯 我想使用良好的 BLAS LAPACK 库安装 numpy在 Windows 上 但绝对没有页面足够好地解释该过程 看来 OpenBLAS 是一个又好又快的选择 目标是将 theano 与 keras 一起使用
  • 将下拉菜单添加到 ASP.Net Core Web 应用程序中的导航栏(引导程序)

    在 Visual Studio 中 我创建一个新的 ASP Net Core Web 应用程序 然后我添加一个下拉菜单 根据 Bootstrap 文档 https getbootstrap com docs 5 1 components n
  • 如何从Play缓存中获取对象(scala)

    如何从Play缓存中获取对象 scala 设置代码 play api cache Cache set mykey98 new Product 98 0 获取代码 val product1 Option Any play api cache
  • Twitter 推文后绑定事件 ( twttr.events.bind ) 不起作用

    我有这个简单的代码 应该提醒 我刚刚发推文 但似乎不起作用 我已经尝试了所有示例 甚至访问此链接寻求帮助https dev twitter com discussions 671 https dev twitter com discussi
  • 如何访问 ItemsControl 的子项?

    如果我有一个源自ItemsControl 我可以访问它的子集合 以便我可以循环它们来执行某些操作吗 我目前似乎找不到任何简单的方法 类似的解决方案Seb s https stackoverflow com a 1000438 3195477
  • 如何去掉 Matlab 单元格中的双引号?

    我在 Matlab 中有一个单元格数组 单元格中的所有元素都表示为 something 我怎样才能创建一个数组 something 这里有两个解决方案 strrep删除所有双引号实例 同时regexprep只删除字符串开头和结尾的双引号 感
  • 生成的 pdf 中的图像损坏了发送到服务器的 pdf

    我正在使用 jsPDF 在 Web 应用程序中创建 PDF 文档 将该文档发送到 Perl 并让 Perl 通过电子邮件发送它 效果很好 但是 当我将图像添加到 PDF 文档时 它不再起作用 因为 Adob e Reader 说该文件已损坏
  • WebSocket Stomp over SockJS - http 自定义标头

    我在 javascript 客户端中使用 stomp js 而不是 SockJS 我正在使用连接到 websocket stompClient connect function frame stomp over sockJS 连接有 2 个
  • 从节点树中获取总和

    我正在学习php 我有这个结构 company 1 10 all 50 company 1 1 10 all 20 company 1 1 1 10 all 10 company 1 2 20 all 20 每家公司可能有多个子公司 也可能
  • 切换div的可见性属性

    我的 div 中有一个 HTML 5 视频 然后我有一个自定义播放按钮 效果很好 我将视频的可见性设置为加载时隐藏 单击播放按钮时可见 再次单击播放按钮时如何将其恢复为隐藏 function showVid document getElem
  • 使用 linq 将数据集列表

    我有一个DataSet我想转换DataSet into List
  • 云函数在运行所有代码之前结束

    我正在尝试创建一个云函数 但它在 firebase 日志中 在执行所有任务之前显示 已完成 这是我的代码 export const count functions pubsub schedule 0 8 timeZone Europe Br
  • Node.js 中的 git 命令

    我想知道是否有人知道 进入 npm 包来使用 git 命令 我有一个nodejs项目 我想执行以下命令 克隆 git 创建分支 git pull request 来自创建的分支 我尝试了一些 npm 包但没有成功 任何帮助将不胜感激 谢谢
  • Pytest - 测试解析器错误:无法识别的参数

    我正在尝试测试一个非常简单的函数 由于多次尝试测试使用参数解析器作为参数的更复杂的函数而失败 来自 runfile py import argparse import os def get input args parser argpars
  • 扩展无法启用或安装的问题

    php 7 3 5 你好 我的扩展 ext http 有问题 composer 说我缺少 ext http 即使我在composer json 中写了这个 为什么 这就是这个确切的消息 问题1 您的系统中缺少请求的 PHP 扩展 ext h
  • 如何将 中的项目向右对齐

    我如何将下面的所有内容对齐到最右侧 div div
  • 在没有 DBCC INPUTBUFFER 的情况下获取 SQL Server 中的最后一个命令

    有没有办法在不使用的情况下获取最后执行的 SQL Server 命令DBCC INPUTBUFFER 例如 是否有包含此信息的系统视图或目录 Thanks 您可以将 SPID SQL 进程 ID 传递给以下内容 DECLARE sql ha
  • 字符串比较。如何将字符串与 std::wstring 进行比较? WRT STRCMP

    我试图比较两种我期望在某种程度上兼容的格式 因为它们通常都是字符串 我尝试使用字符串和 std wstring 执行 strcmp 并且我确信 C 专家知道 这根本无法编译 是否可以比较这两种类型 这里有简单的转换吗 你需要转换你的char
  • java:使用扫描仪类读取文本文件并将信息存储在数组中

    我有一个包含学生成绩的文本文件 例如 Kim 40 45 Jack 35 40 我试图从文本文件中读取这些数据 并使用扫描仪类将信息存储到数组列表中 任何人都可以指导我正确编写代码吗 Code import java io import j
  • Laravel 门面有依赖性吗?

    我读到 一个类不应该有太多的依赖关系 在一本书中 它指出 4 个依赖项可能表明类可能做了太多事情 假设我编写了一个使用 10 个依赖项的类 6 个类和 4 个外观 我应该只关心这 6 个类并将它们分开 还是也关心 4 个外观 如果有人想知道