我无法使用 CodeIgniter 4 框架创建 Restful API。
我使用
$routes->resource()
来定义方法。但是,我无法获取http://localhost:8080/type-blood
和其他地址来返回我想要的东西。
我在项目中正确配置了数据库并进行了选择以查看数据。
{
"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.']);
}
}
不幸的是,您不能使用限定名称来指定 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']);
我创建了一个错误问题报告,所以也许会在以后的版本中修复。