4

我在 CodeIgniter 中使用 HMVC 模式。我有一个控制器,它通过 modules::run() 函数加载 2 个模块,并将一个参数传递给每个模块。

如果任一模块无法匹配传递的参数,我想调用 show_404()。它可以工作,但它会在我现有的模板中加载错误页面的完整 HTML,因此 HTML 会中断并且看起来很糟糕。我想我希望它重定向到错误页面,这样它就不会运行第二个模块。有没有办法做到这一点而不改变网址?

是否可以在不更改 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);
}

我想只有更好的方法可以解决它,但我没有看到它。有任何想法吗?

4

3 回答 3

14

如果子模块中有错误,您可以抛出异常,并在您的控制器中捕获它,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);
}
于 2012-07-11T00:28:56.257 回答
0

您可以使用此功能重定向 404 not found 页面。

    if ( ! file_exists('application/search/'.$page.'.php')) {
        show_404(); // redirect to 404 page
    }
于 2020-09-04T07:01:06.977 回答
-4

它很简单,我解决了这个问题

请控制器名称的第一个字母必须大写,例如

一个控制器

页面应该是页面

并且还保存具有相同名称的 Cotroler 文件 Pages.php 而不是 pages.php 对于模型类也相同

请享用

于 2015-09-22T19:19:44.313 回答