CodeIgniter4:找不到控制器或其方法:\App\Controllers\App\Controllers\TypeBloodController::index

问题描述 投票:0回答:1

我无法使用 CodeIgniter 4 框架创建 Restful API,我使用

$routes->resource()
来定义我将使用的方法。但是,我无法获取
http://localhost:8080/type-blood
和其他地址来返回我想要的内容。我不知道如何解决这个问题。我在项目中正确配置了数据库,并选择查看数据并且也可以工作。

在 Postman 中返回给我的是:

{
  "title": "CodeIgniter\\Exceptions\\PageNotFoundException",
  "type": "CodeIgniter\\Exceptions\\PageNotFoundException",
  "code": 404,
  "message": "Controller or its method is not found: \\App\\Controllers\\App\\Controllers\\TypeBloodController::index",
  "file": "/home/faker/CodeIgniter/c4/vendor/codeigniter4/framework/system/CodeIgniter.php",
  "line": 988,
  "trace": [
    {
      "file": "/home/faker/CodeIgniter/c4/vendor/codeigniter4/framework/system/CodeIgniter.php",
      "line": 988,
      "function": "forPageNotFound",
      "class": "CodeIgniter\\Exceptions\\PageNotFoundException",
      "type": "::"
    },
    {
      "file": "/home/faker/CodeIgniter/c4/vendor/codeigniter4/framework/system/CodeIgniter.php",
      "line": 370,
      "function": "display404errors",
      "class": "CodeIgniter\\CodeIgniter",
      "type": "->"
    },
    {
      "file": "/home/faker/CodeIgniter/c4/public/index.php",
      "line": 79,
      "function": "run",
      "class": "CodeIgniter\\CodeIgniter",
      "type": "->"
    },
    {
      "file": "/home/faker/CodeIgniter/c4/vendor/codeigniter4/framework/system/Commands/Server/rewrite.php",
      "line": 47,
      "args": [
        "/home/faker/CodeIgniter/c4/public/index.php"
      ],
      "function": "require_once"
    }
  ]
}

Route.php

<?php

use CodeIgniter\Router\RouteCollection;
use App\Controllers\TypeBloodController;

/**
 * @var RouteCollection $routes
 */

$routes->resource('type-blood', ['controller' => TypeBloodController::class]);

$routes->get('/', 'Home::index');

TypeBloodController.php

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\TypeBloodModel;

class TypeBloodController extends BaseController
{
    public function index()
    {
        $type_blood = new TypeBloodModel();
        $datas = $type_blood->findAll();
        $this->response->setContentType('application/json');
        return $this->response->setJSON($datas);
    }

    public function store()
    {
        $type_blood = new TypeBloodModel();
        $validation = $type_blood->getRuleGroup('blood_store');
        $this->response->setContentType('application/json');
        return $this->response->setStatusCode(200)->setJSON(['message' => 'Insertion done.']);
    }

    public function show($id)
    {
        $type_blood = new TypeBloodModel();
        $register = $type_blood->find($id);
        if (!$type_blood) {
            return $this->response->setStatusCode(404)->setJSON(['message' => "Register not found."]);
        }
        $this->response->setContentType('application/json');
        return $this->response->setJSON($register);
    }

    public function update($id)
    {
        $type_blood = new TypeBloodModel();
        $register = $type_blood->find($id);
        if (!$register) {
            return $this->response->setStatusCode(404)->setJSON(['message' => "Register updated."]);
        }
        $validation = $registro->getRuleGroup('blood_update');
        $this->response->setContentType('application/json');
        return $this->response->setJSON($register);
    }

    public function destroy($id)
    {
        $type_blood = new TypeBloodModel();
        $register = $type_blood->find($id);
        if (!$register) {
            return $this->response->setStatusCode(404)->setJSON(['message' => "Register not found"]);
        }
        $register->delete($id);
        $this->response->setContentType('application/json');
        return $this->response->setStatusCode(200)->setJSON(['message' => 'Exclusion done.']);
    }
}

php codeigniter codeigniter-4
1个回答
0
投票

不幸的是,您不能使用限定名称来指定 controller 选项。 根据文档,这是可能的,但这似乎是一个小错误,因为在这种情况下它会重复命名空间。

您可以随时使用 Spark 命令检查您的路线。检查处理程序栏。

php spark routes

在我的例子中,处理程序是: \App\Controllers\App\Controllers\Home::index,但它应该是: \App\Controllers\Home::index

您可以简单地修复它:

$routes->resource('type-blood', ['controller' => 'TypeBloodController']);

注意:如果您的资源和控制器名称相同,则可以省略 controller 选项。因此,您可以从技术上将控制器名称更改为TypeBlood,将文件名更改为TypeBlood.php。然后只需删除 controller 选项即可。

注意:如果您的控制器不在 App\Controllers 命名空间中,您可以使用 namespace 选项指定。例如:

$routes->resource('type-blood', ['controller' => 'TypeBloodController', 'namespace' => 'NotApp\Controllers']);

我创建了一个错误问题报告,所以也许会在以后的版本中修复。

© www.soinside.com 2019 - 2024. All rights reserved.