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?

Tino
la source

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');
Ja22
la source
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

Antonio Carlos Ribeiro
la source
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
utilisateur2014679
la source
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 .

Ariful Haque
la source
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

Mervyn
la source
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',

));
Tino
la source
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

Dipen
la source
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');
DevonDahon
la source
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.

Todor Todorov
la source
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.

Yevgeniy Afanasyev
la source
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.

Koushik Das
la source
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!!

Mahesh Yadav
la source
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');
Foad
la source