Возвращая одну и ту же переменную каждому контроллеру в laravel - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно отправить один и тот же результат почти на каждую view страницу, поэтому мне нужно связать variables и вернуться с каждым контроллером.

Мой пример кода

public function index()
{
    $drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();
    $locations = Location::get();

    return view('visitor.index', compact('drcategory','locations'));
}

public function contact()
{
    $drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();
    $locations = Location::get();

    return view('visitor.contact', compact('drcategory','locations'));
}

Но, как вы видите, мне нужно писать один и тот же код снова и снова.Как я могу написать один раз и включить в нее любую функцию всякий раз, когда мне нужно?

Я думал об использовании конструктора , но не могу понятькак я могу это реализовать.

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

@ Sunil упоминал способ View Composer Binding - лучший способ добиться этого.

0 голосов
/ 27 сентября 2018

Есть несколько способов реализовать это.

Вы можете пойти с service, provider или, как вы сказали, в constructor.

IЯ предполагаю, что вы поделитесь этим с большим количеством частей вашего кода, а не только с controller, и для этого я бы сделал service со статическими вызовами, если код такой короткий и сфокусированный.

Если выабсолютно уверены, что это только специальный случай для этого controller, тогда вы можете сделать:

class YourController 
{

    protected $drcategory;

    public function __construct() 
    {

       $this->drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();

    }

   // Your other functions here

}

В конце концов, я бы все же поместил ваш запрос в сервис или провайдера и вместо этого передал бы его контроллеруиметь его прямо там.Может быть, что-то дополнительное, чтобы исследовать?:)

0 голосов
/ 27 сентября 2018

Для этого вы можете использовать Просмотреть привязку композитора функцию laravel

добавить это в загрузочную функцию AppServiceProvider

    View::composer('*', function ($view) {
                $view->with('drcategory', DoctorCategory::orderBy('speciality', 'asc')->get());
                $view->with('locations', Location::get());
            }); //please import class...

когда вы заходите на каждую страницу, вы можете получить доступ к drcategory и location объекту каждый раз, и вам не нужно отправлять drcategory и location из каждого контроллерадля просмотра.

Отредактируйте свой метод контроллера

public function index()
{
    return view('visitor.index');
}
0 голосов
/ 27 сентября 2018

Вы можете достичь этого, используя функцию View::share() в AppServicerProvider:

App \ Providers \ AppServiceProvider.php:

public function __construct()
{
   use View::Share('variableName', $variableValue );
}

Затем в контроллере вы называете view как обычно:

public function myTestAction()
{
    return view('view.name.here');
}

Теперь вы можете вызывать вашу переменную в представлении:

<p>{{ variableName }}</p>

Подробнее читайте в 1018 * документы *.

...