php - Laravel 5.1 > 在 View 中使用@inject 来显示内容

标签 php laravel-5 inject

我正在开发一个小型 Web 应用程序,它将拥有一个私有(private)消息系统。当用户登录时,他收到或写入的消息将显示在下拉菜单内的工具栏区域中。没什么新鲜的:-)

工具栏将在用户浏览页面的大部分时间显示。因此,我没有将收件箱实现注入(inject)到可能通过 routes.php 调用的每个 Controller 中,而是考虑使用新的 Blade 函数 @inject。

这看起来像这样(抽象)

  1. 工具栏 View 通过@inject 调用ControllerMethod
  2. ControllerMethod 调用注入(inject)的 InterfaceMethod(基于构造函数的注入(inject))
  3. 服务容器服务于实现
  4. ImplementationMethod 返回收件箱

但我不确定这是否是一个不错的设计模式,因为一般来说我对依赖注入(inject)还比较陌生。我很感激一些想法。

最佳答案

这里有两件事对我来说是错误的。

1) Laravel 的@Inject View 指令实际上并没有做任何类型的“依赖注入(inject)”,尽管它的名字暗示如此。它实际上是在使用服务定位,一种被广泛认为是反模式的模式。

基本上,通过@Inject, View 可以访问容器中的任何内容。它可以得到任何想要的东西。它没有被告知它应该有什么。这就是依赖注入(inject)和服务定位之间的主要区别。

2) 将服务直接注入(inject) View 无疑意味着您正在为您的应用程序增加更多的复杂性,因为您添加了更多可以将服务注入(inject)您的模板的地方。虽然从短期来看,它可能会使事情变得更快、更简单,但从长远来看,它会使事情变得更难处理。

3) 如果在您的 View 中发生这种情况,您将如何测试获取和控制数据的方式?您可能不得不使用功能测试,虽然这不是一件坏事,但对于这样的事情仍然不如单元测试有用。

我建议坚持使用 DI 的通常方式,并实际使用 DI。

关于php - Laravel 5.1 > 在 View 中使用@inject 来显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958796/

相关文章:

laravel - Eloquent (Laravel 5) - 如何在关系查询 (whereHas) 中包含 SoftDeleted 记录?

java - Spring框架中的属性注入(inject)

multithreading - CDI 多线程

mvvm - 将服务传递给 MainViewModel - 我应该使用依赖注入(inject)容器吗?

php - 如何显示数据库中的实际数据

php - 将集合的值转换为 Laravel 中的键

php - 在包含 HTML 代码的字符串中抓取 URL

php - 如何在 Laravel 5.1 中实现 'remember me'?

php - 我需要更改 Select 选项以使用 mysql 表查询

php - PDO bindParam 不允许语句返回结果