Как я могу передать переменную каждому представлению в Laravel, не передавая его из каждого контроллера? - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь, чтобы значок уведомления показывал количество непрочитанных сообщений, которые есть у пользователя. Следующие работы:

// Controller
public function messages() 
{
    $messages = MessagesController::getMessages();
    $newNotificationNumber = MessagesController::getNumberOfNewMessages();

    return view('pages.messages', compact('messages'), compact('newNotificationNumber'));
}

Мой app.blade.php файл структурирован следующим образом:

// html stuff
@include('layouts.navbar')
<main class="py-4 bg-white">
  <div class="container">
    @yield('content')
  </div>
</main>

Панель навигации показывает число следующим образом:

<span class="badge badge-pill badge-primary">{{ $newNotificationNumber ?? '' }}</span>

Если Я включаю compact('newNotificationNumber') в каждую функцию контроллера, мои уведомления работают так, как я хочу, но это утомительно и подвержено ошибкам. Какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Лучшим способом я рекомендую вам воспользоваться услугой провайдера. Вы можете AppServiceProvider. php, расположенный в app \ Providers или создать нового поставщика услуг (который я настоятельно рекомендую);

Сначала давайте создадим новый вызов провайдера MasterViewServicerProvider

*php artisan make:provider MasterViewServicerProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View; /** Let's Import View Facade **/
use App\Model\CAS\Message; /** Let's Import the our Model **/

class MasterViewServicerProvider extends ServiceProvider
{

public function register()
{
    //
}

/**
 * Bootstrap services.
 *
 * @return void
 */
public function boot()
{

/** First we have to check if the table exist in our database, the reason is that if we try to run migration and the table doesn't Message doesn't exist, it will through an error because the provider will render before the migration **/

    if(\Schema::hasTable('messages'))
    {
      $message= Message::all();
      /** message = Message::get(['title','id']); // get specific column instead of all record on the table  **/
      View::share('message', $message);
    }
}

}

Теперь позвольте Зарегистрировать нашего провайдера в conf \ app. php

'providers' => [
    .......
    App\Providers\MasterViewServicerProvider::class,
],

Теперь вы можете вызывать переменную $ message в любом месте приложение. Надеюсь, это поможет.

1 голос
/ 20 марта 2020

Вы можете создать новый контроллер, скажем, AppController, который расширит App\Http\Controllers контроллер по умолчанию Laravel. Внутри этого нового контроллера создайте свой конструктор со всеми необходимыми данными и поделитесь ими для всех представлений:

public function __construct(Request $request)
{
    $messages = MessagesController::getMessages();
    $newNotificationNumber = MessagesController::getNumberOfNewMessages();
    View::share('languages', $languages);
    View::share('newNotificationNumber', $newNotificationNumber);
}

После этого вы можете расширить AppController в любом другом контроллер, где вам нужны ваши переменные:

class YourController extends AppController

Все, что осталось сделать сейчас, это расширить конструктор AppController в YourController:

public function __construct()
{
    parent::__construct();
}

Таким образом, вы получите доступ к $languages и $newNotificationNumber переменным во всех представлениях, которые вы используете в YourController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...