如何在 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')-&gt;defaults(array('controller' =&gt; 'account', 'action' =&gt; '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 中的控制器名称之间添加破折号?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何将 javascript 函数调用到 kohana 视图中?

无法访问 Kohana 控制器中的会话变量

kohana 3 授权码修改

Kohana3 ORM 需要澄清关系

Kohana - 特定于控制器的 .htaccess

kohana 如何将 javascript 捆绑到视图中