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

时间:2019-05-01 16:04:57

标签: php zend-framework zend-view zend-expressive

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

如果我委托下一步(VerifyInputAction)并确定输入中存在错误,则需要返回错误以查看脚本。出于某种原因,它不会带走模板渲染器传递的变量。仍然会加载模板,只是不使用$ 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'));
        }
    }

VerifyInputaction()

    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

我将尽力提供更多的代码示例,但是由于这是工作中的问题,我可能对此有一些疑问。

谢谢!

1 个答案:

答案 0 :(得分:0)

  

上次执行的中间件未返回响应。方法:POST路径:/ <-path-> / .Handler:Zend \ Expressive \ Middleware \ LazyLoadingMiddleware

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

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

管道:

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

在您的代码中,我看不到没有通过$ data的任何原因。我的猜测是,模板以某种方式在IndexAction中呈现,该模板没有$ data但设置了error。您可以检查一下。这里的困惑在于您通过2个不同的动作来渲染相同的模板。使用我提到的解决方案,您只需要在IndexAction中进行渲染即可。