【问题标题】:Undefined variable in blade after redirect重定向后刀片中的未定义变量
【发布时间】:2020-12-04 07:07:59
【问题描述】:

我正在使用 Laravel 7 和 PHP 7.4。

我的项目中有表格。用户可以提交表单,我可以生成用户提供的值的报告。最初的问题是表单在页面刷新时重新提交,这是不可取的。我试图用 redirect-> 阻止它,但问题是我无法将变量从控制器获取到我的视图中。

这是我的刀片上的错误。

Undefined variable: seller

控制器

 $seller = Sellers::take(1)->latest()->get();
 return redirect()->route('private_seller_report')->with(['seller' => $seller]);

刀片

@php
  $seller = Session::get('seller');
@endphp

    @foreach($seller as $row)
      <a href="#">{{$row->seller_name}}</a>
    @endforeach

所以我的最终目标是防止表单在刷新时提交。

【问题讨论】:

  • 确保这一点。名称路由private_seller_report 使用正确的页面,您尝试在其中捕获$seller 变量
  • @sta 这是我想要获取变量的 110% 正确且预期的页面。
  • 如果您使用 return redirect()-&gt;route('private_seller_report')-&gt;with(['seller' =&gt; $seller]); 。您需要在刀片中使用Session::get('seller');。这样就可以获取数据了。
  • 我认为它在您的会话中,例如 @foreach(session()-&gt;get('seller') as $row)

标签: php laravel laravel-7


【解决方案1】:

下面是一个示例,说明如何做到这一点。 -&gt;with() 方法不适用于此用途,但您可以改为在 route 方法中传递数据,如下所示:

Route::get('/first-route', static function() {
    return redirect()->route('second-route', ['data' => [1, 2, 3]]);
});

Route::get('/second-route', static function(\Illuminate\Http\Request $request) {
    return view('test-view', ['data' => $request->input('data')]);
})->name('second-route'); 

请记住,您正在重定向到另一个路由,因此您需要重定向到的路由才能将数据传递到视图中。在这个例子中,您可以看到我将[1, 2, 3] 传递给second-route,然后通过请求对象获取数据。然后我将它传递到second-route 的视图中。

如果我在second-route 中执行dd($request-&gt;input('data');,我会得到:

array:3 [
  0 => "1"
  1 => "2"
  2 => "3"
]

所以我最好的猜测是,在第一个路由重定向到下一个路由之后,您永远不会将数据传递到视图中。

更新: 花点时间阅读有关-&gt;with() 方法https://laravel.com/docs/7.x/redirects#redirecting-with-flashed-session-data 的文档并查看RedirectResponse.php 中代码的PHPDoc:Flash a piece of data to the session.

您可以在这里看到“flash”的用途:https://www.itsolutionstuff.com/post/laravel-5-implement-flash-messages-with-exampleexample.html

【讨论】:

  • 我很欣赏您的方法,但唯一的问题是我要发送的数据是数据库中的表。我不认为我可以将表值作为路由中的数据传递。
  • 你可以在路由和视图之间传递你想要的任何数据。数据库中的水合模型并不重要。它工作得很好。为了简单起见,我用[1, 2, 3] 做了这个例子,但你可以做['data' =&gt; Sellers::take(1)-&gt;latest()-&gt;get()],这样就可以了。路由重定向不会将您带到视图,而是控制器中的另一种方法,因此刀片文件中的Undefined variable: seller 错误告诉我它没有传递到视图中。我希望你能弄清楚。
【解决方案2】:

第一次你需要使用这个路由调用sellerPage方法。

Route::get('/seller/page','SellerController@sellerPage')->name('private_seller_report');

  public function sellerPage()
  {
    $seller = Sellers::take(1)->latest()->get()->toArray();
    return view('your.blade')->with(['seller' => $seller]);
  }

【讨论】:

  • 你没有听懂我的问题。我知道这种语法。但如果我喜欢这样,我的表单将在刷新时再次提交,这就是我不想看到的。
  • 第一次加载能看出来吗?
  • 是的,我可以看到。
  • @Shaan。尝试第二种解决方案
  • 你为什么要使用 Session。你不需要它
猜你喜欢
  • 2017-06-17
  • 2018-11-26
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2017-08-24
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多