【问题标题】:Laravel 5.8 redirect back with message not passing the message to the front endLaravel 5.8 重定向回来,消息未将消息传递到前端
【发布时间】:2023-03-03 18:07:01
【问题描述】:

我在方法末尾有一个带有此重定向的控制器:

    // Setup Response message
    $msg = [
        'type' => 'success',
        'value' => 'Your action was successful',
    ];

    return redirect()->back()->with('message', $msg);

响应如下所示:

array:5 [▼
  "_flash" => array:2 [▶]
  "_token" => "stMmai4OuWI2QlhYGNzxSDyb1qINLfD3RWsoM8mx"
  "_previous" => array:1 [▶]
  "url" => []
  "login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d" => 2
]

我不知道是什么导致消息没有闪现到会话中。

如果我这样做:

session()->flash('message', $msg);

dd(session()->all()); 

    // Setup Response message
    $msg = [
        'type' => 'success',
        'value' => 'Your action was successful',
    ];

    return redirect()->back()->with('message', $msg);

在重定向之前,会话包含消息。

我什至将两条路由(POST 和 GET)移到所有 Auth 组/中间件之外,结果相同。

什么可以清除会话消息?

【问题讨论】:

  • 请你试试return redirect()->back()->with($msg);
  • 嗨@dparoli,没有区别。这可能是 NGINX 设置问题吗?
  • 这应该将变量 $msg 传递给视图而不是会话
  • @TheRealPapa, session()->flash()session()->put() 做同样的事情,只是它使会话仅可用于下一个请求。
  • 嘿Udo,你是对的!我做了php artisan optimize:clear,然后用redirect()->back()->with('message', $msg); 成功了。谢谢!

标签: php laravel session laravel-5.8


【解决方案1】:

@Udo 是对的,这似乎是 Laravel 5.8 的变化。这有效:

redirect()->back()->with('message', $msg);

【讨论】:

  • 很高兴知道它现在有效。我的回答给出了更多的见解。虽然不是重点 - 这就是我删除它的原因。
  • @TheRealPapa 所以这只有在你做了 php artisan optimize:clear?
【解决方案2】:

试试return redirect()->back()-withErrors('message', $msg)

编辑:您在这里使用 ErrorBag - 也许这有效,因为它似乎正在杀死您的会话闪存。

问候 延斯

【讨论】:

  • 请解释一下:您在哪里发现 with() 不适用于 back()?
  • 通常它应该工作 - 我应该更准确 - 你是对的。我想说的是,如果他使用 withErrors(),他会使用不同的方式(ErrorBag)。他可以看到正在清除的东西是会话闪存......
  • @TheRealPapa:您在开发环境中使用 DebugBar 吗?你能在那边看到你的消息吗?
  • Yes Debugbar 正在显示没有消息的会话,根据我上面的 dd。问题是什么可以抹去它?
  • 嗨@jtwes,感谢您的帮助。这最终奏效了:redirect()->back()->with('message', $msg);
【解决方案3】:

将数据刷新到当前会话的更好方法是使用全局 session() 助手。使用此方法,您的代码应如下所示:

    $msg = [
        'type' => 'success',
        'value' => 'Your action was successful',
    ];

    session()->put('message', $msg);
    return redirect()->back();

注意

使用with(['message' => $msg]) 重定向回将变量$message 传递到viewroute。因此,您可以在重定向到的视图中使用该变量名访问它。

另一方面,使用session()->put('message', $msg);session()->flash('message', $msg); 都会将带有message 键的数据闪入当前用户会话。所以你可以使用session()->get('message')访问会话数据

更新

根据我的研究,从 Laravel 5.8 版开始,我认为 withInput() 现在保留用于请求数据(即数据通过 GETPOST 请求传递给您的控制器)和with() 保留用于通过route($route)->with()view($view)->with() 将数据传递到路由视图

因此,您的代码问题可能是新更新 - 版本 5.8 中的更改

【讨论】:

  • 嗨@Udo,没有区别
  • 嗨,Udo,我多年来一直在使用我的语法。在这个特定的项目上不是。所以问题是可能是什么原因。您的建议是当 Laravel 有此方法时手动设置会话。
  • withInput() 将数据闪存到会话而不是视图
  • @dparoli,你是对的。但我根本不应该将它用于除 GET 或 POST 请求数据之外的任何其他数据。查看我的更新。
  • with() 和 withInput() 都在 RedirectResponse 类中定义,它们不限于路由或视图
【解决方案4】:

我有同样的问题,我的代码如下所示,我之前在 try 缓存块中有一个数据库操作,我删除并且传递的数据不再工作,经过多次试验,我意识到我有数据库事务,所以我删除了它们,会话/闪存数据redirect()->back()->with($inputArray); 开始工作

        DB::beginTransaction();
        try {
            if ($coupon == null) {
                $this->results['failure'] = __('messages.failure_coupon_is_invalid');
                return redirect()->back()->with($this->results);
            }

            setHasDiscount($coupon);
            $this->results['success'] = __('messages.success_coupon_applied');
            DB::commit();

            return redirect()->back()->with($this->results);
        } catch (Exception $exception) {
            DB::rollBack();
            $this->results['failure'] = $exception->getMessage();
            return redirect()->back()->with($this->results);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2016-09-19
    • 2016-07-15
    • 2016-04-06
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多