Laravel 5.7 更改控制器中的自定义配置文件?

Laravel 5.7 change custom config file in Controller?

我正准备在 Laravel 5.7 中编写一个小商店。目前,我在将已放入购物车的商品数量传递到我的应用程序的 header 时遇到了一些麻烦。因为我需要这个值作为所有路由和视图可用的全局变量,所以我将它放入自定义配置文件 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:

<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');

非常感谢,感谢您对此问题的帮助!

我建议使用 session() 而不是 config()(参见 documentation)。这将为当前用户的 session.

设置购物车项目

config() 助手的目的是在运行时覆盖 配置设置(例如数据库连接)。

不推荐使用 config() 来保存购物车项目,因为这意味着对您的应用程序的下一个请求将没有上一个运行时的数据集。

保存到 session:

session(['cartItems' => $cartItems]);

要检索 session 数据:

session('cartItems');

另一点是,使用laravel blade,你可以设置一个全局变量,它可以在所有路由上使用。这是使用 View::composer 完成的,建议在 ->boot() 方法中的服务提供商(例如 appServiceProvider.php)中设置:

View::composer('*', function($view)
{
    $view->with('cartItems', session('cartItems'));
});