Arhn - архитектура программирования

Правильно внедрить AuthManager?

Я использую библиотеку jwt-auth, которая внедряет AuthManager с помощью подсказки типа:

use Illuminate\Auth\AuthManager;
class Basic extends Authorization
{

public function __construct(AuthManager $auth, $identifier = 'email')
    {
        $this->auth = $auth;
        $this->identifier = $identifier;
    }

Проблема в том, что если бы я использовал промежуточное ПО jwt.auth:

app('Dingo\Api\Routing\Router')->version('v1', ['middleware' => ['jwt.auth'] , 'prefix' => 'api', 'providers' => ['jwt']], function ($api) {
    $api->get('protected', function () {

       $token = JWTAuth::getToken();
       return $token;
    });
});

Я получаю эту ошибку:

{"message":"Unresolvable dependency resolving [Parameter #0 [ <required> $app ]] in class Illuminate\\Auth\\AuthManager","status_code":500,"debug":{"line":839,"file":"\/share\/vendor\/illuminate\/container\/Container.php","class":"Illuminate\\Contracts\\Container\\BindingResolutionException"

Итак, вопрос в том, как правильно внедрить AuthManager? почему $app не разрешился?

06.03.2016

Ответы:


1

Попробуйте внедрить AuthManager в файл bootstrap/app.php:

/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/

$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);

// Injecting goes here
$app->singleton(Illuminate\Auth\AuthManager::class, function ($app) {
    return $app->make('auth');
});

Объяснение

Мы знаем, что Illuminate\Auth\AuthManager будет разрешено автоматически, если мы запустим Illuminate\Auth\AuthServiceProvider. Видеть:

Illuminate\Auth\AuthServiceProvider@registerAuthenticator

Таким образом, мы должны запустить этот поставщик услуг, прежде чем мы захотим использовать AuthManager. Но Люмен немного отличается. Я вижу, что Illuminate\Auth\AuthManager еще не зарегистрирован в:

Laravel\Lumen\Application::$availableBindings

Это хак, чтобы заставить Lumen работать быстрее, когда контейнер хочет разрешить ресурс, см.:

Laravel\Lumen\Application@make

Таким образом, в основном, если вы хотите разрешить класс Illuminate\Auth\AuthManager и его зависимость, вы можете сначала зарегистрировать привязки его класса, прежде чем использовать его.

Обновлять

Мы знаем это

Laravel\Lumen\Application::$availableBindings

свойство находится в видимости public, так что это тоже работает:

/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/

$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);

$app->availableBindings['Illuminate\Auth\AuthManager'] = 'registerAuthBindings';
$app->alias('auth', 'Illuminate\Auth\AuthManager');

Обновление 2

Я понимаю, что есть много проблем, если мы хотим реализовать аутентификацию JWT в Lumen с помощью этой библиотеки. Итак, я делаю загрузочное (чистый запуск) приложение Lumen, которое хорошо интегрируется с этой библиотекой. Пожалуйста, ознакомьтесь с моим репозиторием. Позже я добавлю объяснение того, какой из них и почему мы должны изменить код. Ваше здоровье.

07.03.2016
  • $app-›singleton(Illuminate\Auth\AuthManager::class означает, что всякий раз, когда используется AuthManager, он будет использовать один и тот же экземпляр, но не могли бы вы объяснить код $app-›make('auth') ? 07.03.2016
  • Привет @simo, я обновил ответ. Это достаточно ясно? Просто скажите мне, когда вам нужно более четкое объяснение, я помогу вам глубже изучить ядро ​​​​Lumen, если вы хотите. 07.03.2016
  • Большое спасибо Крисе за объяснение, я попробую решение, как только доберусь до офиса, у меня большой опыт работы с ООП, но мне нужно больше узнать о фреймворках Laravel и lumen. Не удалось найти для них хорошие ресурсы по архитектуре. 07.03.2016
  • Спасибо Крисан, это сработало, я не правильно понял сообщение об ошибке, я думал, что AuthManager был разрешен, но $app var не был введен в него.. 08.03.2016
  • @simo Рад помочь вам, сэр 08.03.2016
  • Спасибо @Krisan, я поместил ваше решение проблемы в проблему репо, но у меня все еще есть проблема github.com/tymondesigns/jwt-auth/issues/561 , я добавил это туда, потому что это проблема, связанная с репо.. вы тоже знаете, как ее решить? 08.03.2016
  • Привет @simo, я обновил ответ. Извините за поздний ответ, я только что приехал домой. Если вам что-то нужно, вы можете связаться со мной по электронной почте. Я очень рад помочь людям. 08.03.2016
  • Спасибо @Krisan, я скоро протестирую ваше репо, очень признателен. 09.03.2016

  • 2

    Я испытал это с SessionManager с той же неразрешимой переменной $app при регистрации существующего Laravel SessionServiceProvider.

    Прочитав ответ @krisanalfa, я попытался просмотреть значения $availableBindings, которые можно найти в Application.php, и это выглядит так:

    public $availableBindings = [
          'auth' => 'registerAuthBindings',
          'auth.driver' => 'registerAuthBindings',
          'Illuminate\Auth\AuthManager' => 'registerAuthBindings',
    
          'Illuminate\Contracts\Cache\Factory' => 'registerCacheBindings',
          'Illuminate\Contracts\Cache\Repository' => 'registerCacheBindings',
          ....
    ];
    

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

    Если вам нужно загрузить конфигурацию и зарегистрировать привязку:

    protected function registerAuthBindings()
    {
        $this->singleton('auth', function () {
            return $this->loadComponent('auth', 'Illuminate\Auth\AuthServiceProvider', 'auth');
        });
    
        $this->singleton('auth.driver', function () {
            return $this->loadComponent('auth', 'Illuminate\Auth\AuthServiceProvider', 'auth.driver');
        });
    
       ...
    }
    

    Но если служба не нуждается в какой-либо настройке, вы просто регистрируете ее следующим образом:

    protected function registerEventBindings()
    {
        $this->singleton('events', function () {
            $this->register('Illuminate\Events\EventServiceProvider');
    
            return $this->make('events');
        });
    }
    

    Источник на момент написания этой статьи: https://github.com/laravel/lumen-framework/blob/5.8/src/Application.php

    Надеюсь, это поможет другим в будущем. Это заняло у меня много часов.

    18.03.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..