Загрузочная переменная Laravel не определена в контроллере

У меня есть переменная, которая устанавливает все мои представления в AppServiceProvider, когда я использую эту переменную в контроллере, она говорит:

Undefined variable

Код

AppServiceProvider.php

View::composer('*', function ($view) {
    $ProductSettings = ProductSetting::all();
    foreach($ProductSettings as $psetting){
      $show_unavailable = $psetting->show_unavailable;
      $show_quantities = $psetting->show_quantities;
      $product_pagination = $psetting->pagination;
      $max_short_desc = $psetting->max_short_desc;
      $allow_delivery_time = $psetting->allow_delivery_time;
      $addtocart_on_attribute = $psetting->addtocart_on_attribute;
      $outofstock_lable = $psetting->outofstock_lable;
      $product_orderby = $psetting->orderby;
    }

    $view->with('show_unavailable', $show_unavailable);
    $view->with('show_quantities', $show_quantities);
    $view->with('product_pagination', $product_pagination);
    $view->with('max_short_desc', $max_short_desc);
    $view->with('allow_delivery_time', $allow_delivery_time);
    $view->with('addtocart_on_attribute', $addtocart_on_attribute);
    $view->with('outofstock_lable', $outofstock_lable);
    $view->with('product_orderby', $product_orderby);
});

Контроллер

//codes...

$products = Product::whereHas('categories', function ($query) use ($slug) {
  $query->where('slug', $slug);
})->paginate($product_pagination);

//codes...

Основываясь на значениях моей базы данных, для product_pagination установлено значение 12, что означает, что мой код выглядит так: ->paginate(12);

Вопрос

Любая идея, почему я получаю неопределенную ошибку?

Обновлять

table

Загрузочная переменная Laravel не определена в контроллере

Не уверен, но может быть потому, что $view->with не дает контроллеру переменную?

JustCarty 25.02.2019 09:55

«Посмотреть композиторов» звучит так, как будто они делают переменные доступными только в... представлениях. Вы запускаете этот запрос в представлении?

brombeer 25.02.2019 09:55

@kerbholz некоторые из моих переменных, которые я запускаю в представлениях этой разбивки на страницы, в частности, мне нужно запускать в контроллерах

mafortis 25.02.2019 09:57

@JustCarty, у вас есть идея получше, чем я делаю один и тот же цикл в каждом из моих контроллеров?

mafortis 25.02.2019 09:58

Кроме того, ваш цикл модели в AppServiceProvider не имеет особого смысла, потому что вы устанавливаете переменные в цикле, но назначаете их только представлению после цикла, что означает, что используется только последнее вхождение (последняя строка)...

JustCarty 25.02.2019 09:58

Сделайте их доступными в «родительском» контроллере, расширьте свои контроллеры от этого контроллера, чтобы они были доступны в каждом из ваших контроллеров.

brombeer 25.02.2019 10:00

@JustCarty Чтобы ответить на первый вопрос: это имеет смысл, поскольку в моей таблице есть только 1 строка. Чтобы ответить на второй вопрос, я обновлю свой вопрос для вас.

mafortis 25.02.2019 10:03

@kerbholz как...?

mafortis 25.02.2019 10:03

@JustCarty обновлено. PS эта таблица никогда не получает строку 2, она получает только обновления (редактирование), даже не может быть удалена, поэтому создание цикла имеет для меня смысл, потому что таким образом я использую только простую переменную в лезвии, что-то вроде <php wp_title ?> в wordpress.

mafortis 25.02.2019 10:06

О какой переменной ошибка говорит, что она не определена?

George Hanson 25.02.2019 10:07

@GeorgeHanson в данный момент product_pagination

mafortis 25.02.2019 10:07

Тогда не нужно зацикливаться... Просто установите ProductSettting::first() переменную, а затем получите к ней доступ. Например. $psetting = ProductSetting::first(); тогда $view->with('show_unavailable', $psetting->show_unavailable);

JustCarty 25.02.2019 10:08

@JustCarty выдает ту же ошибку

mafortis 25.02.2019 10:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
13
419
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на комментариях, я собираюсь предположить, что это сработает:

$products = Product::whereHas('categories', function ($query) use ($slug) {
    $query->where('slug', $slug);
})->paginate(ProductSetting::first()->pagination);

Поскольку у вас всегда есть только одна строка в вашей таблице product_settings, вы можете просто получить доступ к первой строке этой таблицы, оттуда вы можете получить доступ к любым столбцам, которые вам нужны.


Изменить 1

Судя по ответу, вышесказанное "слишком длинное".
Единственная другая альтернатива, которую я имею для этого вопроса, заключается в следующем:

App::singleton('product_settings', function () {
    return ProductSetting::first();
});

Напишите этот метод внутри AppServiceProvider (или любого провайдера по вашему выбору), внутри метода boot.

Затем это можно использовать в любом месте со следующим кодом:

app('product_settings')->pagination;
// or, more simply:
app('product_settings')-><some column name>;

Если вы считаете, что существует код все еще слишком много, вы можете зарегистрировать исходные переменные в том же формате с помощью метода singleton и просто добавить -><some column name> после первого вызова метода.


Редактировать 2

Приведенное выше редактирование ничем не отличается от исходного решения и по-прежнему будет выполнять запросы при каждом вызове метода app.

Если вы хотите, чтобы вызовы базы данных были по одному на каждый контроллер, вы можете сохранить ProductSetting::first() в BaseController:

class BaseController extends \Controller
{

    protected $product_settings;

    public function __construct() 
    {
        // Fetch the Site Settings object
        $this->product_settings = ProductSetting::first();
    }

}

Затем в каждом контроллере вы можете вызвать $this->product_settings->pagination.

Я знаю, что это может произойти таким образом, причина, по которой я пытался получить значение в AppServiceProvider, заключалась в том, чтобы не включать мою модель во все контроллеры, которым мне нужно это значение, и иметь длинные коды, такие как ProductSetting::first()->pagination у вас есть решение для получения этого значения только с простой переменной?

mafortis 25.02.2019 10:16

это singleton должен ли я использовать его в appserviceprovider или при создании нового промежуточного программного обеспечения и т. д.?

mafortis 25.02.2019 10:28

@mafortis Ради интереса, какой из трех методов вы выбрали? Изменить 1?

JustCarty 25.02.2019 10:34

в настоящее время я использую решение 1 по двум причинам: 1 я читал singleton в некоторых случаях будут возвращать значения повторно, например, фу будет фуууу2 я также читал, что не рекомендуется передавать переменные в basicController, как это предусмотрено laravel доля просмотров по той же причине. PS очевидно, что viewShare работает только с блейд-шаблонами, а не с контроллерами.

mafortis 25.02.2019 10:38

Другие вопросы по теме