Laravel将变量从FirstController传递给SecondController

时间:2016-07-01 14:02:34

标签: php laravel model-view-controller laravel-5

这是我在两个视图上传递变量的两条路线。

Route::resource('product', 'ProductController');
Route::resource('booking', 'BookingController');

我使用ProductController创建了一个显示当前产品(例如http://localhost:8000/product/15)的视图。

现在我创建了另一个视图来预订此产品,然后使用@include('partials.booking')在产品视图中插入它(模式弹出)。

问题是如何将产品ID传递给BookingController?有可能吗?

2 个答案:

答案 0 :(得分:1)

这很大程度上取决于您在前端使用的框架(jquery等)

通常你的弹出窗口应该知道它所引用的产品。您可以这样做,例如

<!-- this is your html / blade -->
<div class="booking-popup">
  <button class="book" data-product="{{$product->id}}">Book Now!</button>
</div>

然后,您可以使用ajax和jquery来获取数据属性

另一个选择是提供一个带有隐藏字段的表单

<form action="/booking" method="post">
   {{csrf_field()}}
   <input type="hidden" name="product_id" value="{{$product->id}}" />
   <input type="submit" value="Book Now!" />
</form>

如果您使用laravel html集合,则可以进一步简化

修改

由于您的预订实际上属于某个产品,您还可以重新安排资源,以便使用路线创建预订

/product/5/booking (POST)

然后,您只需将产品ID作为路径参数

即可

编辑2 只需从控制器访问它(hidde表单输入的情况)

public function store(\Illuminate\Http\Request $request) {
  dd($request->input('product_id');
}

如果您通过路线定义它,只需选择您设置为占位符的任何内容

Route::post('product/{product}/book', 'BookingController@store');
然后

控制器:

public function store(\Illuminate\Http\Request $request, $product) {
   dd($product)
}

答案 1 :(得分:1)

将您的模型页面包含为@include('partials.booking', ['product'=>$product])

将表单操作更改为 如果您的CSRF中间件已启用,则<form action="{{url('product/'.$product->id.'/booking')}}" method="post">并且最重要的是添加_token隐藏字段。

将您的路线更改为 Route::post('product/{product_id}/booking', 'BookingController@store');