0

PHP バージョンの制約により、Zend Expressive 2 を使用しています。パイプライン (IndexAction) のステップ 1 で変数を返すと、変数は正常に表示されます。

次のステップ (VerifyInputAction) に委譲し、入力にエラーがあると判断した場合は、ビュー スクリプトにエラーを返す必要があります。何らかの理由で、テンプレート レンダラーで渡す変数を使用しません。$data 配列変数ではなく、テンプレートをロードします。

テンプレート レンダラーとして Zend View を使用しています。

私のパイプラインは次のようになります。

インデックスアクション()

    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

より多くのコード例を提供するために最善を尽くしますが、これは仕事上の問題であるため、問題が発生する可能性があります。

ありがとう!

4

1 に答える 1

0

最後に実行されたミドルウェアが応答を返しませんでした。メソッド: POST パス: /<--path-->/ .Handler: Zend\Expressive\Middleware\LazyLoadingMiddleware

アクションは応答を返す必要があります。有効なcsvファイルがないVerifyInputaction場合、応答を返しません。これはあなたのケースで発生し、$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

于 2019-05-01T21:39:32.750 に答える