【问题标题】:Laravel 5: Unable to pass data to controller via redirectLaravel 5:无法通过重定向将数据传递给控制器
【发布时间】:2015-06-30 21:49:08
【问题描述】:

我正在尝试将查询生成器传递给查看,并且我想打印它。查询生成器不返回null,但我无法传递或打印它。

控制器

public function search() {
    $option1 = Request::get( 'option1' );
    $option2 = Request::get( 'option2' );
    $condition = Request::get( 'condition' );
    $date_option = Request::get( 'dateOption' );
    $option1_value = Request::get( 'option1_value' );
    $option2_value = Request::get( 'option2_value' );
    $fromDate = Request::get( 'fromDate' );
    $toDate = Request::get( 'toDate' );

    if ( $condition == 'no' ) {
        $vehicles = Vehicle::with( 'brand', 'section', 'representive', 'buyer', 'seller', 'buyingPaymentType', 'sellingPaymentType' )->where( $option1, $option1_value )->get();
        //return $vehicle;
    }
    if ( $condition == 'or' ) {
        $vehicles = Vehicle::with( 'brand', 'section', 'representive', 'buyer', 'seller', 'buyingPaymentType', 'sellingPaymentType' )->where( $option1, $option1_value )->orWhere( $option2, $option2_value )->get();
    }
    if ( $condition == 'and' ) {
        $vehicles = Vehicle::with( 'brand', 'section', 'representive', 'buyer', 'seller', 'buyingPaymentType', 'sellingPaymentType' )->where( $option1, $option1_value )->where( $option2, $option2_value )->get();
    }

    return  redirect()->back()->with( 'vehicles', $vehicles );
    //return $vehicles;
}

查看

@if(isset($vehicles))
    @foreach($vehicles as $vehicle)
        <td>{{ $vehicle->id }}</td>
    @endforeach
@endif

我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 我很难看到你想要做什么。如果您正在尝试构建搜索表单并显示结果,请改用 GET 路由,这样您就不必重定向,可以将 URL 加入书签等。
  • @MartinBean,OP 正在尝试通过重定向传递其他数据。这可能是也可能不是表单提交数据的一部分。假设您正在登录一个用户,如果成功,您正在将除 user 对象(例如,与该 user 关联的 vehicle 对象)之外的一些额外数据传递到下一页。
  • @ArmanH 它在我看来就像一个搜索表单,根据传递的选项构建一个查询。如果它是一个登录表单,忽略它的字段太多,为什么 OP 不直接根据经过身份验证的用户 ID 查询数据库?
  • 这个特定示例的细节与如何通过重定向将数据从控制器传递到控制器这一更广泛的问题无关紧要。为什么 OP 做 A 而不是 B,由他来回答。

标签: php laravel laravel-5 url-redirection


【解决方案1】:

使用重定向时可以使用会话

@if(Session::has('vehicles'))
    @foreach(Session::get('vehicles') as $vehicle)

    @endforeach
@endif

【讨论】:

    【解决方案2】:

    redirect() 方法上使用with('vehicles', $vehicles) 重定向会创建vehicles 会话闪存消息,而不是将数据传递给下一个控制器(请参阅Laravel 5.1 Redirect Documentation)。

    It seems that you can't send variables per se,因此您将不得不依赖会话数据。

    您可以使用session-&gt;has('vehicles')session-&gt;('vehicles') 助手测试是否在您的视图中设置了flash 消息:

    @if(session()->has('vehicles')))
        {{ session('vehicles') }}
    @endif
    

    由于您的 $vehicles 是一个复杂的对象,您必须检查 Laravel 如何将其序列化到会话中,并且可能需要在循环遍历这些项目之前对其进行反序列化。

    【讨论】:

    • 您误解了您链接到的文档。 with() 将数据闪烁到会话中,这通常用于闪烁消息,但也用于您希望闪烁的任何其他数据。他的数组将被正确序列化。正如我在回答中指出的那样,如果他想使用局部变量访问它,他只需要将它从会话中读回变量。
    • @Rob_vH 我不确定我的误解在哪里,但感谢您重申 2 个现有答案。
    • "session flash message" -- 将变量闪现到会话(可用于消息,但不是特别针对它们)。然后,他可以使用 Session::get() 将它们从另一端取出。序列化是隐式的,通过这种方式,您可以在其中存储一个数组并在另一端将其放回。
    【解决方案3】:

    问题在于,虽然您已将 $vehicles 数组闪存到会话中(它与您的代码一样正常工作),但您永远不会将其读回。我认为您希望将某些内容放入会话中会在下一次加载时自动将其放回变量中,但事实并非如此。

    相反,您需要从会话中读取变量。比如:

    和以前一样:

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

    然后无论前面的路由被处理到哪里,你都可以读取会话并检查它是否为空;

    $vehicles = \Session::get('vehicles');
    

    然后你就可以像往常一样使用它了。正如 Elvin 向您展示的那样,您还可以直接从 Blade 模板访问会话变量。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      相关资源
      最近更新 更多