Zend Expressive 不传递变量来查看脚本

Zend Expressive not passing variables to view script

由于 PHP 版本限制,我正在使用 Zend Expressive 2。如果我在管道 (IndexAction) 的第一步中 return 变量,则变量看起来很好。

如果我委托到下一步 (VerifyInputAction) 并确定输入中有错误,我需要 return 一个错误来查看脚本。出于某种原因,它不会使用我通过模板渲染器传递的变量。它仍然会加载模板,只是不会使用 $data 数组变量。

我使用 Zend View 作为模板渲染器。

我的管道如下所示。

IndexAction()

    public function process(ServerRequestInterface $request, DelegateInterface $delegate)
    {
        if ($request->getMethod() !== "POST") {
            return new HtmlResponse($this->template->render('app::home-page', ['error' => 'hello']));
        } else {
            $delegate->process($request);
            //return new HtmlResponse($this->template->render('app::home-page'));
        }
    }

验证输入操作()

    public function process(ServerRequestInterface $request, DelegateInterface $delegate)
    {
        $data = [];

        $file = $request->getUploadedFiles()['recordsFile'];

        $fileType = substr($file->getClientFilename(), strpos($file->getClientFilename(), '.'));

        // If file type does not match appropriate content-type or does not have .csv extension return error
        if (! in_array($file->getClientMediaType(), $this->contentTypes) || ! in_array($fileType, $this->extensions)) {
            $data['error']['fileType'] = 'Error: Please provide a valid file type.';
            return new HtmlResponse($this->template->render('app::home-page', $data));
        }

        $delegate->process($request);
    }

另一个可能超出此问题范围的问题包括,当我进入管道中的下一个操作时,如果我去那里渲染视图脚本,我会收到此错误...

Last middleware executed did not return a response. Method: POST Path: /<--path-->/ .Handler: Zend\Expressive\Middleware\LazyLoadingMiddleware

我会尽力提供更多代码示例,但由于这是工作中的一个问题,我可能会遇到一些问题。

谢谢!

Last middleware executed did not return a response. Method: POST Path: /<--path-->/ .Handler: Zend\Expressive\Middleware\LazyLoadingMiddleware

一个动作需要return一个响应。在您的 VerifyInputaction 中,如果没有有效的 csv 文件,您不会 return 响应。我猜你的情况会发生这种情况并且 $delegate->process($request); 被触发,这可能不会调用另一个 return 中间件的动作。

查看您的代码,首先调用 VerifyInputaction 更有意义,检查它是否是 post 并验证。如果其中任何一个失败,请转到下一个操作 IndexAction。这可能会显示带有错误消息的表单。您可以按照此处的说明在请求中传递错误消息:https://docs.zendframework.com/zend-expressive/v2/cookbook/passing-data-between-middleware/

管道:

  • VerifyInputaction -> 检查 POST,验证输入 -> 如果成功则重定向
  • IndexAction -> 呈现模板和 return 响应

我在你的代码中没有看到没有传递 $data 的任何原因。我的猜测是模板以某种方式呈现在 IndexAction 中,它没有 $data 但设置了 error 。你可能会检查这个。这里的困惑在于您在 2 个不同的操作中呈现相同的模板。使用我提到的解决方案,你只需要在 IndexAction.

中渲染它