Laravel 5.7 изменить пользовательский файл конфигурации в контроллере? - PullRequest
0 голосов
/ 18 марта 2019

Я собираюсь запрограммировать небольшой магазин в Laravel 5.7.В настоящее время у меня есть некоторые проблемы с передачей количества товаров, которые были помещены в корзину, в заголовок моего приложения.Поскольку мне нужно это значение как глобальной переменной, доступной для всех маршрутов и представлений, я поместил его в пользовательский файл конфигурации cartItems.php .Вот как это выглядит:

return [
    'cartItems' => NULL
]

Теперь, когда товар помещается в корзину, я хочу обновить эту переменную.Это делается с помощью метода setCart в моем CartController :

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

Большое спасибо, я ценю любую помощь в этом вопросе!

1 Ответ

0 голосов
/ 18 марта 2019

Я бы предложил использовать session() вместо config() (см. документация ).Это установит элементы корзины для сеанса текущего пользователя.

Цель помощника config() состоит в том, чтобы переопределить настроек конфигурации во время выполнения (например, соединение с базой данных).

Использование config() для сохранения элементов корзины не рекомендуется, так как это означает, что в следующем запросе к вашему приложению не будет данных, установленных в предыдущей среде выполнения.

Сохранение в сеансе:

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

Чтобы извлечь данные сеанса:

session('cartItems');

Еще один момент, который нужно сделать, это то, что с помощью лезвия laravel вы можете установить глобальную переменную , которая может бытьиспользуется на всех маршрутах.Это делается с использованием View::composer и рекомендуется для установки в рамках поставщика услуг (например, appServiceProvider.php) в методе ->boot():

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