【问题标题】:Controller URI Issue - Codeigniter控制器 URI 问题 - Codeigniter
【发布时间】:2013-10-24 15:41:15
【问题描述】:

无论如何都不是后端人员,但可以通过基础知识导航。我的问题是,我正在做的福利页面有以下功能。想要简化子页面而不是创建多个控制器功能和路由重定向。因此,我决定将 URI 作为可变路由...但它有效。

如果我转到website.com/benefits/{section},IF 会正常工作。但是,如果我转到website.com/benefits/,我会得到一个 404 页面——显然。我没有什么可以处理那个请求——只是因为我不知道怎么做。如果用户访问 website.com/benefits/ 并且没有定义 uri(即 $section),我该如何重定向到主页?

编辑: 还是只创建一个单独的 function benefits(){} 函数以及下面的函数是否明智?这是好的做法吗?

控制器功能:

function benefits($section)
{
    if($section == 'fitness')
    {
        echo('fitness page!');
    }
    elseif($section == 'health')
    {
        echo('health page!');
    }
    elseif($section == 'beauty')
    {
        echo('beauty page!');
    }
    elseif($section == 'sports')
    {
        echo('sports page!');
    }
    else
    {
        redirect('/');
    }
}

【问题讨论】:

  • 您要重定向的“主页”是什么?你的意思是redirect('/'); 是“重定向到主页”吗?

标签: php codeigniter codeigniter-2


【解决方案1】:

您的重定向似乎给出了 404。如果您想访问 /benefits/,只需创建一个默认情况(在您的情况下,其他部分)。

但是看看我做了什么 - 我已经为 $section 设置了一个默认值来索引,这样就可以表示你的索引页面,使所有未指定的值都进行重定向:

function benefits($section = 'index')
{
    if($section == 'fitness')
    {
        echo('fitness page!');
    }
    elseif($section == 'health')
    {
        echo('health page!');
    }
    elseif($section == 'beauty')
    {
        echo('beauty page!');
    }
    elseif($section == 'sports')
    {
        echo('sports page!');
    }
    elseif($section == 'index')
    {
        echo('benefits index page!');
    }
    else
    {
        redirect('/');
    }
}

但是,由于问题不是很清楚,可能还有其他解决方案。

确保您的控制器名为“Benefits”,并将您的函数重命名为“index”。 这适用于 site.com/benefits 等 URL。

查看更多关于使用控制器的信息here

【讨论】:

  • 我应该更清楚...重定向工作正常。如果有人输入的 uri 不是$section 的 IF 值之一,那么它几乎就在那里。我的问题是,如果在 url 中 /benefits 之后没有指定 uri。简而言之,如果没有在 url 中输入 uri 并且访问者转到 website.com/benefits,则没有处理该请求的功能。你挖?上面的重定向仅在 $section 值不存在的情况下。
  • 知道了,那么它可能是第二种解决方案。如果你能展示整个控制器,我可以马上告诉你哪里出了问题。
  • 这几乎是控制器中的所有内容 - 无论如何,对于这个页面。那么你认为创建一个独立于上述function benefits($section){}function benefits(){} 函数来处理索引请求是否明智?
  • 不,它不会处理索引请求(例如,它不像 C 语言那样工作),但您需要将函数命名为“索引”。您可以编辑问题并显示整个文件 benefits.php 吗?
  • 无法共享整个文件....其中有大量其他代码。它是一个“内容”控制器,其中包含福利页面部分。从技术上讲,该页面是网站/com/content/benefits。但我路由了 URL。我发布的就是我所拥有的所有好处。
【解决方案2】:

你可以试试这个(添加默认函数参数值)在访问website.com/benefits/时重定向到首页:function benefits($section = FALSE) {}

我错过了您必须为此使用路由规则的事实。总而言之,您希望路由处理 2 个场景:

1.转到website.com/benefits/{section}:回显某些东西
2.否则,去website.com/benefits/或者section没有在IFs语句中定义:重定向到首页(website.com/)

其实website.com/benefits/并不是一个单独的大小写,从字面上应该属于else大小写。您只想正确处理else 的情况,但在访问website.com/benefits/ 时遇到了错误。如果不需要,您不想处理 index 部分。所以你可能使用了错误的路由规则。

我试图重现您的问题,如果您使用 CodeIgniter 指南中的设置,例如 $route['benefits/(:any)'] = 'content/benefits/$1';,您将获得您提到的 404 页面。

这是针对您的问题的正确路由规则,无需更改您的 benefits 函数上的任何内容:

$route['benefits/?(.*)'] = 'content/benefits/$1';

【讨论】:

  • 您使用$section = 'index'时与您的解决方案相比,与此解决方案有什么不同吗?
  • 是的,当部分为索引时,我将用户保留在页面上。
  • 我认为他只是想重定向到 website.com/ 而不是为 website.com/benefits 创建另一个索引页面。
  • @MikeBarwick 所以我的解决方案应该有效,如果不是,请告诉我,以便我弄清楚。
  • @Shomz 请再次检查我的答案。
【解决方案3】:

这就是您所说的index 函数。 :D,如果url 中没有定义action,则function index() 是默认函数。没有冒犯,但仍然不确定你在这里做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多