代码之家  ›  专栏  ›  技术社区  ›  alex

如何使用Kohana 3将路由操作的连字符更改为下划线?

  •  1
  • alex  · 技术社区  · 15 年前

    考虑这条路线 bootstrap.php ...

    Route::set('crud', 'staff/<controller>(/<action>(/<id>))', array(
                'controller' => '(activities|users|default-emails)',
                'action' => '(new|view|modify|delete)',
                'id' => '\d+'
        ))->defaults(array(
            'directory' => 'staff',
            'action' => 'view'
        ));
    

    这个 default-emails 正在尝试运行 action_default-emails() 显然不存在也不可能存在的方法。

    我应该扩展Kohana的哪个部分来将连字符在内部映射为下划线?

    如果我这样做的话,可以通过这两个 _ - 分隔的路由?

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  3
  •   zerkms    15 年前

    最简单的是 Kohana_Request::execute()@1112

    $class->getMethod('action_'.$action)->invokeArgs($controller, $this->_params);
    

    更改为

    $class->getMethod('action_'.str_replace('-', '_', $action))->invokeArgs($controller, $this->_params);
    

    但是你知道,你必须在下一个kohana版本中做这个补丁。

    更无害的可能是 Kohana_Route::matches()

    class Route extends Kohana_Route
    {
        public function matches($uri)
        {
            $matches = parent::matches($uri);
            if (isset($matches['action']))
            {
                $matches['action'] = str_replace('-', '_', $matches['action'];
            }
            return $matches;
        }
    }
    

    没有检查,但我敢打赌应该有效。

        2
  •  4
  •   amcc    14 年前

    我的Kohana 3.2解决方案用于将连字符操作路由到适当的带下划线方法:
    延长Kohana_路线并插入此代码

    if($key == 'action')
    {
        $params[$key] = str_replace('-','_',$value);
    }
    else
    {
        $params[$key] = $value;
    }
    

    完整解决方案: 在应用程序/类中创建文件route.php/

    <?php defined('SYSPATH') or die('No direct script access.');
    
    class Route extends Kohana_Route
    {
        public function matches($uri)
        {
            if ($this->_callback)
            {
                $closure = $this->_callback;
                $params = call_user_func($closure, $uri);
    
                if ( ! is_array($params))
                    return FALSE;
            }
            else
            {
                if ( ! preg_match($this->_route_regex, $uri, $matches))
                    return FALSE;
    
                $params = array();
                foreach ($matches as $key => $value)
                {
                    if (is_int($key))
                    {
                        // Skip all unnamed keys
                        continue;
                    }
    
                    // Set the value for all matched keys
                                    if($key == 'action')
                                    {
                                        $params[$key] = str_replace('-','_',$value);
                                    }
                                    else
                                    {
                                        $params[$key] = $value;
                                    }
                }
            }
    
            foreach ($this->_defaults as $key => $value)
            {
                if ( ! isset($params[$key]) OR $params[$key] === '')
                {
                    // Set default values for any key that was not matched
                    $params[$key] = $value;
                }
            }
    
            return $params;
        }
    }
    
        3
  •  3
  •   Viper Actual    13 年前

    自从Kohana 3.3问世以来,这种方法不再有效。到目前为止,我已经找到了一个对我有效的解决方案。

    升级到3.3时,不需要编辑Internal.php请求文件。相反,您可以创建路由筛选器。您只需将操作中的连字符替换为下划线。

    Route::set('default', '(<controller>(/<action>(/<id>)))')
        ->filter(function($route, $params, $request) {
            // Replacing the hyphens for underscores.
            $params['action'] = str_replace('-', '_', $params['action']);
            return $params; // Returning an array will replace the parameters.
        })
        ->defaults(array(
             'controller' => 'welcome',
             'action'     => 'index',
        ));
    

    这显然只适用于方法。但是,如果您进一步研究,可以为目录、控制器等创建更好的函数。

        4
  •  1
  •   laurent    14 年前

    zerkms方法的更新。在 科哈纳3.2 ,您需要编辑文件 system/classes/kohana/request/client/internal.php 106号线 .

    替换:

    $action = $request->action();
    

    签署人:

    $action = str_replace('-', '_', $request->action());
    

    我不喜欢黑客框架,但这是迄今为止最简单和最可靠的解决方案。在Route类中重命名操作可能会导致各种麻烦,因为该操作有时会被称为my_action(内部)和my action(链接中)。

    推荐文章