由于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
我将尽力提供更多的代码示例,但是由于这是工作中的问题,我可能对此有一些疑问。
谢谢!
答案 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/
管道:
在您的代码中,我看不到没有通过$ data的任何原因。我的猜测是,模板以某种方式在IndexAction
中呈现,该模板没有$ data但设置了error
。您可以检查一下。这里的困惑在于您通过2个不同的动作来渲染相同的模板。使用我提到的解决方案,您只需要在IndexAction
中进行渲染即可。