2011-04-13 60 views
2

当前在我的CI项目中,我有一个处理所有事物帐户的单个控制器。例如,作为注册,登录,激活等在CodeIgniter中从URL中删除控制器名称

我的工作路线这样...

domain.com/account/login/domain.com/account/register/

如何从路线中删除account同时还即将卸下控制器来自其他页面。

我基本上想要控制器总是被删除。我的原因之一是搜索引擎优化,搜索引擎根据网站的深度来评价页面的不羁。

我似乎做到这一点的唯一方法就是为每个页面做一些像route['activate'] = 'account/activate';的事情,这将是一个巨大的麻烦。

+0

您是否预见过任何具有相同方法名称的方法? – jondavidjohn 2011-04-13 01:42:09

+0

不是我能想到的 – Paramount 2011-04-13 01:53:31

回答

1

您的问题的答案是,你必须明确设置路线。

它是如何知道给定函数在哪个控制器中?

你得告诉它。

+0

多数民众赞成在我的想法,但我希望有一些神奇的:) – Paramount 2011-04-13 01:48:19

+2

如果你想要魔法,使用rails,codeigniter期待你成为魔术师。 – jondavidjohn 2011-04-13 01:49:52

1

使用mod_rewrite(如果控制器始终是相同的名称)

2

试试这个:

$route['(:any)'] = "account/$1"; 
+0

这个问题是,我有多个控制器。 – Paramount 2011-04-13 02:14:47

+0

自从您提到“我有一个控制器可以处理所有事务帐户”后,我就回答了这个问题。如果您有不同的控制器,则必须为每个控制器明确设置路由。 – bhu1st 2011-04-13 02:20:42

+1

啊,我看到对不起,但我后来也提到我想把它给所有的控制器。 – Paramount 2011-04-13 03:16:35

1

好吧,我能想到的要做到这一点的一种方式,但它可能会是更多的这不仅仅是为每个功能写出路线。

您需要将Router.php扩展为application/core/MY_Router.php并覆盖_validate_request()方法。这基本上决定了这是否是有效的路线。

它检查控制器类是否存在,如果不存在则失败。 您需要用一些假定没有控制器段的代码替换它,然后扫描每个控制器并检查它是否包含调用的方法(它将是段1,因为没有控制器)。

现在,棘手的部分,在CI生命周期的这一点,你的控制器显然没有加载,所以你不能使用method_exists()来检查它。

你需要加载你的控制器一次一个,然后为每一个运行

method_exists($loaded_class, $method_name) 

,如果它的真实,然后设置,然后继续前进,并呼吁:

$this->set_class('the_name_of_the_scanned_class_which_had_the_method'); 

然后CI可以继续正常进行,它会加载你的方法,而用户不知道它从哪个控制器加载。

..可能不值得麻烦恕我直言。一个更简单的解决方案是只有一个控制器和一个路由到该控制器。

4
$route['^(?!other|controllers).*'] = “account/$0″; 
+0

这对我有用。由于我的安装过程中URL的重写方式,我需要使用'$ route ['^(?!/ other |/controllers)。''='controller/$ 0';' – 2012-10-30 09:21:18

相关问题