在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的哪一部分扩展到内部将该连字符映射到下划线?
我是否应该担心如果我这样做,那么可以通过_
和-
分隔的路线访问它?
感谢。
答案 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(在链接中)。