Artistan
Artistan

Reputation: 2037

upgrade to laravel 5.3 -- issues with Route::prefix

upgraded from 5.1 to 5.3, followed all the instructions... https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

Now I am getting

BadMethodCallException in Macroable.php line 74:
Method prefix does not exist.
in Macroable.php line 74
at Router->__call('prefix', array('api')) in Facade.php line 237
at Facade::__callStatic('prefix', array('api')) in RouteServiceProvider.php line 58
at RouteServiceProvider->mapApiRoutes() in RouteServiceProvider.php line 32
at RouteServiceProvider->map()
at call_user_func_array(array(object(RouteServiceProvider), 'map'), array()) in Container.php line 508
at Container->call(array(object(RouteServiceProvider), 'map')) in RouteServiceProvider.php line 69
at RouteServiceProvider->loadRoutes() in RouteServiceProvider.php line 30
at RouteServiceProvider->boot() in RouteServiceProvider.php line 23
at RouteServiceProvider->boot()
at call_user_func_array(array(object(RouteServiceProvider), 'boot'), array()) in Container.php line 508
at Container->call(array(object(RouteServiceProvider), 'boot')) in Application.php line 769
at Application->bootProvider(object(RouteServiceProvider)) in Application.php line 752
at Application->Illuminate\Foundation\{closure}(object(RouteServiceProvider), '16')
at array_walk(array(object(EventServiceProvider), object(RoutingServiceProvider), object(AuthServiceProvider), object(CookieServiceProvider), object(DatabaseServiceProvider), object(EncryptionServiceProvider), object(FilesystemServiceProvider), object(FoundationServiceProvider), object(PaginationServiceProvider), object(SessionServiceProvider), object(ViewServiceProvider), object(NotificationServiceProvider), object(AppServiceProvider), object(AuthServiceProvider), object(ConfigServiceProvider), object(EventServiceProvider), object(RouteServiceProvider), object(DatabaseServiceProvider), object(BraintreeServiceProvider), object(BroadcastServiceProvider), object(FlashServiceProvider), object(ExcelServiceProvider), object(CashierServiceProvider), object(EntrustServiceProvider), object(AnalyticsServiceProvider), object(JWTAuthServiceProvider), object(ApidocsServiceProvider), object(ServiceProvider), object(GeoIPServiceProvider), object(PdfServiceProvider), object(LaravelPhoneServiceProvider)), object(Closure)) in Application.php line 753
at Application->boot() in BootProviders.php line 17
at BootProviders->bootstrap(object(Application)) in Application.php line 203
at Application->bootstrapWith(array('Illuminate\Foundation\Bootstrap\DetectEnvironment', 'Illuminate\Foundation\Bootstrap\LoadConfiguration', 'Illuminate\Foundation\Bootstrap\ConfigureLogging', 'Illuminate\Foundation\Bootstrap\HandleExceptions', 'Illuminate\Foundation\Bootstrap\RegisterFacades', 'Illuminate\Foundation\Bootstrap\RegisterProviders', 'Illuminate\Foundation\Bootstrap\BootProviders')) in Kernel.php line 254
at Kernel->bootstrap() in Kernel.php line 145
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 117
at Kernel->handle(object(Request)) in index.php line 52

The code for RouteServiceProvider is exact copy from laravel.

not sure why it is not loading! the method is not recognized, but i can see it in the Router class.

composer.json

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
    "laravel/framework": "5.3.*",
    "laravelcollective/html": "~5.0",
    "laracasts/flash": "~1.3",
    "maatwebsite/excel": "~2.1",
    "guzzlehttp/guzzle": "~6.2",
    "doctrine/dbal": "~2.5",
    "laravel/cashier": "~7.0",
    "league/flysystem-aws-s3-v3": "~1.0",
    "zizaco/entrust": "1.7.0",
    "barryvdh/laravel-ide-helper": "^2.2",
    "blueimp/jquery-file-upload": "^9.14",
    "ipunkt/laravel-analytics": "^1.3",
    "braintree/braintree_php": "^3.21",
    "tymon/jwt-auth": "0.5.*",
    "f2m2/apidocs": "~2.0",
    "barryvdh/laravel-cors": "0.8.*",
    "pulkitjalan/geoip": "~2.4",
    "aws/aws-sdk-php-laravel": "^3.1",
    "vsmoraes/laravel-pdf": "^1.0",
    "propaganistas/laravel-phone": "^2.8",
    "activecampaign/api-php": "~2.0"
},
"require-dev": {
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1",
    "ozankurt/repoist": "^1.0",
    "symfony/dom-crawler": "~3.1",
    "symfony/css-selector": "~3.1"
},
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "APP\\": "app/"
    }
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},
"scripts": {
    "post-root-package-install": [
        "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
        "php artisan key:generate"
    ],
    "post-install-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postInstall",
        "php artisan optimize"
    ],
    "post-update-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postUpdate",
        "php artisan optimize"
    ]
},
"config": {
    "preferred-install": "dist"
}

}

RouteServiceProvider

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //
        parent::boot();
    }
    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
        //
    }
    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    }
    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));
    }
}

another test i swapped the prefix and middleware calls and got this error...

SWAPPED ORDER

protected function mapApiRoutes()
{
    Route::middleware('api')->prefix('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

ERROR

FatalThrowableError in Router.php line 859:
Type error: Too few arguments to function Illuminate\Routing\Router::middleware(), 1 passed in /var/www/vhosts/camp-native/API-v.2-master/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php on line 237 and exactly 2 expected
in Router.php line 859
at Router->middleware('api') in Facade.php line 237
at Facade::__callStatic('middleware', array('api')) in RouteServiceProvider.php line 58
at RouteServiceProvider->mapApiRoutes() in RouteServiceProvider.php line 32
at RouteServiceProvider->map()
at call_user_func_array(array(object(RouteServiceProvider), 'map'), array()) in Container.php line 508
at Container->call(array(object(RouteServiceProvider), 'map')) in RouteServiceProvider.php line 69
at RouteServiceProvider->loadRoutes() in RouteServiceProvider.php line 30
at RouteServiceProvider->boot() in RouteServiceProvider.php line 23
at RouteServiceProvider->boot()
at call_user_func_array(array(object(RouteServiceProvider), 'boot'), array()) in Container.php line 508
at Container->call(array(object(RouteServiceProvider), 'boot')) in Application.php line 769
at Application->bootProvider(object(RouteServiceProvider)) in Application.php line 752
at Application->Illuminate\Foundation\{closure}(object(RouteServiceProvider), '16')
at array_walk(array(object(EventServiceProvider), object(RoutingServiceProvider), object(AuthServiceProvider), object(CookieServiceProvider), object(DatabaseServiceProvider), object(EncryptionServiceProvider), object(FilesystemServiceProvider), object(FoundationServiceProvider), object(PaginationServiceProvider), object(SessionServiceProvider), object(ViewServiceProvider), object(NotificationServiceProvider), object(AppServiceProvider), object(AuthServiceProvider), object(ConfigServiceProvider), object(EventServiceProvider), object(RouteServiceProvider), object(DatabaseServiceProvider), object(BraintreeServiceProvider), object(BroadcastServiceProvider), object(FlashServiceProvider), object(ExcelServiceProvider), object(CashierServiceProvider), object(EntrustServiceProvider), object(AnalyticsServiceProvider), object(JWTAuthServiceProvider), object(ApidocsServiceProvider), object(ServiceProvider), object(GeoIPServiceProvider), object(PdfServiceProvider), object(LaravelPhoneServiceProvider)), object(Closure)) in Application.php line 753
at Application->boot() in BootProviders.php line 17
at BootProviders->bootstrap(object(Application)) in Application.php line 203
at Application->bootstrapWith(array('Illuminate\Foundation\Bootstrap\DetectEnvironment', 'Illuminate\Foundation\Bootstrap\LoadConfiguration', 'Illuminate\Foundation\Bootstrap\ConfigureLogging', 'Illuminate\Foundation\Bootstrap\HandleExceptions', 'Illuminate\Foundation\Bootstrap\RegisterFacades', 'Illuminate\Foundation\Bootstrap\RegisterProviders', 'Illuminate\Foundation\Bootstrap\BootProviders')) in Kernel.php line 254
at Kernel->bootstrap() in Kernel.php line 145
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 117
at Kernel->handle(object(Request)) in index.php line 52

Upvotes: 1

Views: 2574

Answers (2)

Gautam Arya
Gautam Arya

Reputation: 723

I was recently stuck with the same issue, While I was trying to upgrade my application from 5.2 to 5.3.

After so much hair pulling and error solving I realized, that there was a fault in my RouteServiceProvider.php file. Here is how I solved my problem.

I replaced:

Route::prefix('api')
    ->middleware('api')
    ->namespace($this->namespace)
    ->group(base_path('routes/api.php'));

with

Route::group([
    'middleware' => 'api',
    'namespace' => $this->namespace,
    'prefix' => 'api'
    ], function($router){
        require base_path('routes/api.php');
    });

It worked wonder for me. Now, I don't have any middleware related errors.

BTW: You need to do the same thing with mapWebRoutes function if you error is related to web.

Hope this helps.

Upvotes: 1

Simon Davies
Simon Davies

Reputation: 3686

That link is the upgrade from 5.2 to 5.3, so you might also need to check the 5.1 to 5.2 one as well.

Looks like it might be the API routes and middleware that are missing. On that update link you have look up the API and the section with ref to:

'api' => [
    'throttle:60,1',
     'bindings',
 ],

and within the app/Providors/RouteServiceProvider your looking for somethign like:

   protected function mapApiRoutes()
      {
          Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
   }

Hope this helps and might be a clue?

Upvotes: 2

Related Questions