我在CodeIgniter中使用HMVC模式。我有一个控制器通过modules :: run()函数加载2个模块,并将参数传递给每个模块。
如果任一模块与传递的参数不匹配,我想调用show_404()。它可以工作,但它在我现有的模板中加载了错误页面的完整HTML,因此HTML中断并且看起来很糟糕。我想我希望它重定向到错误页面,因此它不会运行第二个模块。有没有办法做到这一点而不是改变URL?
是否可以在不更改URL的情况下从模块重定向到show_404()?
以下是一个简单的例子:
www.example.com/users/profile/usernamehere
url在用户控制器中调用此函数:
function profile($username)
{
echo modules::run('user/details', $username);
echo modules::run('user/friends', $username);
}
运行这些模块,查看用户是否存在:
function details($username)
{
$details = lookup_user($username);
if($details == 'User Not Found')
show_404(); // This seems to display within the template when what I want is for it to redirect
else
$this->load->view('details', $details);
}
function friends($username)
{
$details = lookup_user($username);
if($friends == 'User Not Found')
show_404(); // Redundant, I know, just added for this example
else
$this->load->view('friends', $friends);
}
我想有更好的方法,但我没有看到它。有什么想法吗?
答案 0 :(得分:11)
如果子模块中存在错误,您可以抛出异常并在控制器中捕获此异常,然后执行show_404()
。
<强>控制器:强>
function profile($username)
{
try{
$out = modules::run('user/details', $username);
$out .= modules::run('user/friends', $username);
echo $out;
}
catch(Exception $e){
show_404();
}
}
<强>子模块:强>
function details($username)
{
$details = lookup_user($username);
if($details == 'User Not Found')
throw new Exception();
else
// Added third parameter as true to be able to return the data, instead of outputting it directly.
return $this->load->view('details', $details,true);
}
function friends($username)
{
$details = lookup_user($username);
if($friends == 'User Not Found')
throw new Exception();
else
return $this->load->view('friends', $friends,true);
}
答案 1 :(得分:0)
您可以使用此功能重定向404找不到页面。
if ( ! file_exists('application/search/'.$page.'.php')) {
show_404(); // redirect to 404 page
}
答案 2 :(得分:-3)
非常简单,我解决了问题
请控制器名称的第一个字母必须是大写字母,例如
带
的控制器页面应为Pages
并保存同名的Pages.php而不是pages.php的cotroler文件 同样适用于模型类
享受