Routage du sous-dossier du contrôleur Laravel


95

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

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

J'ai essayé de 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?

Réponses:


112

Pour Laravel 5.3 ci-dessus:

php artisan make:controller test/TestController

Cela créera le testdossier s'il n'existe pas, puis crée à l' TestControllerinté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";
    }
}

Vous pouvez ensuite enregistrer votre itinéraire de cette façon:

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

y a-t-il un moyen d'atteindre la même chose pour laravel 4.2
Sagar Arora

10
php artisan make:controller test\TestControllercrée testTestController.php alors que php artisan make:controller 'test\TestController'fonctionne. (Notez les citations) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

72

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


je pense que vous avez besoin artisan dump-autoloadaussi ou est-ce composer dump-autoloadsuffisant?
reikyoushin le

1
Pour / controllers, juste composer. Mais si vous avez quelque chose que ClassLoader::addDirectoriesvous n'avez pas sur le compositeur, vous aurez également besoin d'un artisan.
Antonio Carlos Ribeiro

Je me suis soudainement souvenu que j'avais rencontré quelque chose comme ça .. voir mon commentaire sur la réponse du PO
reikyoushin

composer dump-autoloadtravaille pour moi aussi. Si vous utilisez le système d'exploitation Windows, vous pouvez utiliser un fichier .bat à la composer dump-autoloadplace pour taper CMD à chaque fois. Voici ce que j'utilise: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
Et si nous avons deux contrôleurs avec le même nom dans forlder1 et folder2? Par exemple: admin / PostsController.php et frontend / PostsController.php
zennin

50

Pour ceux qui utilisent Laravel 5, vous devez définir l'espace de noms du contrôleur dans le sous-répertoire (Laravel 5 est toujours en développement et des changements se produisent quotidiennement)

Pour obtenir une structure de dossiers comme:

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

namespace Admin \ PostsController.php comme suit:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Ensuite, votre itinéraire pour cela est:

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

Et enfin, ne faites pas de dépôt de compositeur ou d'artisan

composer dump-autoload

ou

php artisan dump

A travaillé pour moi, à partir du 23/01/15. Cela peut changer plus tard car L5 n'est pas encore sorti.
sehummel

Merci pour cette petite friandise. Dans LV4, vous avez pu ignorer l'option 'use App \ Http \ Controllers \ Controller;' car vous avez étendu le BaseController qui hérite directement de Controller. Ce n'est pas le cas dans LV5 car il étend directement le contrôleur et le chargement automatique du PSR-4 doit savoir où trouver le contrôleur.
Lionel Morrison

4
@user? espace de noms php App \ Http \ Controller \ Admin; devrait être contrôleur [s] avec s à la fin
Sven van den Boogaart

Cela a fonctionné pour moi, avec la mise en garde que je devais ajouter "-o" à la déclaration du compositeur, par exemple: composer dump-autoload -o
Scott Byers

Cela n'a pas fonctionné pour moi, le message d'erreur dit maintenant App\Http\Controllers\Auth\Controllerintrouvable, pourquoi y ajoute-t-il le mot Controlleret perd-il le nom réel du contrôleur? Je pense que c'est la barre oblique qui fait ça. -on'a pas aidé.
blamb

15

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

Mise à jour : 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 My Route.php, j'ai défini le namespacegroupe sur Api\V1et 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 les détails de déplacement pour créer un sous-dossier, visitez ce lien .


1
Pour Laravel 5.4, c'est la seule solution que j'ai trouvée jusqu'à présent.
mosh442

Solution parfaite
Ali Adil

Parfait en effet!
Rytis Dereskevicius le

Changeur de jeu ;-)
Strabek

9

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 qc dans app / controllers / admin / IndexController.php, par exemple:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

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

ps: Veuillez ignorer mon mauvais anglais


2
L'utilisation de l'espace de noms évite la collision de noms. +1
FDisk

6

Je viens de trouver un moyen de le faire:

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

ClassLoader::addDirectories(array(

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

));

5
Faux. Puisque / controllers est déjà dans la base composer.json de Laravel, tout ce qui se trouve en dessous est automatiquement chargé. Vous n'avez pas besoin d'ajouter / controllers / product sur votre global.php.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro J'ai eu ce problème en essayant de mettre des modèles dans des dossiers, mais le vidage des autoloads des compositeurs et des artisans ne semble pas fonctionner. vous devez les mettre sur composer.json ou sur global.php
reikyoushin

2
C'est facile à vérifier: après avoir exécuté composer du, ouvrez vendor / composer / autoload_classmap.php et votre classe doit y figurer.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Ici, l'administrateur est le sous-répertoire sous app / Http / Controllers et CategoryController est le contrôleur que vous souhaitez créer dans le répertoire


6

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 d'itinéraire api.php, vous avez besoin de:

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

5

J'utilise Laravel 4.2. Voici comment je fais:
J'ai une structure de répertoires comme celle-ci:
app
--controllers
---- admin
------ AdminController.php

Après avoir créé le contrôleur, j'ai mis dans le composer.json le chemin vers le nouveau répertoire d'administration:

"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

puis

php artisan dump-autoload

Ensuite, dans le routes.php, j'ai le contrôleur inclus comme ceci:

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

Et tout fonctionne bien.


Fonctionne pour moi et je n'ai besoin que d'exécuter 'composer dump-autoload -o'
phuang07

Pour tous les cas, j'utilise aussi php artisan dump-autoload.
Todor Todorov

5

1) Voici comment organiser votre application:

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

\app\Providers\RouteServiceProvider.php

Lorsque vous mappez un fichier d'itinéraire, vous pouvez en définir un ->namespace($this->namespace), 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 stringpour l'espace de noms""

2) Vous pouvez configurer vos contrôleurs pour qu'ils routent de manière native php, voir l'exemple:

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

Vous pouvez maintenant double-cliquer sur les noms de vos contrôleurs dans votre IDE pour y accéder rapidement et facilement.


Meilleure réponse! Totalement cohérent avec Laravel et construit au-dessus de ce que le framework fournit déjà prêt à l'emploi.
jfoliveira

4

Si vous utilisez Laravel 5.3 ou supérieur, il n'est pas nécessaire d'entrer dans une telle complexité comme l'ont dit d'autres réponses. Utilisez simplement la commande artisan par défaut pour générer un nouveau contrôleur. Par exemple, si je veux créer un Usercontrôleur dans un Userdossier. Je taperais

php artisan make:controller User/User

Dans les itinéraires,

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

faire juste cela serait bien et maintenant, sur localhost / dashboard, c'est là que réside la page.

J'espère que cela t'aides.


3

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

Veuillez regarder 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!!


1

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

php artisan make:controller SubFolder\MyController  // true

Pas comme ça:

php artisan make:controller SubFolder/MyController  // false

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

Route::get('/my', 'SubFolder\MyController@index');
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.