Intereting Posts

Lumen + Dingo + JWT не работает при построении

Я пытаюсь получить базовую рабочую основу для Lumen + Dingo Rest API, но я не могу понять, как мир все вместе.

Lumen работает нормально, но когда я пытаюсь добавить Dingo, я получаю всевозможные ошибки. Из документации Dingo я читал:

После того, как у вас есть пакет, вы можете настроить поставщика в файле config/api.php или в поставщике услуг или в файле начальной загрузки.

 'jwt' => 'Dingo\Api\Auth\Provider\JWT' 

или

 app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) { return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); }); 

Я установил свежую копию Lumen, и я не вижу config/api.php , поэтому я предполагаю, что я работаю с частью кода, чтобы разместить его в моем bootstrap/app.php

Это то, что выглядит мой bootstrap/app.php :

 <?php require_once __DIR__.'/../vendor/autoload.php'; try { (new Dotenv\Dotenv(__DIR__.'/../'))->load(); } catch (Dotenv\Exception\InvalidPathException $e) { // } $app = new Laravel\Lumen\Application( realpath(__DIR__.'/../') ); $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->register(Dingo\Api\Provider\LumenServiceProvider::class); app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) { return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); }); $app->group(['namespace' => 'App\Api\Controllers'], function ($app) { require __DIR__.'/../app/Api/routes.php'; }); return $app; 

При запуске я получаю следующую ошибку:

 BindingResolutionException in Container.php line 752: Target [Tymon\JWTAuth\Providers\JWT\JWTInterface] is not instantiable while building [Tymon\JWTAuth\JWTAuth, Tymon\JWTAuth\JWTManager]. in Container.php line 752 at Container->build('Tymon\JWTAuth\Providers\JWT\JWTInterface', array()) in Container.php line 633 at Container->make('Tymon\JWTAuth\Providers\JWT\JWTInterface', array()) in Application.php line 205 at Application->make('Tymon\JWTAuth\Providers\JWT\JWTInterface') in Container.php line 853 at Container->resolveClass(object(ReflectionParameter)) in Container.php line 808 at Container->getDependencies(array(object(ReflectionParameter), object(ReflectionParameter), object(ReflectionParameter)), array()) in Container.php line 779 at Container->build('Tymon\JWTAuth\JWTManager', array()) in Container.php line 633 at Container->make('Tymon\JWTAuth\JWTManager', array()) in Application.php line 205 at Application->make('Tymon\JWTAuth\JWTManager') in Container.php line 853 at Container->resolveClass(object(ReflectionParameter)) in Container.php line 808 at Container->getDependencies(array(object(ReflectionParameter), object(ReflectionParameter), object(ReflectionParameter), object(ReflectionParameter)), array()) in Container.php line 779 at Container->build('Tymon\JWTAuth\JWTAuth', array()) in Container.php line 633 at Container->make('Tymon\JWTAuth\JWTAuth', array()) in Application.php line 205 at Application->make('Tymon\JWTAuth\JWTAuth') in Container.php line 1178 at Container->offsetGet('Tymon\JWTAuth\JWTAuth') in app.php line 95 at {closure}(object(Application)) at call_user_func(object(Closure), object(Application)) in Auth.php line 216 at Auth->extend('jwt', object(Closure)) in app.php line 96 at require('/vagrant/dev_src/api/bootstrap/app.php') in index.php line 14 

Только когда я удаляю следующий фрагмент кода, он снова работает:

 app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) { return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); }); 

ОБНОВЛЕНИЕ 1

.env файл:

 APP_ENV=local APP_DEBUG=true APP_KEY=xxxxSECRETxxxx CACHE_DRIVER=file QUEUE_DRIVER=sync JWT_SECRET=yyyySECRETyyyy API_VENDOR=MyCompanyName API_STANDARDS_TREE=vnd API_PREFIX=api API_VERSION=v1 API_NAME="MyCompanyName API" API_CONDITIONAL_REQUEST=false API_STRICT=false API_DEFAULT_FORMAT=json 

Related of "Lumen + Dingo + JWT не работает при построении"

Вам нужно многое сделать. Вот руководство:

Вам необходимо вручную привязать реализацию CacheManager :

 $app->singleton( Illuminate\Cache\CacheManager::class, function ($app) { return $app->make('cache'); } ); 

Вам также необходимо связать реализацию AuthManager :

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

Перед регистрацией Dingo\Api\Provider\LumenServiceProvider вам необходимо зарегистрировать Tymon\JWTAuth\Providers\JWTAuthServiceProvider .

 $app->register(Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class); $app->register(Dingo\Api\Provider\LumenServiceProvider::class); 

Прежде чем вы зарегистрируете Tymon\JWTAuth\Providers\JWTAuthServiceProvider вам нужно создать функцию config_path , поскольку Lumen не поддерживает эту глобальную функцию.

 /** * Because Lumen has no config_path function, we need to add this function * to make JWT Auth works. */ if (!function_exists('config_path')) { /** * Get the configuration path. * * @param string $path * * @return string */ function config_path($path = '') { return app()->basePath().'/config'.($path ? '/'.$path : $path); } } 

Вот мой полный файл bootstrap/app.php :

 <?php require_once __DIR__.'/../vendor/autoload.php'; try { (new Dotenv\Dotenv(__DIR__.'/../'))->load(); } catch (Dotenv\Exception\InvalidPathException $e) { // } /* |-------------------------------------------------------------------------- | Create The Application |-------------------------------------------------------------------------- | | Here we will load the environment and create the application instance | that serves as the central piece of this framework. We'll use this | application as an "IoC" container and router for this framework. | */ $app = new Laravel\Lumen\Application( realpath(__DIR__.'/../') ); $app->withFacades(); $app->withEloquent(); /* |-------------------------------------------------------------------------- | Register Container Bindings |-------------------------------------------------------------------------- | | Now we will register a few bindings in the service container. We will | register the exception handler and the console kernel. You may add | your own bindings here if you like or you can make another file. | */ $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->singleton( Illuminate\Contracts\Routing\ResponseFactory::class, Illuminate\Routing\ResponseFactory::class ); $app->singleton( Illuminate\Auth\AuthManager::class, function ($app) { return $app->make('auth'); } ); $app->singleton( Illuminate\Cache\CacheManager::class, function ($app) { return $app->make('cache'); } ); /* |-------------------------------------------------------------------------- | Register Middleware |-------------------------------------------------------------------------- | | Next, we will register the middleware with the application. These can | be global middleware that run before and after each request into a | route or middleware that'll be assigned to some specific routes. | */ // $app->middleware([ // App\Http\Middleware\ExampleMiddleware::class // ]); // $app->routeMiddleware([ // // // ]); /* |-------------------------------------------------------------------------- | 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\AuthServiceProvider::class); // $app->register(App\Providers\EventServiceProvider::class); // JWTAuth Dependencies /** * Because Lumen has no config_path function, we need to add this function * to make JWT Auth works. */ if (!function_exists('config_path')) { /** * Get the configuration path. * * @param string $path * * @return string */ function config_path($path = '') { return app()->basePath().'/config'.($path ? '/'.$path : $path); } } $app->register(Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class); $app->register(Dingo\Api\Provider\LumenServiceProvider::class); $app->make(Dingo\Api\Auth\Auth::class)->extend('jwt', function ($app) { return new Dingo\Api\Auth\Provider\JWT( $app->make(Tymon\JWTAuth\JWTAuth::class) ); }); /* |-------------------------------------------------------------------------- | Load The Application Routes |-------------------------------------------------------------------------- | | Next we will include the routes file so that they can all be added to | the application. This will provide all of the URLs the application | can respond to, as well as the controllers that may handle them. | */ $app->group(['namespace' => App\Api\Controllers::class], function ($app) { require __DIR__.'/../app/Api/routes.php'; }); return $app; 

Обновление 1

Я делаю простой POC, используя Lumen с Dingo API здесь .