Laravel - Пакет не может распознать функции аутентификации? - PullRequest
5 голосов
/ 18 февраля 2020

Я сделал пакет, который подсчитывает посетителей на веб-странице. В настоящее время у меня есть один маршрут, контроллер и вид, которые не делают ничего, кроме отображения простой строки. У меня есть отдельное приложение Laravel, для которого специально создан этот пакет. В этом отдельном приложении у меня есть файл макета с именем backend.

layouts/layouts/backend.blade.php.

Мой пакетный вид расширяет этот шаблон следующим образом: (backend.blade. php не существует в пакет, но в отдельном приложении laravel (конечно) *

Почему это происходит?

Это мой поставщик услуг пакетов

 public function register()
    {
        // Controllers
        $this->app->make('Rainieren\Visitors\Http\Controllers\VisitorController');
        // Views
        $this->loadViewsFrom(__DIR__.'/resources/views', 'visitors');
        $this->publishes([
            __DIR__.'/resources/views' => resource_path('views/visitors'),
        ]);
        // Migrations
        $this->loadMigrationsFrom(__DIR__.'/database/migrations');
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        include __DIR__ . '/routes/routes.php';
    }

Когда я делаю vendor:publish представление успешно публикуется в нужной папке, но каким-то образом не может распознать такие функции, как Auth::user()->token или Auth::user()->unreadNotifications->count())

Это мой маршрут маршрута:

<?php


Route::get('dashboard/visitors', '\Rainieren\Visitors\Http\Controllers\VisitorController@index')->name('visitors');

А это контроллер

public function index()
    {
        return view('visitors::index'); 
    }

Ответы [ 2 ]

4 голосов
/ 22 февраля 2020

Мне понадобится немного больше информации для отладки, но мое первое предположение - отсутствие промежуточного программного обеспечения AuthenticateSession или Authenticate.

Laravel определяет группу связующего ПО по умолчанию web для ваших маршрутов внутри routes/web.php, и эта группа использует промежуточное ПО AuthenticateSession. Вот как выглядит новая установка:

Route::group([
    'middleware' => 'web', <<< this is the magic part
    'namespace' => $this->namespace,
], function ($router) {
    require base_path('routes/web.php');
});

Здесь мы видим, что используется группа промежуточного программного обеспечения web.

В вашем пользовательском модуле / поставщике услуг это не так. Ваше определение Route::get() добавлено к Router, но не внутри этой группы. Поэтому все необходимые внутренние компоненты для аутентификации пользователя не выполняются.

В этом сценарии я бы попытался использовать ->middleware('auth') или ->middleware('web'), который будет использовать промежуточное программное обеспечение группы основных проектов.

Route::get('dashboard/visitors', '\Rainieren\Visitors\Http\Controllers\VisitorController@index')
  ->name('visitors')
  ->middleware('web');

Вот другая идея:

Если вы говорите, что вы всегда аутентифицированы. Затем вы можете попытаться переместить все промежуточные программы web в глобальные промежуточные программы внутри Kernel (protected $middleware = []).

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

2 голосов
/ 18 февраля 2020

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

Их обходной путь использует это в контроллере и передает его представлению:

$user = auth()->user();

return view('folder.view' ,['user'=>$user]);

И затем в представлении:

{{$user->token}} <!-- OR --!> {{$user->unreadNotifications->count()}}

Очевидно, что @ N69S заявил, что только если пользователь аутентифицирован, это будет работать.

Надеюсь, это работает !!

РЕДАКТИРОВАТЬ: (Извините, не понял в первый раз)

Ошибка в классе вашего поставщика услуг, вам нужно сделать все логи c на загрузочная функция, а не в регистре, потому что если вы делаете в регистровой функции, вы загружаете все до laravel framework (что-то сказать) https://laravel.com/docs/5.7/providers#the -register-method

Ваш сервис-провайдер должен заканчиваться так:

    public function register()
    {
        //Nothing
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // Controllers
        $this->app->make('Rainieren\Visitors\Http\Controllers\VisitorController');
        // Views
        $this->loadViewsFrom(__DIR__.'/resources/views', 'visitors');
        $this->publishes([
            __DIR__.'/resources/views' => resource_path('views/visitors'),
        ]);
        // Migrations
        $this->loadMigrationsFrom(__DIR__.'/database/migrations');
        include __DIR__ . '/routes/routes.php';
    }

Надеюсь, это наконец-то работает!

...