在 Zend Expressive 2 中编写自定义助手
Writing Custom Helpers in Zend Expressive 2
我正在编写自定义助手,一切正常。
但我不知道如何传递参数...
于 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 () 传递参数来构建我的 class?
谢谢!
__invoke
是每当您在视图中使用助手时都会调用的函数。我应该只从视图中获取你需要的任何东西作为参数。
数组 $opts
中应该包含什么?如果你需要向这个对象中注入一些东西(你的最后一个问题),那么你肯定需要使用构造函数。
您收到的错误来自于您的 View Helper 被声明为 Invokable
(class,构造函数中没有参数),因此服务管理器试图在不添加参数的情况下创建它。你应该做的是把它搬到工厂。
'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
,因此,寻找在 main ServiceManager
中声明的服务(配置数组中的 service_manager
)将需要对 HelperPluginManager
:
进行额外调用
public function __invoke(HelperPluginManager $viewHelperContainer) : HelperDatetimeFormat
{
$params = $viewHelperContainer->getServiceLocator()->get('config')['my_params'];
return new HelperDatetimeFormat($params);
}
我正在编写自定义助手,一切正常。 但我不知道如何传递参数...
于 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 () 传递参数来构建我的 class?
谢谢!
__invoke
是每当您在视图中使用助手时都会调用的函数。我应该只从视图中获取你需要的任何东西作为参数。
数组 $opts
中应该包含什么?如果你需要向这个对象中注入一些东西(你的最后一个问题),那么你肯定需要使用构造函数。
您收到的错误来自于您的 View Helper 被声明为 Invokable
(class,构造函数中没有参数),因此服务管理器试图在不添加参数的情况下创建它。你应该做的是把它搬到工厂。
'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
,因此,寻找在 main ServiceManager
中声明的服务(配置数组中的 service_manager
)将需要对 HelperPluginManager
:
public function __invoke(HelperPluginManager $viewHelperContainer) : HelperDatetimeFormat
{
$params = $viewHelperContainer->getServiceLocator()->get('config')['my_params'];
return new HelperDatetimeFormat($params);
}