我对这个Manager和Service类名后缀感到有些困惑.
据我了解的不同,Managers负责处理(创建,检索,删除......)某些类型的实体.例如,ModuleManager负责加载和返回Modules.在这种情况下,你确实关心实际的实体,Module.
但是,Services是提供接口来执行cetain类型的流程逻辑的类.例如,a LogService将给定的日志消息发送到定义的日志编写器.你不关心它在哪里以及它做了什么,你只是想让管理员了解刚刚发生的事情.
现在,ZF2提供了一个ServiceManager创建并返回给定实例的实例Service.我不小心习惯于创建Managers并提供一个factory,ServiceManager以便您可以在上下文中访问Manager使用,以便保持控制器的微小和可测试类中的真实逻辑.这是令我困惑的部分,因为很明显,不建议使用a 来检索.但是:我不是唯一一个这样做的人:模块是另一个例子:它默认注册为a .$this->getServiceLocator()->get('managerName');ControllerManagersServiceLocatorDoctrine ORMEntityManagerdoctrine.entitymanager.orm_default Service
我是否得到了真正的区别Services和Managers错误?甚至还有区别吗?是Managers没有可能从继承Services的概念?
我想知道PHP是否提供一种本机方式来检查类(实例)是否属于某个命名空间。
其实并不重要,只是为了您的理解,我是如何提出这个问题的:
使用ZF2,我为该onDispatch事件提供了一个事件处理程序。但是,对于任何模块的任何控制器的每次分派,都会调用此处理程序。显然,如果调度此模块的控制器,我只想在此处理程序中执行操作。
所以我想检查Controller是否在模块的命名空间中。
顺便说一句,我暂时通过在类名(strpos($className, 'ModuleName\Controller') !== false)上进行字符串比较来解决此问题。我猜想使用substr()或strncmp()诸如此类的效果要好于strpos(),但就我而言,这并不重要。
提前致谢!
//编辑:为了清楚起见,我正在寻找类似的东西:
// $foo is an instance of MyApp\Controller\Moo
is_in_namespace('MyApp\Controller', $foo); // true
Run Code Online (Sandbox Code Playgroud)
要么
// $foo is an instance of MyApp\Controller\Moo
get_namespace($foo) === 'MyApp\Controller'; // true
Run Code Online (Sandbox Code Playgroud) 尝试使用gnupg加密邮件时,方法调用gnupg::keyinfo()会抛出错误could not init keylist.
这是我初始化扩展的方式:
putenv('GPGME_DEBUG=9:./gnupg/debug.log');
putenv('GNUPGHOME=./gnupg/');
$this->gpg = new gnupg();
$this->gpg->seterrormode(gnupg::ERROR_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)
gnupg确实存在的地方(调用is_dir('./gnupg')返回true- 我也尝试了绝对路径而没有成功).
一些其他信息:
PHP-CLI.(但是,我需要使用HTTP)Linux name 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 GNU/Linuxgpg --version- >gpg (GnuPG) 1.4.10client - > nginx- > apache- >php 5.3drwxrwxrwx 4 www-data web1 4096 29. Nov 12:30 .debug.log显示以下错误:
_gpgme_io_set_close_notify (fd=0x282): enter: close_handler=0x7f6d2a409780/0x7f6d38edb730
_gpgme_io_set_close_notify (fd=0x282): error: Invalid argument …Run Code Online (Sandbox Code Playgroud) 有谁知道为什么一些开发人员(特别是在Zend Framework 2的资源中看到)在比较中的实际值之前写出预期值?
例:
if (true === $actualValue) { ... }
Run Code Online (Sandbox Code Playgroud)
代替
if ($actualValue === true) { ... }
Run Code Online (Sandbox Code Playgroud)
这种情况没有在PSR编码标准中定义.
注意: c ++有一个类似的主题,但没有真正有用的答案.
通常建议将模块资产存储在模块的目录内,moduleName/public(或者您想要命名资产目录的任何内容).
遗憾的是,Zend Framework 2 默认不支持模块资产的资产发布.根据MWOP,大约1个月前没有任何计划,我猜仍然没有真正的计划(他们可能需要做很多工作才能准备好稳定的版本).(但是,有一天,他们将解决这个问题.)
随着我的ZF2应用程序不断发展壮大,我达到了需要特定模块资产的地步.目前,我将它们保存在模块目录中并将它们复制到应用程序的公共目录中.你可以想象这种方法容易出错且令人筋疲力尽.
你怎么处理这个问题?是否有一个简单的解决方案可以解决这个问题?我的项目计划不允许我自己创建复杂的资产处理.是否有与ZF2兼容的值得推荐的轻量级资产框架?我已经考虑过创建符号链接,但我认为这不是最好的解决方案,因为它需要一些额外的Web服务器配置(FollowSymlinks)和额外的维护工作(应用程序在本地开发并部署在远程服务器上).
提前致谢.
我已经为一个特殊的,复杂的目的创建了一个新的表单元素类(带有附加按钮的文本输入字段,用于打开"搜索向导"弹出窗口).
为了正确呈现这个元素,我还创建了一个表单视图助手.一切正常,到目前为止还不错.
但是,如果我尝试使用FormCollection视图助手渲染表单,则该元素将呈现为基本输入元素.这是因为FormCollection助手依赖的FormElement视图助手使用硬编码的if子句系列将元素的类型映射到特定的表单视图助手.它无法映射我的元素类,因此可以回归FormInput.
即(取自Zend/Form/View/Helper/FormElement.php,第41-49行):
if ($element instanceof Element\Button) {
$helper = $renderer->plugin('form_button');
return $helper($element);
}
if ($element instanceof Element\Captcha) {
$helper = $renderer->plugin('form_captcha');
return $helper($element);
}
...
$helper = $renderer->plugin('form_input');
return $helper($element);
Run Code Online (Sandbox Code Playgroud)
等等.
我有点卡在这里,因为这种架构并没有真正提升可扩展性.
我想到的唯一解决方案(除了手工渲染表单)是扩展FormElement视图助手类,从而创建我自己的CustomFormElement视图助手.但是,由于其复杂性,我将自定义元素放入自己的模块中.所以我必须动态编写这个CustomFormElement助手来添加来自任何模块的自定义元素.我不认为这是推荐的程序.
还有其他解决方案,或者甚至是我的完整方法未经推荐?提前致谢!
php ×6
assets ×1
coding-style ×1
comparison ×1
gnupg ×1
linux ×1
module ×1
namespaces ×1
oop ×1
viewhelper ×1
zend-form ×1