api: Internal routing bug: doesn't work with middleware
Any internal request in conjunction with a route that contains middleware, like this:
$api->version('v1', ['middleware' => 'test'], function ($api) {
});
Results in a:
[ReflectionException]
Class test does not exist
Despite it being define properly inside Kernel.php:
protected $routeMiddleware = [
'test' => \App\Http\Middleware\Test::class,
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
I’ve created a test case to illustrate the bug here https://github.com/assembledadam/laravel
Just run php artisan testcase in the root folder, and to view the middleware working visit localhost/index.php/test/blahblah
Stack trace (from my application, not the test case!):
n Error Occured:
Class oauth does not exist
File: /usr/www/app/vendor/laravel/framework/src/Illuminate/Container/Container.php
Line: 738
#0 /usr/www/app/vendor/laravel/framework/src/Illuminate/Container/Container.php(738): ReflectionClass->__construct('oauth')
#1 /usr/www/app/vendor/laravel/framework/src/Illuminate/Container/Container.php(633): Illuminate\Container\Container->build('oauth', Array)
#2 /usr/www/app/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(697): Illuminate\Container\Container->make('oauth', Array)
#3 /usr/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(123): Illuminate\Foundation\Application->make('oauth')
#4 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Dingo\Api\Http\InternalRequest))
#5 /usr/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Dingo\Api\Http\InternalRequest))
#6 /usr/www/app/vendor/dingo/api/src/Http/Middleware/PrepareController.php(45): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Dingo\Api\Http\InternalRequest))
#7 [internal function]: Dingo\Api\Http\Middleware\PrepareController->handle(Object(Dingo\Api\Http\InternalRequest), Object(Closure))
#8 /usr/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
#9 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Dingo\Api\Http\InternalRequest))
#10 /usr/www/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Dingo\Api\Http\InternalRequest))
#11 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Dingo\Api\Http\InternalRequest))
#12 /usr/www/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Dingo\Api\Http\InternalRequest))
#13 /usr/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(726): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#14 /usr/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(699): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Dingo\Api\Http\InternalRequest))
#15 /usr/www/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(675): Illuminate\Routing\Router->dispatchToRoute(Object(Dingo\Api\Http\InternalRequest))
#16 /usr/www/app/vendor/dingo/api/src/Routing/Adapter/Laravel.php(80): Illuminate\Routing\Router->dispatch(Object(Dingo\Api\Http\InternalRequest))
#17 /usr/www/app/vendor/dingo/api/src/Routing/Router.php(574): Dingo\Api\Routing\Adapter\Laravel->dispatch(Object(Dingo\Api\Http\InternalRequest), 'v1')
#18 /usr/www/app/vendor/dingo/api/src/Dispatcher.php(540): Dingo\Api\Routing\Router->dispatch(Object(Dingo\Api\Http\InternalRequest))
#19 /usr/www/app/vendor/dingo/api/src/Dispatcher.php(445): Dingo\Api\Dispatcher->dispatch(Object(Dingo\Api\Http\InternalRequest))
#20 /usr/www/app/vendor/dingo/api/src/Dispatcher.php(372): Dingo\Api\Dispatcher->queueRequest('post', 'users', Array, '{"old_id":"301"...')
#21 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/Scripts/User.php(240): Dingo\Api\Dispatcher->post('users', Array, '{"old_id":"301"...')
#22 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/Scripts/AbstractMigration.php(178): Candybanana\CreoMigration\ETL\Scripts\User->insert(Array)
#23 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/Scripts/User.php(68): Candybanana\CreoMigration\ETL\Scripts\AbstractMigration->run(NULL, '114947')
#24 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/ETL.php(348): Candybanana\CreoMigration\ETL\Scripts\User->__construct(Object(Candybanana\CreoMigration\ETL\ETL), '0adf04fce0090b6...')
#25 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/ETL.php(262): Candybanana\CreoMigration\ETL\ETL->runEntityScripts(Array)
#26 /usr/www/app/vendor/candybanana/creo-migration/src/ETL/ETL.php(91): Candybanana\CreoMigration\ETL\ETL->run()
#27 /usr/www/app/vendor/candybanana/creo-migration/src/Console/Command/Migrate.php(87): Candybanana\CreoMigration\ETL\ETL->__construct(Array, Object(Candybanana\CreoMigration\Console\Command\Migrate), Object(PDO))
#28 [internal function]: Candybanana\CreoMigration\Console\Command\Migrate->fire()
#29 /usr/www/app/vendor/laravel/framework/src/Illuminate/Container/Container.php(507): call_user_func_array(Array, Array)
#30 /usr/www/app/vendor/laravel/framework/src/Illuminate/Console/Command.php(169): Illuminate\Container\Container->call(Array)
#31 /usr/www/app/vendor/symfony/console/Command/Command.php(259): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 /usr/www/app/vendor/laravel/framework/src/Illuminate/Console/Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 /usr/www/app/vendor/symfony/console/Application.php(844): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 /usr/www/app/vendor/symfony/console/Application.php(192): Symfony\Component\Console\Application->doRunCommand(Object(Candybanana\CreoMigration\Console\Command\Migrate), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 /usr/www/app/vendor/symfony/console/Application.php(123): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#36 /usr/www/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(107): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#37 /usr/www/app/artisan(36): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#38 {main}
About this issue
- Original URL
- State: closed
- Created 8 years ago
- Comments: 31 (25 by maintainers)
Commits related to this issue
- Boot parent provider after. Opting to boot the parent provider after prevents the router binding to be fired too early. This was causing issues primarily if the service provider was added to the conf... — committed to dingo/api by jasonlewis 8 years ago
- Clone router prior to dispatching Laravel request. This is a short-term fix and needs a little more investigation into possible performance issues with cloning the router before every dispatch. This... — committed to dingo/api by jasonlewis 8 years ago
- Slightly hacky fix to address stale controllers when firing internal requests https://github.com/dingo/api/issues/964#issuecomment-208845502 — committed to assembledadam/api by deleted user 8 years ago
Aye, register Dingo first. I’ll take another look at this tomorrow.