Codeigniter 4 无法访问页面,被路由覆盖

Codeigniter 4 Couldn't access a page, overridden by routes

所以我在 Buku 控制器中有一个方法可以显示带有 url

的书籍的详细信息

example.com/buku/detail/slug

我想进行更改,以便您可以使用如下所示的 slug 查找书籍

example.com/buku/slug

我添加了以下代码的路由

$routes->get('/buku/(:segment)', 'Buku::/detail/')

它运行完美。之后,我添加了一个转到方法 'tambah'

的按钮

example.com/buku/tambah

但是每次点击按钮时,它都会以某种方式显示您无法转到上面的 url 的错误,因为 /detail/

中没有 'tambah' slug

我认为问题出在我添加的路由中。我是否遗漏了一些重要的东西?

这是详细方法

public function detail($slug)
    {
        $data = [
            'title' => 'Detail Buku',
            'buku' => $this->bukuModel->getBuku($slug)
        ];

        return view('buku/detail', $data);
    }

这是布库模型

class BukuModel extends Model
{
    protected $table = 'buku';
    protected $useTimestamps = true;

    public function getBuku($slug = false)
    {
        if ($slug == false) {
            return $this->findAll();
        }

        return $this->where(['slug' => $slug])->first();
    }
}

编辑:为信息添加了更多代码

在工作中,我注意到 CI4 与之前使用 CI3 的体验略有不同,但同时 CI4 为管理应用程序路由提供了更多可能性。

在您提供的示例中,detail 方法的参数名称与方法名称 tambah 之间没有区别。因此,基于 CI4 的应用程序不知道哪条路线是正确的。正如我提到的,CI4 针对您的问题提出了一些解决方案。

  1. CI4 - URI Routing - Mapping multiple routes - 在您的情况下,map() 方法会更方便。值得强调的是,级联可以对正常运行产生影响,符合您的预期。
  2. CI4 - Controllers - Remapping Method Calls -控制器中使用的_remap()方法可以让你忽略默认的方法调用,让你可以。

很遗憾,我看不到 tambah 的代码,所以我不知道它是否有任何参数。您的 _remap() 代码可能如下所示:

public function _remap($method,...$params)
{
    switch ($method) {
        case 'tambah':
            return $this->$method(...$params);
            break;
        default:
            return return $this->detail(...$params);
            break;
    }
}