Пользовательская защита Json больше не работает после начала обновления приложения Laravel

#laravel #laravel-5

#laravel #laravel-5

Вопрос:

Я обновляю унаследованное приложение с Laravel 5.2 до 5.4 (надеясь перейти к последней версии), но я столкнулся с ошибкой, когда защита JSON больше не работает. Этот код работает (в рабочей версии) в версии 5.2 после изменений в версии 5.4, которые я сейчас получаю Argument 3 passed to AppServicesAuthJsonGuard::__construct() must be an instance of SymfonyComponentHttpFoundationSessionSessionInterface, instance of IlluminateSessionStore given

Это JsonGuard __construct:

 namespace AppServicesAuth;
 
use IlluminateContractsAuthUserProvider;
use IlluminateContractsAuthStatefulGuard;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationSessionSessionInterface;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
 
class JsonGuard implements StatefulGuard
{
      /**
       * Create a new authentication guard.
       *
       * @param  IlluminateContractsAuthUserProvider  $provider
       * @param  SymfonyComponentHttpFoundationSessionSessionInterface  $session
       * @param  SymfonyComponentHttpFoundationRequest  $request
       * @return void
       */
      public function __construct($name,
                                  UserProvider $provider,
                                  SessionInterface $session,
                                  Request $request) {
        $this->name = $name;
        $this->session = $session;
        $this->request = $request;
        $this->provider = $provider;
      }
     
  

Это AuthServiceProvider

 use IlluminateSupportFacadesAuth;
use IlluminateContractsAuthAccessGate as GateContract;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
use AppServicesAuthJsonGuard;
use AppExtensionsOptimumHQUserProvider;
use AppDatabaseOptimumHQDatabase;
use AppModelsAuthUser;
// use IlluminateHttpRequest;
// use IlluminateSupportFacadesConfig;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'AppModel' => 'AppPoliciesModelPolicy',
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);

        $this->app->bind('AppDatabaseOptimumHQDatabase', function ($app) {
          return new OptimumHQDatabase(config('optimumhq.defaults.host'), config('optimumhq.defaults.username'), config('optimumhq.defaults.token'));
        });
         
        $this->app->bind('AppModelsAuthUser', function ($app) {
          return new User($app->make('AppDatabaseOptimumHQDatabase'));
        });
     
        // add custom guard provider
        Auth::provider('optimumhq', function ($app, array $config) {
          return new OptimumHQUserProvider($app->make('AppModelsAuthUser'));
        });
     
        // add custom guard
        Auth::extend('json', function ($app, $name, array $config) {
          return new JsonGuard('json', Auth::createUserProvider($config['provider']), $this->app['session.store'], $app->make('request'));
        });
    }
  

Ошибка заключается в том, что $this->app[‘session.store’] является экземпляром «store», но я не знаю, как изменить его, чтобы он стал экземпляром SessionInterface или как отследить его весь путь до того места, где он изначально установлен.

Я «думаю», что если я смогу изменить $this->app[‘session.store’] на SessionInterface, это сработает. Я очень не уверен, почему это работало в 5.2, но больше не работает. Кажется, это может иметь какое-то отношение к https://laravel.com/docs/5.3/upgrade#5.3-session-in-constructors но я не смог полностью понять реализацию промежуточного программного обеспечения, и моя попытка указать тип не удалась.

У кого-нибудь есть предложения относительно того, с чего начать?

Ответ №1:

IlluminateContractsSessionSession Контракт не существовал в Laravel 5.2. Защита сеанса полагалась на интерфейс сеанса Symfony.

В JsonGuard изменении:

 use SymfonyComponentHttpFoundationSessionSessionInterface;
  

Для

 use IlluminateContractsSessionSession as SessionInterface;