我正在编写自定义助手,一切正常。 但我不知道如何传递参数...
在config / autoload / templates.global.php
上return [
'dependencies' => [
'factories' => [
TemplateRendererInterface::class => ZendViewRendererFactory::class,
HelperPluginManager::class => HelperPluginManagerFactory::class,
],
],
'templates' => [
'layout' => 'layout::default',
],
'view_helpers' => [
'invokables' => [
'HelperDatetimeFormat' => HelperDatetimeFormat::class,
],
// zend-servicemanager-style configuration for adding view helpers:
// - 'aliases'
// - 'invokables'
// - 'factories'
// - 'abstract_factories'
// - etc.
],
];
我有另一个:
namespace App\Helper;
use Locale;
use DateTime;
use IntlDateFormatter;
class HelperDatetimeFormat
{
private $opts;
private $lang;
public function __invoke(array $opts)
{
$this->opts = $opts;
return $this->datetimeFormat();
}
public function datetimeFormat()
{
...
如果我使用构造函数,我会收到错误...是否建议使用__invoke()传递参数来构建我的类?
谢谢!
答案 0 :(得分:2)
__invoke
是在视图中使用助手时将调用的函数。我应该只从视图中获取您需要的任何参数。
数组$opts
应该是什么?如果你需要在这个对象中注入一些东西(你的最后一个问题),那么你肯定需要使用构造函数。
您收到的错误来自View Helper声明为Invokable
(构造函数中没有参数的类),因此服务管理器正在尝试创建它而不添加参数。你应该做的是把它搬到工厂。
'view_helpers' => [
'aliases' => [
'HelperDatetimeFormat' => HelperDatetimeFormat::class,
],
'factories' => [
HelperDatetimeFormat::class => HelperDatetimeFormatFactory::class,
],
],
工厂类似于:
final class HelperDatetimeFormatFactory
{
public function __invoke(ContainerInterface $container) : HelperDatetimeFormat
{
$params = $container->get('config')['my_params'];
return new HelperDatetimeFormat($params);
}
}
请注意,此代码更适用于ZF3。如果我认为在工厂中传递给__invoke
的参数实际上是HelperPluginManager,那么ServiceLocatorInterface
致力于查看助手,因此,寻找在主ServiceManager
中声明的服务(配置数组中的service_manager
)将需要HelperPluginManager
上的额外调用:
public function __invoke(HelperPluginManager $viewHelperContainer) : HelperDatetimeFormat
{
$params = $viewHelperContainer->getServiceLocator()->get('config')['my_params'];
return new HelperDatetimeFormat($params);
}