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 针对您的问题提出了一些解决方案。
- CI4 - URI Routing - Mapping multiple routes - 在您的情况下,map() 方法会更方便。值得强调的是,级联可以对正常运行产生影响,符合您的预期。
- 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;
}
}
所以我在 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/
我认为问题出在我添加的路由中。我是否遗漏了一些重要的东西?
这是详细方法
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 针对您的问题提出了一些解决方案。
- CI4 - URI Routing - Mapping multiple routes - 在您的情况下,map() 方法会更方便。值得强调的是,级联可以对正常运行产生影响,符合您的预期。
- 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;
}
}