Laravel Controller子文件夹路由

Tin*_*ino 76 laravel laravel-4 laravel-routing

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

controllers\
---- folder1
---- folder2
Run Code Online (Sandbox Code Playgroud)

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

Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ja2*_*a22 82

对于Laravel 5.3以上

php artisan make:controller test/TestController
Run Code Online (Sandbox Code Playgroud)

这将创建测试文件夹,如果它不存在,然后创建test内部.

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

在路线中

Route::get('/test','test\TestController@getTest');
Run Code Online (Sandbox Code Playgroud)

  • `php artisan make:controller test\TestController`创建testTestController.php而``php artisan make:controller'test\TestController'`工作.(注意行情) - Laravel 5.4 (9认同)
  • ```php artisan make:controller test/TestController``` (2认同)

Ant*_*iro 69

在文件夹中添加控制器:

controllers\
---- folder1
---- folder2
Run Code Online (Sandbox Code Playgroud)

创建不指定文件夹的路线:

Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');
Run Code Online (Sandbox Code Playgroud)

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

然后再试一次

  • 如果我们在forlder1和folder2中有两个具有相同名称的控制器怎么办?例如:admin/PostsController.php和frontend/PostsController.php (7认同)

小智 48

对于使用Laravel 5的用户,您需要在子目录中设置控制器的命名空间(Laravel 5仍在开发中,并且每天都在进行更改)

要获得如下文件夹结构:

Http
----Controllers
    ----Admin
            PostsController.php
    PostsController.php
Run Code Online (Sandbox Code Playgroud)

命名空间Admin\PostsController.php文件如下:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}
Run Code Online (Sandbox Code Playgroud)

那你的路线是:

$router->get('/', 'Admin\PostsController@index');
Run Code Online (Sandbox Code Playgroud)

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

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

要么

php artisan dump
Run Code Online (Sandbox Code Playgroud)

  • @user?php namespace App\Http\Controller\Admin; 最后应该是带有s的Controller [s] (4认同)

小智 9

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

app
----controllers
--------admin
--------home
Run Code Online (Sandbox Code Playgroud)

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');
    }
);
?>
Run Code Online (Sandbox Code Playgroud)

3.写在app/controllers/admin/IndexController.php中,例如:

<?php
namespace Admin;

class IndexController extends \BaseController {

    public function index()
    {
        return "admin.home";
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

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

ps:请忽略我可怜的英语

  • 使用命名空间可以避免命名冲突。+1 (2认同)

Ari*_*que 9

对于**Laravel 5或Laravel 5.1 LTS**,如果你在Admin文件夹中有多个控制器,Route::group对你真的很有帮助.例如:

更新:适用于Laravel 5.4

我的文件夹结构:

Http
----Controllers
    ----Api
          ----V1
                 PostsApiController.php
                 CommentsApiController.php
    PostsController.php
Run Code Online (Sandbox Code Playgroud)

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 {  
...
Run Code Online (Sandbox Code Playgroud)

在My Route.php中,我将namespace组设置为Api\V1整体,它看起来像:

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

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

    });
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*hon 8

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

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

namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
Run Code Online (Sandbox Code Playgroud)

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

Route::resource('/myapi', 'Api\MyController');
Run Code Online (Sandbox Code Playgroud)


Tin*_*ino 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',

));
Run Code Online (Sandbox Code Playgroud)

  • 错误.由于/ controllers已经在Laravel的composer.json基础中,因此它下面的任何内容都会自动自动加载.您不需要在global.php上添加/ controllers/product. (5认同)
  • 这很容易检查:在运行composer du之后,打开vendor/composer/autoload_classmap.php并且必须在那里列出你的类. (2认同)

Dip*_*pen 6

php artisan make:controller admin/CategoryController
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是Laravel 5.x的接受答案 (2认同)

Tod*_*rov 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"
]
}, 
Run Code Online (Sandbox Code Playgroud)

接下来我跑了

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

然后

php artisan dump-autoload
Run Code Online (Sandbox Code Playgroud)

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

Route::controller('admin', 'AdminController');
Run Code Online (Sandbox Code Playgroud)

一切正常.


Kou*_*Das 5

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

php artisan make:controller User/User
Run Code Online (Sandbox Code Playgroud)

在航线上,

Route::get('/dashboard', 'User\User@dashboard');
Run Code Online (Sandbox Code Playgroud)

这样做就可以了,现在 localhost/dashboard 就是页面所在的位置。

希望这可以帮助。


Yev*_*yev 5

1) 这就是你如何组织你的应用程序:

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

\app\Providers\RouteServiceProvider.php
Run Code Online (Sandbox Code Playgroud)

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

这意味着您可以创建更多文件,使您的项目更有条理!

并为每一个设置不同的命名空间。

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

2)您可以将控制器设置为以原生 php 方式路由,请参见示例:

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

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