Search code examples
phplaravellaravel-5routescontrollers

Do I need to have Controller.php in all my API subversion?


I am trying to create an API directory in my Laravel project and I'm receiving the following error...

Class 'App\Http\Controllers\Controller' not found

I have tried using use App\Http\Controllers\Controller; on top of my API controllers but no luck.

My API classes are defined like...

class SyncController extends Controller {...}
class TimecardController extends Controller {...}

I'm pretty sure the error is coming from the extends Controller portion.

in App\Http\Controllers\Controller I have Controller.php. One way I have pushed past this is to duplicate the Controller.php into App\Http\Controllers\Api\v2\ and change the namespace of that controller to match where it is located (namespace App\Http\Controllers\Api\v2;)

I don't believe this is correct, as there should be a way to reference the Controller.php from the controllers in the API subdirectory.

../Controllers/Controller.php and API is a subdirectory, ../Controllers/Api/v2/SyncController.php

Any help would be much appreciated.

Thanks

-----------Edit------------

my routes for the api look like so

Route::group(['prefix' => 'api/v2'], function () {
   Route::get('sync', 'Api\v2\SyncController@sync')->middleware('auth:api');
   Route::post('timecard', 'Api\v2\TimecardController@create')->middleware('auth:api');
});

Solution

  • The Controller class cannot be found because the API controllers are not in the default Laravel controller directory. You need to add the controller class as a use statement. Then the autoloader will be able to find it.

    namespace App\Http\Controllers\Api\v2;
    
    use App\Http\Controllers\Controller;
    
    class SyncController extends Controller {...}
    

    And while your at it you might also want to add the auth:api middleware to the entire group. Much safer and efficient.

    Route::group(['prefix' => 'api/v2', 'middleware' => 'auth:api', 'namespace' => 'Api\v2'], function () {
       Route::get('sync', 'SyncController@sync');
       Route::post('timecard', 'TimecardController@create');
    });