使用Zend表达式在Zend \ Form \ Annotation \ AnnotationBuilder构建的表单上注入依赖关系

时间:2016-09-21 12:17:39

标签: zend-framework annotations zend-form zend-expressive

我正在尝试将the zend expressive album tutorial中的Zend_Db用法替换为doctrine。 最重要的是,我想删除带有zend形式annotationbuilder构建的表单的album form and form factory。 我让annotationbuilder工作并收到一份工作表。

在本教程中,表单在album.global.config中定义为依赖项:

<?php
return [
  'dependencies' => [
    'factories' => [
      ...     
      Album\Form\AlbumDataForm::class =>
      Album\Form\AlbumDataFormFactory::class,
      ...
    ],
  ],
  'routes' => [
    ...
    [
        'name'            => 'album-update-handle',
        'path'            => '/album/update/:id/handle',
        'middleware'      => [
            Album\Action\AlbumUpdateHandleAction::class,
            Album\Action\AlbumUpdateFormAction::class,
        ],
        'allowed_methods' => ['POST'],
        'options'         => [
            'constraints' => [
                'id' => '[1-9][0-9]*',
            ],
        ],
    ],
    ...
  ],
];

...并注入操作AlbumUpdateFormAction.phpAlbumUpdateFormHandleAction.php

<?php
...
class AlbumUpdateFormAction
{
  public function __construct(
    TemplateRendererInterface $template,
    AlbumRepositoryInterface $albumRepository,
    AlbumDataForm $albumForm
  ) {
    $this->template        = $template;
    $this->albumRepository = $albumRepository;
    $this->albumForm       = $albumForm;
  }
  public function __invoke(
    ServerRequestInterface $request,
    ResponseInterface $response,
    callable $next = null
  ) {
    ...
    if ($this->albumForm->getMessages()) {
      $message = 'Please check your input!';
    } else {
      $message = 'Please change the album!';
    }
    ...
  }
}

由于使用了“句柄动作”,因此需要这样做。 如果表单验证中发生错误,则调用下一个中间件。 现在,提取表单元素的错误消息并显示if ($this->albumForm->getMessages()) {

这正是我的问题。我得到了表单的工作,但是当下一个中间件被调用Album\Action\AlbumUpdateHandleAction::class时,我的表单是空的,因为我在两个中间件中“从头开始”生成它。 我需要做的是将我的annotationuilder构建的表单定义为依赖项并将其注入中间件或将其从一个中间件传递给另一个中间件。

但我不知道如何做到这一点。 任何想法都非常受欢迎!

我希望,我已经清楚了。 我必须承认,我对表现力和相关概念都很陌生。 提前致谢, LT

1 个答案:

答案 0 :(得分:0)

zend-expressive概念是关于中间件的。您在行动中做什么以及如何做事完全取决于您。由于您可以自由使用任何符合您需求的解决方案,因此没有设置规则或最佳实践来处理表单。使用更新和句柄操作是众多可能性之一。

将数据传递给以下中间件可以做的是将其注入请求中:

return $next($request->withAttribute('albumForm', $albumForm), $response);

我已经在here上解释了这个概念。

此外,您可以尝试一个更简单的概念,看看是否符合您的要求。 您可以将AlbumUpdateHandleAction和AlbumUpdateFormAction合并到AlbumUpdateAction中。这样您就不需要将数据传递给下一个中间件,因为所有相关任务都在同一个操作中处理。