我有一个控制器App/Controller/Api/Orders. php
<?php
namespace App\Controllers\Api;
use CodeIgniter\RESTful\ResourceController;
class Orders extends ResourceController
{
protected $modelName = 'App\Models\Order';
protected $format = 'json';
public function getIndex()
{
return $this->respond($this->model->findAll());
}
public function delete($id = null)
{
return $this->respond(['test' => 123]);
}
}
当我尝试用GET请求访问/api/orders/
时,它工作正常(所以自动路由工作正常)。
但当我试图发送DELETE请求时:/api/orders/15
我得到了错误404。我做错了什么?让我感到困惑的主要原因是Codeigniter 4 RESTful文档似乎讨论了手动路由或传统自动路由,但没有讨论需要指定methodFunction
(如getIndex
)的改进版本。
运行php spark routes
得到以下结果:
+--------------+------------------+------+---------------------------------------+----------------+---------------+
| Method | Route | Name | Handler | Before Filters | After Filters |
+--------------+------------------+------+---------------------------------------+----------------+---------------+
| GET(auto) | api/orders | | \App\Controllers\Api\Orders::getIndex | | toolbar |
| DELETE(auto) | api/orders/[/..] | | \App\Controllers\Api\Orders::delete | <unknown> | <unknown> |
代码点火器版本:4.3.1
app/Config/Routes.php
$routes->setDefaultNamespace('App\Controllers');
$routes->setDefaultController('Auth');
$routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
$routes->get('/', 'Home::index');
app/Config/Filters.php
public array $globals = [
'before' => [
// 'honeypot',
// 'csrf',
// 'invalidchars',
],
'after' => [
'toolbar',
// 'honeypot',
// 'secureheaders',
],
];
1条答案
按热度按时间35g0bw711#
溶液:
除了使用 * HTTP动词 *(即
delete
)作为控制器方法的前缀之外,您还需要提供 "控制器方法名称" 作为后缀,即:httpVerbMethodName
.代替:
使用这个:
http://localhost:4599/api/orders/order/15
**参考:
URI段
URL中的段,遵循模型-视图-控制器方法,通常表示:
1.第一段表示应该调用的控制器类。
1.第二段表示应该调用的类方法。
1.第三段以及任何附加段表示ID和将传递给控制器的任何变量。
考虑以下URI:
在上面的例子中,当您使用GET方法发送HTTP请求时,Auto Routing将尝试查找名为
App\Controllers\Helloworld
的控制器,并执行getHello()
方法,并将'1'
作为第一个参数传递。将由自动路由(改进)执行的控制器方法需要HTTP动词(
get
、post
、put
等)前缀,如getIndex()
、postCreate()
。更多信息请参见控制器中的自动路由。