Codeigniter 4 - REST,改进了自动路由

50few1ms  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个控制器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',
    ],
];
35g0bw71

35g0bw711#

溶液:

除了使用 * HTTP动词 *(即delete)作为控制器方法的前缀之外,您还需要提供 "控制器方法名称" 作为后缀,即:httpVerbMethodName.
代替:

public function delete($id = null)
{
   // ...
}

使用这个:

public function deleteOrder($id = null)
{
   // ...
}
  • 路线终点:*
    • 删除:http://localhost:4599/api/orders/order/15**
| DELETE(auto) | api/orders/order[/..] |      | \App\Controllers\Api\Orders::deleteOrder |                | toolbar
参考:

URI段
URL中的段,遵循模型-视图-控制器方法,通常表示:

example.com/class/method/ID

1.第一段表示应该调用的控制器
1.第二段表示应该调用的类方法
1.第三段以及任何附加段表示ID和将传递给控制器的任何变量。
考虑以下URI:

example.com/index.php/helloworld/hello/1

在上面的例子中,当您使用GET方法发送HTTP请求时,Auto Routing将尝试查找名为App\Controllers\Helloworld的控制器,并执行getHello()方法,并将'1'作为第一个参数传递。

    • 注**

将由自动路由(改进)执行的控制器方法需要HTTP动词(getpostput等)前缀,如getIndex()postCreate()
更多信息请参见控制器中的自动路由。

相关问题