ZF2 服务定位器

2024-01-08

我对 zf2 很陌生,正在尝试它。我有一个视图助手,我需要它来访问表对象。在我的控制器中我可以运行:

$this->getServiceLocator();

但理想情况下,我会在我的视图助手中运行它。不幸的是,我似乎无法从我的视图助手中访问它。我尝试通过构造函数传递它,在 module.config.php 中配置一个工厂方法,但是当我尝试这样做时,Zend 将不再将 tablegateway 对象传递到从模块的 Module 中的服务工厂方法创建的模型对象之一。 php 文件。这似乎是因为它不再调用工厂方法,而是选择在不带任何参数的情况下运行实例化。

我不确定我是否理解为什么视图工厂方法会影响具有不同名称的不同工厂方法集。

谁能告诉我我所做的事情有什么问题吗?我可以提供更多细节,但目前我不清楚哪些细节实际上很重要,而无需提供整个代码库。

Thanks.


Crisp 确实为您的问题提供了有效的答案,但我建议更进一步。服务定位器的注入使您的视图助手与框架和服务定位器模式紧密耦合,并且很容易受到攻击,因为应用程序中的每一段代码都可以修改服务定位器中的每个服务。

There 是直接注入依赖项的原因 http://blog.ircmaxell.com/2012/08/object-scoping-triste-against-service.html,因此您只依赖于您的依赖项,并且不再实现此反模式。我们假设您的视图助手取决于MyModule\Model\MyTable,那么视图助手的构造函数将如下所示:

namespace MyModule;

use MyModule\Model\MyTable;
use Zend\View\Helper\AbstractHelper;

class MyViewHelper extends AbstractHelper
{
  protected $table;

  public function __construct(MyTable $table)
  {
    $this->table = $table;
  }
}

正如您所指出的,您只需注入您的MyTable now:

namespace MyModule;

class Module
{
  public function getViewHelperConfig()
  {
    return array(
      'factories' => array(
        'MyViewHelper' => function($sm) {
          $sm = $sm->getServiceLocator(); // $sm was the view helper's locator
          $table = $sm->get('MyModule_MyTable');

          $helper = new MyModule\View\Helper\MyHelper($table);
          return $helper;
        }
      )
    );
  }
}

请注意,在视图助手工厂内,您的服务管理器是查看助手的服务管理器,而不是注册表的“主”管理器(另请参阅我之前写的博客文章 http://juriansluiman.nl/en/article/120/using-zend-framework-service-managers-in-your-application). The $sm->getServiceLocator()为您解决这个问题。

我不确定我是否理解为什么视图工厂方法会影响具有不同名称的不同工厂方法集。

事实并非如此,因此您的代码中可能存在错误。如果上述方法不起作用,请提供有关您的服务管理器配置的更多详细信息,以便我可以更新我的答案。

上述方法的一大优点是您可以使视图助手的单元测试变得非常容易。您可以模拟表网关并专注于视图助手的完整行为。

use MyModule\View\Helper\MyHelper;

public function testHelperusesTable
{
  $mock   = $this->getMock('MyModule\Model\MyTable');
  $helper = new MyHelper($mock);

  // Test your $helper now
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZF2 服务定位器 的相关文章

  • ZF2如何监听特定控制器的调度事件

    如何监听特定控制器的调度事件 目前我执行以下操作 模块 php public function onBootstrap EventInterface event application event gt getApplication eve
  • ZF2如何从控制器外部获取实体管理器

    我们可以使用控制器内的实体管理器 this gt getServiceLocator gt get doctrine entitymanager orm default 但是我们如何访问 Zendframework 2 项目其余部分中的实体
  • 如何在 zend Framework 2 中返回对象数组?

    我正在 zf2 中进行查询 然后得到一个object Zend Db ResultSet HydratingResultSet 我必须foreach上 以便到达属性 我想默认获得一个对象数组 这是我的一些代码 factory address
  • ZF2 文件上传集合

    我无法让我的文件上传集合正常工作 这就是我所做的 https gist github com manuakasam 1ac71daf7269616f55f0 https gist github com manuakasam 1ac71daf
  • ZF2 getServiceLocator() 未找到?

    我一生都无法让 this gt getServiceLocator 在我的控制器中工作 我已经阅读并尝试了一切 我猜我错过了什么 这是一些代码 namespace Login Controller use Zend Mvc Controll
  • Zend 框架 2 文件下载

    我制作了一个表单来将文件上传到文件夹 data uploads使用Zend Filter File RenameUpload filter 这就像一个魅力 我现在的问题是如何提供这个文件给用户下载呢 我认为它会是这样的 response g
  • 在 ZF2 中创建具有依赖关系(依赖注入)的学说存储库

    我想创建一个具有硬依赖关系的存储库 我发现Jurian Sluisman 的这篇博文 https juriansluiman nl article 142 dependency injection in a doctrine reposit
  • 在 URL 中发送参数的最佳且安全的方法

    我正在开发一个网站 该网站具有根据 id 更新和删除数据的功能 现在我担心的是我的网址是 www example com public controller action 1 如果行动是delete 任何人都可以change id from
  • 如何使用主义2和zend框架2中的缓存?

    请我在这里需要一些帮助 我已经搜索了很多但没有结果 我如何利用查询及其存储在memcache中的结果 我正在使用zend框架2和学说2 这是我在 module config php 中的配置 Doctrine config doctrine
  • Zend Framework 2 - 如何包含库中的部分内容

    我写了一个部分 我想在几个模块中使用它 我认为最好的方法是将其放入我的自定义库中 但不幸的是 我无法找到一种方法来包含这个部分 而不使用像这样的非常难看的路径 echo this gt partial vendor myvendor lib
  • 使用 Zend Framework 2 扩展 ZfcUser

    您好 我正在尝试使用 Zend Framwork 2 的 ZfcUser 模块编写用户注册表单 并且希望获得一些有关添加更多用户字段时最佳实践的建议 到目前为止 我已经创建了自己的模块 名为 WbxUser 如模块 wiki 页面 http
  • 从 Zend Framework 2 中的路由获取 $_GET 参数

    Zend Framework 1 有一种非常简单的方法来解析 URL 路由并在 GET 超全局中设置找到的参数以便于访问 当然 您可以在控制器内使用 gt getParam something 但如果在 URL 中找到参数 则它是also可
  • Zend Framework 2 的多个表

    我是 Zend Framework 2 的新手 我成功完成了 ZF2 的专辑教程 现在我想仅显示数据库中多个表中的某些数据 我有一个简单的数据库设置 其中包含表格 例如人员 书籍 状态等 数据库应该做什么并不重要 我想知道是否有一个教程可以
  • Zend Framework 2 在视图中显示视图

    我有两个模块管理和登录 我想在管理视图 index html 中显示登录视图 login phtml 我在管理模块indexAction控制器中有以下内容 public function indexAction login new Logi
  • 如何在 zend Framework 2 中禁用渲染视图?

    我想使用一些 ajax 但我不知道如何使用与 zend Framework 2 中的 setNoRender 相同的函数来禁用渲染视图 如何在 zend Framework 2 中禁用渲染视图 要禁用您的视图 public function
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • ZF2 将自定义属性添加到选择表单元素中的选项

    我想将自定义 HTML 属性添加到 Zend Framework 2 表单中的选择选项中 这是我的 Form 类中的 部分 代码 this gt add array name gt lieuRemplissage type gt Selec
  • ZF2 共享模块事件管理器

    当特定情况发生时 我需要在每个模块中实现一个事件触发器 我还需要所有其他模块在触发该事件时必须执行某些工作 请注意这一点 我正在尝试创建一些通用端点 我可以在其中发送触发器 并且所有模块都需要监听 但我在弄清楚如何实现这一点时遇到了一些麻烦
  • 如何设置 Zend Cache Storage 的过期时间?

    我想在 Zend 文件系统缓存中存储一 些 XML 并让它在 30 分钟后过期 如何设置缓存持续时间 过期时间 我使用 Zend 缓存作为组件 而不是在完整的 ZF2 应用程序的上下文中 cache Zend Cache StorageFa
  • ZF2 查看攻略

    我正在尝试执行以下操作 简单的控制器和动作 Action 应根据请求返回 2 种类型的响应 HTML in case of ordinary request text html JSON in case of ajax request ap

随机推荐

  • 如何使用鼠标拖动来画线?

    我需要使用光标在delphi中画一条线 我已经创建了线代码 但我不知道下一步该做什么 如何才能做到这一点 我按下鼠标 当线条需要开始并拖动鼠标时 或者简单地释放鼠标按钮并绘制线条 procedure TForm1 Button1Click
  • 如何查明在我的 servlet 中按下了哪个 HTML 按钮?

    我正在创建一个包含两个提交按钮的注册表单 我需要知道在我的 servlet 代码中单击了表单中的哪个按钮 阅读以下问题的答案这个问题 https stackoverflow com questions 5222 accessing post
  • 获取有关 LLDB 中错误内存地址的信息

    我正在尝试在我的 iPhone 应用程序中调试 EXC BAD ACCESS 它在方法调用时崩溃 并且该方法的行是EXC BAD ACCESS code 1 address xxx 以前 我只会使用gdb info malloc histo
  • 一堂课可以延长两堂课吗?

    我的班级应该同时扩展两个班级 public class Preferences extends AbstractBillingActivity public class Preferences extends PreferenceActiv
  • R中根据字符分割字符串

    我的数据集中有一列 其中有一个我想要拆分的字符串 df data frame col c BrBkRY BBkRBr YBRG RBBk 这是我想用来有条件分割的向量 sep c Br Bk R Y B G 这就是最终的样子 我是用手做的
  • 如何将 Maven 嵌入到我的应用程序中?

    我想将 Maven 或能够发挥所有作用的库嵌入到我的 Java 应用程序中 要点 这是我想要执行的两项任务 1 在本地存储库中发布 jar2 在私有企业存储库 Nexus 中发布jar 所有必需的 jar 必须位于公共 Maven 存储库中
  • 烧瓶蓝图模板文件夹

    我的烧瓶应用程序布局是 myapp run py admin init py views py pages index html main init py views py pages index html init py 文件为空 管理
  • RestKit、CoreData 和 Swift - 我似乎无法取回结果

    我已经在一个新的基于 Swift 的应用程序 当前是 XCode 6 beta 3 中成功设置了 RestKit 到 CoreData 的映射实现 我知道导入映射正在通过我的 RestKit JSON 调用进行工作 因为我可以检查 sqli
  • 如何将WTL和ATL添加到Visual Studio C++ Express 2008

    我开始在家使用Visual Studio C Express 2008 但里面没有ATL 如何将 ATL 添加到 Visual Studio C Express 2008 ATL 7 1 现在是Windows 驱动程序套件 http www
  • 哪些版本的 IE 支持 PNG 图标?

    在这个旧的 StackOverflow 帖子中 https stackoverflow com questions 1344122 favicon png vs favicon ico why should i use pngs inste
  • 如何检查数组是否是多维的? (jQuery)

    我有两个 AJAX JSON 响应数组 一维 fili Chif Bart deme Bomb Jyui Joiu FDPi Doen abcd drog MAIC Jasi abcd Jere Jibi 三个维度 5 2 N L 7 C
  • 通过 D3 绘制 HTML 表格不会更新现有数据

    我正在使用 D3 绘制 HTML 表格 输入后效果很好 当我将新项目添加到数据集合时 它会正确地将新项目添加到表中 问题是每当我更新集合中的现有对象 下面的 backgroundJobs 集合中的对象 时 当我重新运行 D3 代码来同步表时
  • 如何使用 srcset 延迟加载图像?

    我在用着slick js http kenwheeler github io slick 构建一个旋转木马 但是 即使我将属性从src to data lazy在我滚动到该图像之前 图像仍然会被加载 我怀疑这是因为我有srcset在我的图像
  • 这是一种新的排序算法吗? [用Java和伪代码实现]

    我知道这可能是一个愚蠢的问题 也许是今天最愚蠢的问题 但我不得不问 这种排序算法是我发明的吗 昨天 我对基于交换的排序算法有了一点启发 今天 我实现了它 并且成功了 它可能已经存在 因为有许多不那么流行的排序算法几乎没有或根本没有相关信息
  • Django - 在外键对象确实存在的情况下设置 ManyToMany 属性时,序列化程序抛出“无效的 pk - 对象不存在”

    所以下面我有一些代码来测试某人创建帖子并且该帖子有一个功能hash tag在本例中是 video 该代码采用Post body并使用正则表达式查找以 开头的任何单词 如果是 那么它会创建或获取HashTag来自HashTag桌子 然后设置该
  • 使用 Python 更新 MS Word .docx 文档的 TOC(目录)

    我使用python包 python docx 来修改MS word docx文档的结构和内容 该软件包无法更新 TOC 目录 Python 使用 python docx lxml 创建 目录 https stackoverflow com
  • 在 pandas 中,我可以深度复制 DataFrame 包括其索引和列吗?

    首先 我创建一个 DataFrame In 61 import pandas as pd In 62 df pd DataFrame 1 2 3 然后 我深深地复制了它copy In 63 df2 df copy deep True Now
  • 在 Rider IDE 中创建类依赖关系图

    那里存在这个功能吗 怎样才能使用它呢 在该问题中 Rider 官方文档对我来说毫无用处 UPDATE 现在完全支持项目图功能骑士2020 3 https www jetbrains com rider whatsnew 2020 3 ver
  • 如何在 OpenCV 中访问 3d 矩阵的切片

    我想将 592 个 47x47 数组存储到 47x47x592 矩阵中 我创建了 3d 矩阵 如下所示 int sizes 47 47 592 Mat 3dmat 3 sizes CV 32FC1 然后我想我可以通过使用一组范围来访问它 如
  • ZF2 服务定位器

    我对 zf2 很陌生 正在尝试它 我有一个视图助手 我需要它来访问表对象 在我的控制器中我可以运行 this gt getServiceLocator 但理想情况下 我会在我的视图助手中运行它 不幸的是 我似乎无法从我的视图助手中访问它 我