【问题标题】:How To Add Dash Between Controllers Name In Kohana?如何在 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”以某种方式从模块设置路由?

【问题讨论】:

    标签: routing routes kohana kohana-3 hyphen


    【解决方案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”。无论如何,我不明白,你为什么喜欢为一个动作创建一个控制器?
      猜你喜欢
      • 2022-01-05
      • 2018-05-16
      • 1970-01-01
      • 2013-02-04
      • 2011-11-05
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多