使用 zend expressive 在 Zend\Form\Annotation\AnnotationBuilder 构建的表单上注入动作依赖

inject dependency in action on form built with Zend\Form\Annotation\AnnotationBuilder with zend expressive

我正在尝试用学说替换 the zend expressive album tutorial 中的 Zend_Db 用法。 最重要的是,我想用 zend form 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!';
    }
    ...
  }
}

这是需要的,因为 "handle action" 的用法。 如果表单验证发生错误,则调用下一个中间件。 现在,提取并显示表单元素的错误消息 if ($this->albumForm->getMessages()) {

这正是我的问题。我让表单正常工作,但是当调用下一个中间件时 Album\Action\AlbumUpdateHandleAction::class 我的表单是空的,因为我在两个中间件中都生成了它 "from scratch" 。 我需要做的是将我的 annotationuilder 构建形式定义为依赖项并将其注入中间件或将其从一个中间件传递到另一个中间件。

但我不知道如何实现。 欢迎任何想法!

我希望,我已经说清楚了。 我必须承认,我对 zend expressive 和相关概念还很陌生。 提前致谢, LT

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

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

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

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

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