我打算在Laravel 5.7中编程一个小商店。目前,在将已放入购物车中的商品数量传递到应用程序的标题时遇到了一些麻烦。由于我需要将此值作为可用于所有路径和视图的全局变量,因此将其放入自定义配置文件 cartItems.php 中。看起来像这样:
return [
'cartItems' => NULL
]
现在,每当有项目推入购物车时,我都希望更新该变量。这是由我的 CartController 中的setCart方法完成的:
public function setCart (ValidateQtyForm $request)
{
$cart = $this->setItems($request); // trait where items are defined
$cartItems = config('cartItems.cartItems');
foreach ($cart as $item) {
if ($item['amt'] >> 0) {
$cartItems += $item['amt'];
}
}
config(['cartItems.cartItems' => $cartItems]);
return view('pages.cart', compact('cart'));
}
然后,我可以从配置文件中将购物车商品的数量拉到我的标题:
<header>
<div id="cart">
<a href="{!! route('cart') !!}">
<figure>
<img src="/img/layout/Einkaufswagen.svg">
</figure>
<div>{!! config('cartItems.cartItems') !!}</div>
</a>
</div>
</header>
现在,对于购物车视图而言,目前为止可以正常使用。 但是,一旦我转到应用程序的另一个视图(无论是商店页面,主页还是其他页面),购物车商品的数量便再次为NULL。 回到购物车,仍然是应该的。 似乎仅在我的购物车视图中更改了配置文件中的值,而在其他所有视图中都没有更改,对吗? 那我该如何更改此值并使所有视图都可以访问此更改?
出于完整性考虑,这是我的包含路由的web.php文件:
// PAGES //
Route::get('/', 'AppController@showStart');
Route::get('/startseite', 'AppController@showStart')->name('start');
Route::view('/galerie', 'pages.gallery')->name('gallery');
// SHOP //
//*** Products ***//
Route::get('/items', 'ShopController@getShopItems');
Route::get('/shop', 'ShopController@showShopItems')->name('shop');
Route::post('/warenkorb', 'CartController@setCart')->name('set_qty');
//*** Cart***//
Route::get('/warenkorb', 'CartController@setCart')->name('cart');
Route::post('/bestellung', 'CartController@cartAction')->name('cart_post');
//*** Order ***//
Route::get('/bestellung', 'CartController@cartAction')->name('order_get');
Route::post('/abschluss', 'OrderController@orderProcessTransaction');
非常感谢,感谢您对此问题的帮助!
答案 0 :(得分:0)
我建议使用session()
而不是config()
(请参阅documentation)。这将设置当前用户会话的购物车项目。
config()
助手的目的是在运行时(例如数据库连接)覆盖配置设置。
不建议使用config()
保存购物车商品,因为这意味着对您的应用程序的下一个请求将没有在前一个运行时设置的数据。
保存到会话:
session(['cartItems' => $cartItems]);
要检索会话数据:
session('cartItems');
要做的另一点是,使用laravel刀片,您可以设置一个全局变量,该变量可以在所有路线上使用。这是通过View::composer
完成的,建议您在appServiceProvider.php
方法中的服务提供商(例如->boot()
)中进行设置:
View::composer('*', function($view)
{
$view->with('cartItems', session('cartItems'));
});