3

我正在为 Kohana 3.1 开发授权模块。在我模块的init.php ...

Route::set(

    'a11n',
    '<controller>',
    array(
        'controller' => 'signIn|signOut|signUp'
    )

);

我不是 100% 确定如何使用 Kohana 的路由机制,但是通过这个我试图让用户可以输入“signIn”、“signOut”或“signUp”来从我的模块运行控制器。你看,我想要一个“便携式”授权系统......所以我可以简单地“复制粘贴”正确的目录,启用模块和我的网站有授权。

请记住,通过这条路线,我不想改变默认路线的行为。我不知道我的代码有多正确......但它有效!我测试过,我也可以在不使用第三个参数的情况下获得相同的效果。我现在能用它实现什么?

现在的问题......我如何通过输入“登录”用户运行模块“Controller_SignIn”以某种方式设置模块的路由?

4

3 回答 3

4

您应该使用路由来执行此操作,如下所示:

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',
                    )
                );
于 2011-06-04T21:07:05.413 回答
2

我知道这个问题已经有一个标记为解决方案的答案,但是有一种更清洁/另一种方法:

在您的应用程序中创建一个新文件: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();
    }
}

现在您不必为每个虚线/连字符的 url 修改/污染您的 bootstrap.php!

于 2011-10-15T09:55:07.983 回答
1

为什么要为帐户操作创建单独的控制器?使用您需要的操作创建一个控制器(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'));
于 2011-06-04T19:40:17.430 回答