如何在 Kohana 中的控制器名称之间添加破折号?
Posted
技术标签:
【中文标题】如何在 Kohana 中的控制器名称之间添加破折号?【英文标题】:How To Add Dash Between Controllers Name In Kohana? 【发布时间】:2011-09-08 11:48:27 【问题描述】:我正在开发 Kohana 3.1 的授权模块。在我模块的 init.php...
Route::set(
'a11n',
'<controller>',
array(
'controller' => 'signIn|signOut|signUp'
)
);
我不能 100% 确定如何使用 Kohana 的路由机制,但我试图通过这个实现用户可以键入“signIn”、“signOut”或“signUp”来从我的模块运行控制器。你看,我想要一个“便携式”授权系统......所以我可以简单地“复制粘贴”正确的目录,启用模块和我的网站有授权。
请记住,我不想通过这条路线改变默认路线的行为。我不知道我的代码有多正确......但它有效!我测试过,我也可以在不使用第三个参数的情况下获得相同的效果。我现在可以用它实现什么?
现在的问题...我如何通过键入“登录”用户运行模块“Controller_SignIn”以某种方式从模块设置路由?
【问题讨论】:
【参考方案1】:我知道这个问题已经有一个标记为解决方案的答案,但是有一种更简洁/另一种方法:
在您的应用程序中创建一个新文件:application/classes/request.php
并将以下代码放入该文件中:
<?php defined('SYSPATH') or die('No direct script access.');
class Request extends Kohana_Request
public function execute()
$this->action(str_replace('-', '', $this->action()));
$this->controller(str_replace('-', '', $this->controller()));
return parent::execute();
现在您不必为每个破折号/连字符的网址修改/污染您的 bootstrap.php!
【讨论】:
【参考方案2】:您应该使用路由来执行此操作,如下所示:
Route::set('SignIn', '/sign-in(/<action>)',
array(
'action' => 'index|action1',
)
)
->defaults(
array(
'controller' => 'SignIn',
'action' => 'index',
)
);
Route::set('SignOut', '/sign-out(/<action>)',
array(
'action' => 'index|action1',
)
)->defaults(
array(
'controller' => 'SignOut',
'action' => 'index',
)
);
或
Route::set('SignIn', '/sign-in/',
array()
)
->defaults(
array(
'controller' => 'user',
'action' => 'login',
)
);
Route::set('SignOut', '/sign-out/)',
array()
)->defaults(
array(
'controller' => 'user',
'action' => 'logout',
)
);
【讨论】:
使用路由更易于维护,如果要再次更改路由,则无需触摸控制器。 Imo,这种方式更好,请参阅我对另一个问题的评论。 @gimpe 在我的示例中路由有什么问题?您可以根据需要更改before()
方法中的操作名称。
@biakaveron Kohana 进程是加载加载 bootstrap.php(创建路由的位置)的 index.php,最后 index.php 将在解析 uri 后执行正确的控制器/操作。修改控制器中的操作会使调试和维护变得更加困难,因为您不能依赖路由定义来预测应用程序的行为。
我没有看到任何调试问题。我的路由显示了一个控制器名称,然后我看到了一个before()
条目并且知道将调用什么方法。它没有隐藏的重定向,只是一个小的破折号替换(就像你的路线一样)。无论如何,@daGrevis 可以使用这种组合:Route::set('SignIn', 'sign-in')->defaults(array('controller' => 'account', 'action' => 'signin'));
等。【参考方案3】:
为什么要为帐户操作创建单独的控制器?使用您需要的操作创建一个控制器(Controller_Account
或其他):
class Controller_Account extends Controller_Template
public function action_signin() ...
public function action_signout() ...
public function action_signup() ...
如您所见,动作名称没有破折号。您不能在方法名称中使用它们。但这里有一个技巧:
public function before()
parent::before(); // dont forget this call!
// remove dashes from current method name
$this->request->action(str_replace('-', '', $this->request->action()));
还有路线:
Route::set(
'a11n',
'<action>',
array('action' => array('sign-in|sign-up|sign-out'))
)
->defaults(array('controller' => 'account'));
当然,您可以同时使用登录名和登录名,只需在 Route 正则表达式参数中添加非虚线名称即可:
Route::set(
'a11n',
'<action>',
array('action' => array('sign-in|sign-up|sign-out|signin|signup|signout'))
)
->defaults(array('controller' => 'account'));
【讨论】:
感谢您的回答。效果很好! ) 请注意,这样您最终会得到相同页面的多个 url(/signin 与 /sign-in 相同)。如果您使用 gimpe 的答案,则只有 /sign-in 有效。 您可以在before()
中从“/signin”重定向到“/sign-in”。无论如何,我不明白,你为什么喜欢为一个动作创建一个控制器?以上是关于如何在 Kohana 中的控制器名称之间添加破折号?的主要内容,如果未能解决你的问题,请参考以下文章