我应该怎么做Kohana 3来使路线动作的连字符变为下划线?

时间:2010-11-19 00:20:09

标签: php routes kohana-3

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 个答案:

答案 0 :(得分:4)

我对Kohana 3.2的解决方案,用于将带连字符的动作路由到适当的强调方法:
扩展Kohana_Route并插入此代码

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

完整解决方案:在application / classes /

中创建文件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;
    }
}

答案 1 :(得分:3)

最简单的是破解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 :(得分:3)

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

这显然只适用于这些方法。但是,如果您进一步探索,可以为目录,控制器等创建更好的功能。

答案 3 :(得分:1)

zerkms方法的更新。在 Kohana 3.2 中,您需要修改文件system/classes/kohana/request/client/internal.php 第106行

替换:

$action = $request->action();

人:

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

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