У меня есть переменная, которая устанавливает все мои представления в 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
«Посмотреть композиторов» звучит так, как будто они делают переменные доступными только в... представлениях. Вы запускаете этот запрос в представлении?
@kerbholz некоторые из моих переменных, которые я запускаю в представлениях этой разбивки на страницы, в частности, мне нужно запускать в контроллерах
@JustCarty, у вас есть идея получше, чем я делаю один и тот же цикл в каждом из моих контроллеров?
Кроме того, ваш цикл модели в AppServiceProvider не имеет особого смысла, потому что вы устанавливаете переменные в цикле, но назначаете их только представлению после цикла, что означает, что используется только последнее вхождение (последняя строка)...
Сделайте их доступными в «родительском» контроллере, расширьте свои контроллеры от этого контроллера, чтобы они были доступны в каждом из ваших контроллеров.
@JustCarty Чтобы ответить на первый вопрос: это имеет смысл, поскольку в моей таблице есть только 1 строка. Чтобы ответить на второй вопрос, я обновлю свой вопрос для вас.
@kerbholz как...?
@JustCarty обновлено. PS эта таблица никогда не получает строку 2, она получает только обновления (редактирование), даже не может быть удалена, поэтому создание цикла имеет для меня смысл, потому что таким образом я использую только простую переменную в лезвии, что-то вроде <php wp_title ?> в wordpress.
О какой переменной ошибка говорит, что она не определена?
@GeorgeHanson в данный момент product_pagination
Тогда не нужно зацикливаться... Просто установите ProductSettting::first() переменную, а затем получите к ней доступ. Например. $psetting = ProductSetting::first(); тогда $view->with('show_unavailable', $psetting->show_unavailable);
@JustCarty выдает ту же ошибку






Основываясь на комментариях, я собираюсь предположить, что это сработает:
$products = Product::whereHas('categories', function ($query) use ($slug) {
$query->where('slug', $slug);
})->paginate(ProductSetting::first()->pagination);
Поскольку у вас всегда есть только одна строка в вашей таблице product_settings, вы можете просто получить доступ к первой строке этой таблицы, оттуда вы можете получить доступ к любым столбцам, которые вам нужны.
Судя по ответу, вышесказанное "слишком длинное".
Единственная другая альтернатива, которую я имею для этого вопроса, заключается в следующем:
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> после первого вызова метода.
Приведенное выше редактирование ничем не отличается от исходного решения и по-прежнему будет выполнять запросы при каждом вызове метода 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 у вас есть решение для получения этого значения только с простой переменной?
это singleton должен ли я использовать его в appserviceprovider или при создании нового промежуточного программного обеспечения и т. д.?
@mafortis Ради интереса, какой из трех методов вы выбрали? Изменить 1?
в настоящее время я использую решение 1 по двум причинам: 1 я читал singleton в некоторых случаях будут возвращать значения повторно, например, фу будет фуууу2 я также читал, что не рекомендуется передавать переменные в basicController, как это предусмотрено laravel доля просмотров по той же причине. PS очевидно, что viewShare работает только с блейд-шаблонами, а не с контроллерами.
Не уверен, но может быть потому, что
$view->withне дает контроллеру переменную?