web-dev-qa-db-fra.com

Routage des sous-dossiers du contrôleur Laravel

Je suis nouveau à Laravel. Pour essayer de garder mon application organisée, j'aimerais placer mes contrôleurs dans des sous-dossiers du dossier du contrôleur.

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

J'ai essayé de me diriger vers un contrôleur, mais Laravel ne le trouve pas. 

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

Qu'est-ce que je fais mal? 

67
Tino

pour Laravel 5.3 ci-dessus

php artisan make:controller test/TestController

Cela créera un dossier de test s'il n'existe pas, puis crée TestController à l'intérieur.

TestController ressemblera à ceci: 

<?php
namespace App\Http\Controllers\test;

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

class TestController extends Controller
{
    public function getTest()
    {
        return "Yes";
    }
}
?>

Dans les itinéraires,

Route::get('/test','test\TestController@getTest');
67
Ja22

Ajoutez vos contrôleurs dans vos dossiers:

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

Créez votre itinéraire sans spécifier le dossier:

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

Courir 

composer dump-autoload

Et essayez à nouveau

67

Pour ceux qui utilisent Laravel 5, vous devez définir l’espace de nom du contrôleur dans le sous-répertoire (Laravel 5 est en cours de développement et des modifications sont apportées quotidiennement).

Pour obtenir une structure de dossier telle que:

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

namespace Admin\PostsController.php comme ceci:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Alors votre itinéraire pour ceci est:

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

Et enfin, ne faites pas pour obtenir soit compositeur ou artisan dump

composer dump-autoload

ou

php artisan dump
48
user2014679

1.créez votre sous-dossier comme suit:

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

2.configurez votre code dans 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.écrivez sth dans app/controllers/admin/IndexController.php, par exemple:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4.accédez à votre site, par exemple: localhost/admin/test Vous verrez "admin.home" sur la page

ps: S'il vous plaît ignorer mon pauvre anglais

9
Mervyn

Pour ** Laravel 5 ou Laravel 5.1 LTS **, si vous avez plusieurs contrôleurs dans le dossier Admin, Route::group vous sera vraiment utile. Par exemple: 

Update: Fonctionne avec Laravel 5.4

Ma structure de dossier:

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 {  
...

Dans Mon Route.php, j'ai défini le groupe namespace à Api\V1 et, dans l'ensemble, il ressemble à:

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

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

    });

Pour plus de détails sur le déplacement afin de créer un sous-dossier, visitez le link .

7
Ariful Haque
php artisan make:controller admin/CategoryController

Ici Admin est un sous-répertoire sous app/Http/Controllers et CategoryController est le contrôleur que vous souhaitez créer dans le répertoire.

6
Dipen

Je viens de trouver un moyen de le faire:

Ajoutez simplement les chemins au /app/start/global.php

ClassLoader::addDirectories(array(

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

));
6
Tino

J'utilise Laravel 4.2. Voici comment je le fais: 
J'ai une structure de répertoire comme celle-ci: 
app
-- contrôleurs
---- admin
------ AdminController.php

Après avoir créé le contrôleur, j'ai mis dans le fichier composer.json le chemin d'accès au nouveau répertoire admin 

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

Ensuite j'ai couru

composer dump-autoload

et alors 

php artisan dump-autoload

Ensuite, dans le fichier routes.php, le contrôleur est inclus comme ceci: 

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

Et tout fonctionne bien.

5
TodStoychev

Si vous utilisez Laravel 5.3 ou une version ultérieure, inutile de vous perdre dans la complexité, comme le disent d’autres réponses… .. Utilisez simplement la commande artisan par défaut pour générer un nouveau contrôleur créer un contrôleur User dans le dossier User . Je taperais 

php artisan make:controller User/User

Dans les itinéraires, 

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

faire cela serait très bien et maintenant, sur la page localhost/dashboard se trouve la page.

J'espère que cela t'aides.

4
Koushik Das

Dans Laravel 5.6, en supposant que le nom de votre sous-dossier 'est Api:

Dans votre contrôleur, vous avez besoin de ces deux lignes:

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

Et dans votre fichier de route api.php, vous avez besoin de:

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

Je pense que pour garder les contrôleurs pour Admin et Front dans des dossiers séparés, l’espace de noms fonctionnera bien.

S'il vous plaît regardez sur la structure de répertoires Laravel ci-dessous, cela fonctionne très bien pour moi.

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

Les routes dans le fichier "routes/web.php" seraient comme ci-dessous

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

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

Et pour la section Admin, cela ressemblera à

/* 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']);                                   
    });
});

J'espère que cela t'aides!!

2
Mahesh Yadav

j'ai eu ce problème récemment avec laravel 5.8 mais je comprends que je devrais définir le contrôleur de la bonne manière, comme ci-dessous:

php artisan make:controller SubFolder\MyController  // true

pas comme ça:

php artisan make:controller SubFolder/MyController  // false

alors vous pouvez accéder au contrôleur dans routes/web.php comme ceci:

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

Voici comment vous pouvez organiser votre application:

Chaque fichier de route (web.php, api.php ...) est déclaré dans une méthode map(), dans un fichier 

\app\Providers\RouteServiceProvider.php

Lorsque vous mappez un fichier de route, vous pouvez définir une ->namespace($this->namespace) pour celui-ci, vous le verrez parmi des exemples.

Cela signifie que vous pouvez créer plus de fichiers pour rendre votre projet plus structuré!

Et définissez des espaces de noms différents pour chacun d'eux.

Mais je préfère définir empty string pour l'espace de noms ""

Il vous donne paramétrer vos contrôleurs pour qu'ils routent de façon php native, voir l'exemple:

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

Maintenant, vous pouvez double-cliquer sur le nom de votre contrôleur dans votre IDE pour vous y rendre rapidement et facilement.

0
Yevgeniy Afanasyev