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
.
中渲染它
由于 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
.