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?
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');
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
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
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
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 .
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.
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',
));
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.
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.
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');
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!!
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');
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.