Routing 如何在Kohana中的控制器名称之间添加破折号?

Routing 如何在Kohana中的控制器名称之间添加破折号?,routing,routes,kohana,kohana-3,hyphen,Routing,Routes,Kohana,Kohana 3,Hyphen,我正在为Kohana 3.1开发授权模块。在我的模块的init.php中 Route::set( “a11n”, '', 排列( “控制器”=>“登录|注销|注册” ) ); 我不能100%确定如何使用Kohana的路由机制,但我正试图实现用户可以键入“signIn”、“signOut”或“signUp”从我的模块运行控制器。你看,我想要一个“便携式”授权系统。。。所以我可以简单地“复制粘贴”正确的目录,使模块和我的网站有授权 请记住,使用此路由,我无论如何都不想更改默认路由的行为。我不知道我

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

Route::set(
“a11n”,
'',
排列(
“控制器”=>“登录|注销|注册”
)
);
我不能100%确定如何使用Kohana的路由机制,但我正试图实现用户可以键入“signIn”、“signOut”或“signUp”从我的模块运行控制器。你看,我想要一个“便携式”授权系统。。。所以我可以简单地“复制粘贴”正确的目录,使模块和我的网站有授权

请记住,使用此路由,我无论如何都不想更改默认路由的行为。我不知道我的代码有多正确。。。但它是有效的!我测试了,我可以得到同样的效果,而不使用第三个参数太。我现在用它能实现什么


现在的问题是。。。如何通过键入“登录”用户运行模块“控制器登录”来设置模块的路由?

为什么要为帐户操作创建单独的控制器?使用您需要的操作创建一个控制器(
controller\u 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::set(
“a11n”,
'', 
数组('action'=>array('sign-in | sign-up | sign-out'))
)
->默认值(数组('controller'=>'account');
当然,您可以同时使用signin和sign-in名称,只需将非虚线名称添加到Route regex param:

Route::set(
       'a11n', 
       '<action>', 
       array('action' => array('sign-in|sign-up|sign-out|signin|signup|signout'))
    )
    ->defaults(array('controller' => 'account'));
Route::set(
“a11n”,
'', 
数组('action'=>array('sign-in | sign-up | sign-out | sign | signup | signout'))
)
->默认值(数组('controller'=>'account');

您应该使用路由来实现这一点,如下所示:

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',
                    )
                );

我知道这个问题已经有了一个标记为“解决方案”的答案,但有一种更干净/另一种方法:

在应用程序中创建一个新文件:
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(/sign与/sign相同)。如果您通过gimpe使用答案,则只有/sign-in才有效。您可以从“/signin”重定向到“/sign-in”
before()
。无论如何,我不明白,你为什么要为一个动作创建一个控制器?使用路由更易于维护,如果你想再次更改路由,你不需要触摸控制器。在我看来,这种方式更好,请参阅我对另一个问题的评论。@gimpe我的示例中路由的问题是什么?您可以根据需要在
before()
方法中更改操作名称。@biakaveron Kohana进程将加载index.php,加载bootstrap.php(创建路由的位置),最后index.php将在解析uri后执行正确的控制器/操作。修改控制器中的操作会使调试和维护变得更加困难,因为您不能依赖路由定义来预测应用程序的行为。我认为调试没有任何问题。我的路由显示一个控制器名称,然后我看到一个
before()
条目,知道将调用什么方法。它没有隐藏的重定向,只是一个小破折号替换(就像你的路线一样)。总之,@daGrevis可以使用以下组合:
Route::set('sign','sign in')->默认值(数组('controller'=>'account','action'=>'sign')等。
Route::set('SignIn', '/sign-in/',
        array()
        )
        ->defaults(
                array(
                    'controller' => 'user',
                    'action' => 'login',
                    )
                );

Route::set('SignOut', '/sign-out/)',
        array()
        )->defaults(
                array(
                    'controller' => 'user',
                    'action' => 'logout',
                    )
                );
<?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();
    }
}