开发学院

您的位置:首页>技术文章>正文

技术文章

CodeIgniter 4中如何访问子目录的控制器?

开发学院2022-04-06 08:46:43

  我想要在CodeIgniter 4中访问子目录中的控制器,但是出于某种原因,我无法让它工作。

  例如,这是一个URL:www.example.com/admin/dashboard

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

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

namespace App\Controllers;
class Dashboard extends BaseController
{
    public function index()
    {

    }
}

  我试着把类名改成AdminDashboard,Admin_Dashboard,几乎是每个逻辑名,但是每次我都得到一个404错误,提示如下:

Controller or its method is not found: App\Controllers\Admin\Dashboard::index

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

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

更新#1

  我设法通过改变一些事情来使它工作:

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

class Dashboard extends Controller
{
    public function index()
    {

    }
}

  但现在它不会扩展BaseController,它有一些我为我的应用程序构建的核心功能。

  有什么想法可以让它扩展BaseController吗?

  我必须承认,我还没有太多关于命名空间的知识,所以这可能是我犯错误的原因。

解决方案

  正如我想象的那样,问题是我没有学会命名空间。我需要将使用线指向BaseController位置。

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

class Dashboard extends BaseController
{
    public function index()
    {

    }
}

  现在,www.example.com/admin/dashboard/像预期的那样,直接使用了那个指数函数。

其他方案

  可能需要在Router.php中增加如下映射

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