在没有 GET/POST 请求参数的情况下将变量传递给自定义控制器中的模板

Passing variables to template in custom controller without GET/POST request params

我有一个特定的问题,我必须在自定义控制器中将变量传递给模板,但我无法使用 POSTGET 请求(原因是执行重定向的函数只发送GET 请求,我不希望最终用户看到参数)。

有没有办法设置全局变量并将其附加到上下文或会话?我也尝试过使用 RequestDataBag,但在重定向后我无法访问之前设置的数据。

这是我尝试做的事情:

public function pay(AsyncPaymentTransactionStruct $transaction, RequestDataBag $dataBag, SalesChannelContext $salesChannelContext): RedirectResponse
{
    $returnUrl = $transaction->getReturnUrl();

    $dataBag->add(['test' => 'test1']);

    return new RedirectResponse('/checkout/confirm/custom-controller');
}

并试图在控制器中捕获它:

public function cliffMarketsBerrySimplify(Request $request, SalesChannelContext $context, RequestDataBag $dataBag)
{
    $data = $dataBag->get('test');

    return $this->renderStorefront('@plugin/storefront/page/checkout/payment/custom-template.html.twig');
}

但是$data是空的。有没有其他方法可以解决这个问题。是否可以设置全局上下文变量或将变量附加到会话然后检索它?

我的 Shopware 6 自定义支付插件遇到了同样的问题,我使用会话来解决它。

首先在您的付款处理程序中注入 session,然后将您的变量存储在会话中:

public function pay(AsyncPaymentTransactionStruct $transaction, RequestDataBag $dataBag, SalesChannelContext $salesChannelContext): RedirectResponse
{
    $returnUrl = $transaction->getReturnUrl();

    $this->session->set('test', 'test1');

    return new RedirectResponse('/checkout/confirm/custom-controller');
}

然后从控制器中的会话中读取变量并将其传递给模板:

public function cliffMarketsBerrySimplify(Request $request, SalesChannelContext $context, RequestDataBag $dataBag)
{
    $data = $this->session->remove('test');

    return $this->renderStorefront(
        '@plugin/storefront/page/checkout/payment/custom-template.html.twig',
        ['data' => $data]
    );
}