[laravel] Laravel Controller Subfolder routing

I'm new to Laravel. To try and keep my app organized I would like to put my controllers into subfolders of the controller folder.

controllers\
---- folder1
---- folder2

I tried to route to a controller, but laravel doesn't find it.

Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');

What am I doing wrong?

This question is related to laravel laravel-4 laravel-routing

The answer is


1.create your subfolder just like followings:

app
----controllers
--------admin
--------home

2.configure your code in app/routes.php

<?php
// index
Route::get('/', 'Home\HomeController@index');

// admin/test
Route::group(
    array('prefix' => 'admin'), 
    function() {
        Route::get('test', 'Admin\IndexController@index');
    }
);
?>

3.write sth in app/controllers/admin/IndexController.php, eg:

<?php
namespace Admin;

class IndexController extends \BaseController {

    public function index()
    {
        return "admin.home";
    }
}
?>

4.access your site,eg:localhost/admin/test you'll see "admin.home" on the page

ps: Please ignore my poor English


php artisan make:controller admin/CategoryController

Here admin is sub directory under app/Http/Controllers and CategoryController is controller you want to create inside directory


For those using Laravel 5 you need to set the namespace for the controller within the sub-directory (Laravel 5 is still in development and changes are happening daily)

To get a folder structure like:

Http
----Controllers
    ----Admin
            PostsController.php
    PostsController.php

namespace Admin\PostsController.php file like so:

<?php namespace App\Http\Controller\Admin;

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Then your route for this is:

$router->get('/', 'Admin\PostsController@index');

And lastly, don't for get to do either composer or artisan dump

composer dump-autoload

or

php artisan dump

I had this problem recently with laravel 5.8 but i underestand I should define controller in a right way like this below:

php artisan make:controller SubFolder\MyController  // true

Not like this:

php artisan make:controller SubFolder/MyController  // false

Then you can access the controller in routes/web.php like this:

Route::get('/my', 'SubFolder\MyController@index');

In my case I had a prefix that had to be added for each route in the group, otherwise response would be that the UserController class was not found.

Route::prefix('/user')->group(function() {
    Route::post('/login', [UserController::class, 'login'])->prefix('/user');
    Route::post('/register', [UserController::class, 'register'])->prefix('/user');
});

Just found a way how to do it:

Just add the paths to the /app/start/global.php

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/controllers/product',
    app_path().'/models',
    app_path().'/database/seeds',

));

In Laravel 5.6, assuming the name of your subfolder' is Api:

In your controller, you need these two lines:

namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;

And in your route file api.php, you need:

Route::resource('/myapi', 'Api\MyController');

For ** Laravel 5 or Laravel 5.1 LTS both **, if you have multiple Controllers in Admin folder, Route::group will be really helpful for you. For example:

Update: Works with Laravel 5.4

My folder Structure:

Http
----Controllers
    ----Api
          ----V1
                 PostsApiController.php
                 CommentsApiController.php
    PostsController.php

PostAPIController:

<?php namespace App\Http\Controllers\Api\V1;

use App\Http\Requests;
use App\Http\Controllers\Controller;   
use Illuminate\Http\Request;

class PostApiController extends Controller {  
...

In My Route.php, I set namespace group to Api\V1 and overall it looks like:

Route::group(
        [           
            'namespace' => 'Api\V1',
            'prefix' => 'v1',
        ], function(){

            Route::get('posts', ['uses'=>'PostsApiController@index']);
            Route::get('posts/{id}', ['uses'=>'PostssAPIController@show']);

    });

For move details to create sub-folder visit this link.


I am using Laravel 4.2. Here how I do it:
I have a directory structure like this one:
app
--controllers
----admin
------AdminController.php

After I have created the controller I've put in the composer.json the path to the new admin directory:

"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/admin",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
}, 

Next I have run

composer dump-autoload

and then

php artisan dump-autoload

Then in the routes.php I have the controller included like this:

Route::controller('admin', 'AdminController');

And everything works fine.


I think to keep controllers for Admin and Front in separate folders, the namespace will work well.

Please look on the below Laravel directory structure, that works fine for me.

app
--Http
----Controllers
------Admin
--------DashboardController.php
------Front
--------HomeController.php

The routes in "routes/web.php" file would be as below

/* All the Front-end controllers routes will work under Front namespace */

Route::group(['namespace' => 'Front'], function () {
    Route::get('/home', 'HomeController@index');
});

And for Admin section, it will look like

/* All the admin routes will go under Admin namespace */
/* All the admin routes will required authentication, 
   so an middleware auth also applied in admin namespace */

Route::group(['namespace' => 'Admin'], function () {
    Route::group(['middleware' => ['auth']], function() {            
        Route::get('/', ['as' => 'home', 'uses' => 'DashboardController@index']);                                   
    });
});

Hope this helps!!


Create controller go to cmd and the type php artisan make:controller auth\LoginController


If you're using Laravel 5.3 or above, there's no need to get into so much of complexity like other answers have said. Just use default artisan command to generate a new controller. For eg, if I want to create a User controller in User folder. I would type

php artisan make:controller User/User

In routes,

Route::get('/dashboard', 'User\User@dashboard');

doing just this would be fine and now on localhost/dashboard is where the page resides.

Hope this helps.


Add your controllers in your folders:

controllers\
---- folder1
---- folder2

Create your route not specifying the folder:

Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');

Run

composer dump-autoload

And try again


1) That is how you can make your app organized:

Every route file (web.php, api.php ...) is declared in a map() method, in a file

\app\Providers\RouteServiceProvider.php

When you mapping a route file you can set a ->namespace($this->namespace) for it, you will see it there among examples.

It means that you can create more files to make your project more structured!

And set different namespaces for each of them.

But I prefer set empty string for the namespace ""

2) You can set your controllers to rout in a native php way, see the example:

Route::resource('/users', UserController::class);
Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');

Now you can double click your controller names in your IDE to get there quickly and conveniently.


Examples related to laravel

Parameter binding on left joins with array in Laravel Query Builder Laravel 4 with Sentry 2 add user to a group on Registration Target class controller does not exist - Laravel 8 Visual Studio Code PHP Intelephense Keep Showing Not Necessary Error The POST method is not supported for this route. Supported methods: GET, HEAD. Laravel How to fix 'Unchecked runtime.lastError: The message port closed before a response was received' chrome issue? Post request in Laravel - Error - 419 Sorry, your session/ 419 your page has expired Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required How can I run specific migration in laravel Laravel 5 show ErrorException file_put_contents failed to open stream: No such file or directory

Examples related to laravel-4

Parameter binding on left joins with array in Laravel Query Builder Laravel 4 with Sentry 2 add user to a group on Registration 'Malformed UTF-8 characters, possibly incorrectly encoded' in Laravel Can I do Model->where('id', ARRAY) multiple where conditions? how to fix stream_socket_enable_crypto(): SSL operation failed with code 1 Rollback one specific migration in Laravel How can I resolve "Your requirements could not be resolved to an installable set of packages" error? Define the selected option with the old input in Laravel / Blade Redirect to external URL with return in laravel laravel the requested url was not found on this server

Examples related to laravel-routing

Laravel 5.2 Missing required parameters for [Route: user.profile] [URI: user/{nickname}/profile] Laravel: How to Get Current Route Name? (v5 ... v7) Set session variable in laravel Laravel 5 - redirect to HTTPS How Can I Remove “public/index.php” in the URL Generated Laravel? Download files in laravel using Response::download Laravel Controller Subfolder routing My Routes are Returning a 404, How can I Fix Them?