如何在CodeIgniter 4中使用子目录控制器?

12

我需要帮忙在CodeIgniter 4中使用子目录控制器。

出于某些原因,我就是不能让它工作。

这是一个例子的URL: www.example.com/admin/dashboard

在控制器文件夹中,我创建了一个名为Admin的文件夹和一个名为Dashboard.php的文件。

我在Dashboard.php中使用了这段代码:

namespace App\Controllers;

class Dashboard extends BaseController
{
    public function index()
    {

    }
}

我尝试将类名更改为AdminDashboardAdmin_Dashboard以及其他逻辑名称,但每次都会出现404错误,显示:

控制器或其方法未找到: App\Controllers\Admin\Dashboard::index

我知道文件本身成功加载,但我认为我没有正确声明类名,它一直向我抛出那些404错误。

不幸的是,CI4的文档没有提供有关应该如何命名类名的任何信息......


更新#1

我通过更改几件事情使其工作:

namespace App\Controllers\Admin;
use CodeIgniter\Controller;

class Dashboard extends Controller
{
    public function index()
    {

    }
}

但现在它不会继承 BaseController,而我为我的应用程序构建了一些核心功能。

有任何想法如何让它扩展 BaseController 吗?

我必须承认我对命名空间的了解并不多,所以这可能是我错误的原因。

4个回答

19

正如我所想,问题在于我没有学习命名空间。我需要将use行指向BaseController的位置。

namespace App\Controllers\Admin;
use App\Controllers\BaseController;

class Dashboard extends BaseController
{
    public function index()
    {

    }
}

现在,www.example.com/admin/dashboard/ 正如预期地直接进入那个索引函数。


1
有了这些知识,你可以实现类似HMVC的结构和任何你喜欢的东西。 - TimBrownlaw
你是如何映射路由的? - bob269
还有一件事是,您不应该在控制器文件夹中命名一个名为Admin的控制器,否则它将无法工作,或者您可以使用路由来解决此问题。 - rufaidulk
  1. 子文件夹名称的重要事项是首字母要大写。
  2. 路由不需要更改。
  3. 命名空间似乎在此评论时不区分大小写。App/Controller/Admin、app/controller/admin、App/Controller/admin 看起来都可以正常工作。
- Xylo

2
php spark make:controller /Subfolder/ControllerName

欢迎来到Stack Overflow!虽然这段代码可能回答了问题,但提供关于它是如何解决问题的额外上下文信息会提高答案的长期价值。 - Sven Eberth
php spark 可以创建正确大小写的子文件夹、控制器和类名。这可以避免手动输入文件夹名称、控制器名称和控制器内部类名称时出现的不正确的大小写错误。 - Xylo

0
路由映射可以非常简单,例如:
$routes->group('admin', static function ($routes) {
    $routes->get('dashboard', 'Admin\Dashboard::index');
});

0
$routes->add('/(.+?)_(.+?)/(.+?)$', 'subdir\\\\$1_$2::$3');
$routes->add('/(.+?)_(.+?)$', 'subdir\\\\$1_$2::index');

我能够使用这个设置进行映射。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接