Laravel控制器子文件夹路由


95

我是Laravel的新手。为了使我的应用程序井井有条,我想将控制器放入控制器文件夹的子文件夹中。

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

我试图路由到控制器,但laravel找不到。

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

我究竟做错了什么?

Answers:


112

对于上述Laravel 5.3:

php artisan make:controller test/TestController

test如果该文件夹不存在,它将创建一个文件夹,然后在其中创建TestController

TestController 看起来像这样:

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

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

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

然后,您可以通过以下方式注册路线:

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

laravel 4.2有什么办法可以达到上述要求?
Sagar Arora

10
php artisan make:controller test\TestController创建testTestController.php而php artisan make:controller 'test\TestController'工作。(请注意引号)-Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha '18

72

将控制器添加到文件夹中:

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

创建未指定文件夹的路由:

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

composer dump-autoload

然后再试一次


我认为您也需要artisan dump-autoload还是composer dump-autoload足够?
reikyoushin 2013年

1
对于/ controllers,只需作曲。但是,如果您ClassLoader::addDirectories没有作曲家的东西,那么您也将需要工匠。
Antonio Carlos Ribeiro 2013年

我突然想起我遇到过类似的事情..请参阅我对OP答案的评论
reikyoushin 2013年

composer dump-autoload也为我工作。如果使用Windows操作系统,则可以使用.bat文件来运行,composer dump-autoload而不必每次都键入CMD。这就是我正在使用的: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa 2015年

7
如果在forlder1和folder2中有两个名称相同的控制器怎么办?例如:admin / PostsController.php和frontend / PostsController.php
zennin '16

50

对于使用Laravel 5的用户,您需要在子目录中设置控制器的名称空间(Laravel 5仍在开发中,并且每天都在发生变化)

要获得如下文件夹结构:

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

像这样的命名空间Admin \ PostsController.php文件:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

那么您的路线是:

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

最后,不要做作曲家或工匠转储

composer dump-autoload

要么

php artisan dump

从2015年1月23日开始为我工作。稍后可能会更改,因为L5尚未发布。
sehummel 2015年

感谢您的小花絮。在LV4中,您可以跳过“使用App \ Http \ Controllers \ Controller;” 语句,因为您扩展了直接从Controller继承的BaseController。LV5中不是这种情况,因为它直接扩展了Controller,并且PSR-4自动加载需要知道在哪里可以找到Controller。
莱昂内尔·莫里森

4
@user?php命名空间App \ Http \ Controller \ Admin; 应该是结尾为s的控制器
Sven van den Boogaart

这对我有用,但需要警告,我必须在作曲家声明中添加“ -o”,例如:composer dump-autoload -o
Scott Byers

这对我不起作用,现在出现错误消息,提示“ App\Http\Controllers\Auth\Controller找不到”,为什么将单词附加Controller在其中,并丢失控制器的实际名称?我认为这就是斜线。 -o没有帮助。
blamb

15

对于** Laravel 5或Laravel 5.1 LTS **,如果您在Admin文件夹中有多个Controller, Route::group将对您确实有帮助。例如:

更新资料:与Laravel 5.4一起使用

我的文件夹结构:

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

在My Route.php中,我将namespacegroup 设置为Api\V1,总体而言,它类似于:

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

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

    });

有关创建子文件夹的移动详细信息,请访问此链接


1
对于Laravel 5.4,这是我到目前为止发现的唯一解决方案。
mosh442

完美的解决方案
Ali Adil '18

确实完美!
Rytis Dereskevicius

改变游戏规则的人;-)
Strabek

9

1.创建子文件夹,如下所示:

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

2.在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.在app / controllers / admin / IndexController.php中写一些东西,例如:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4.访问您的站点,例如:localhost / admin / test,您将在页面上看到“ admin.home”

ps:请忽略我的英语不好


2
使用名称空间可避免命名冲突。+1
FDisk

6

刚刚找到了一种方法:

只需将路径添加到/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
错误。由于/ controllers已经在Laravel的composer.json库中,因此它下面的所有内容都会自动加载。您无需在global.php上添加/ controllers / product。
Antonio Carlos Ribeiro 2013年

1
@AntonioCarlosRibeiro我试图将模型放在文件夹中遇到了这个问题,但是转储作曲家和工匠的自动加载似乎不起作用。您必须将它们放在composer.json或global.php上
reikyoushin 2013年

2
这很容易检查:运行composer du后,打开vendor / composer / autoload_classmap.php,您的类必须在此处列出。
Antonio Carlos Ribeiro 2013年

6
php artisan make:controller admin/CategoryController

这里admin是app / Http / Controllers下的子目录,CategoryController是要在目录内创建的控制器


6

在Laravel 5.6中,假设子文件夹的名称为 Api

在您的控制器中,您需要这两行:

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

在路由文件中api.php,您需要:

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

5

我正在使用Laravel 4.2。这是我的操作方式:
我有一个像这样的目录结构:
app
--controllers
---- admin
------ AdminController.php

创建控制器后,将composer.json放入新管理目录的路径:

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

接下来我跑了

composer dump-autoload

然后

php artisan dump-autoload

然后在routes.php中,我包括了这样的控制器:

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

而且一切正常。


对于我和我的作品只需要运行“作曲家转储自动加载-o”
phuang07

无论如何我都在使用php artisan dump-autoload。
Todor Todorov 2014年

5

1)这样可以使您的应用程序井井有条:

每个路由文件(web.phpapi.php...)在map()方法中,在文件中声明

\app\Providers\RouteServiceProvider.php

映射路由文件时,您可以设置一个 ->namespace($this->namespace)为其,您将在示例中看到它。

这意味着您可以创建更多文件来使您的项目更加结构化!

并为它们分别设置不同的名称空间。

但我更喜欢设置 empty string为命名空间""

2)您可以将控制器设置为以本地php方式崩溃,请参见示例:

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

现在,您可以在IDE中双击您的控制器名称,以快速方便地到达那里。


最佳答案!完全与Laravel一致,并基于该框架已提供的现成的基础。
jfoliveira

4

如果您使用的是Laravel 5.3或更高版本,则无需像其他答案所说的那样陷入如此复杂的境地。只需使用默认artisan命令即可生成新的控制器。例如,如果我想UserUser文件夹中创建一个控制器。我会输入

php artisan make:controller User/User

在路线上

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

这样做就可以了,现在页面位于localhost / dashboard上。

希望这可以帮助。


3

我认为将Admin和Front的控制器保留在单独的文件夹中,名称空间将运行良好。

请查看下面的Laravel目录结构,该结构对我来说很好。

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

“ routes / web.php”文件中的路由如下

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

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

对于“管理员”部分,它看起来像

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

希望这可以帮助!!


1

我最近在laravel 5.8中遇到了这个问题,但我理解不足,我应该以如下所示的正确方式定义控制器:

php artisan make:controller SubFolder\MyController  // true

不是这样的:

php artisan make:controller SubFolder/MyController  // false

然后,您可以像下面这样在routes / web.php中访问控制器:

Route::get('/my', 'SubFolder\MyController@index');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.