从局部视图重定向到Codeigniter中的show_404

时间:2012-07-11 00:11:30

标签: codeigniter http-status-code-404 hmvc

我在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);
}

我想有更好的方法,但我没有看到它。有什么想法吗?

3 个答案:

答案 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文件 同样适用于模型类

享受