Php 如何在HP中扩展URL上的参数?
如何将URL中的额外参数传递给KohanaPHP(版本3.1+),就像这样Php 如何在HP中扩展URL上的参数?,php,url,parameters,kohana,kohana-3,Php,Url,Parameters,Kohana,Kohana 3,如何将URL中的额外参数传递给KohanaPHP(版本3.1+),就像这样 http://example.com/blog/edit/4000/3200 …其中“blog”是controllers文件夹中的blog.php,“edit”是控制器方法,4000是参数1,我可以用于谁想要编辑记录,3200是参数2,我可以用于记录ID 我得到博客并编辑部分。问题是4000和3200。当我运行该URL时,我得到一个错误:“404-找不到路由匹配blog/edit/4000/3200” 我是被迫对.ht
http://example.com/blog/edit/4000/3200
…其中“blog”是controllers文件夹中的blog.php,“edit”是控制器方法,4000是参数1,我可以用于谁想要编辑记录,3200是参数2,我可以用于记录ID
我得到博客并编辑部分。问题是4000和3200。当我运行该URL时,我得到一个错误:“404-找不到路由匹配blog/edit/4000/3200”
我是被迫对.htaccess文件执行一些不寻常的操作,还是在问号后将参数作为查询参数传递?这说明了该怎么做: 但本质上,我需要编辑application\bootstrap.php文件并更改以下内容:
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index'
));
在bootstrap.php中需要这样的路由:
Route::set('blog_edit', 'blog/edit/<param1>(/<param2>)')
array(
'param1' => '[[:digit:]]{1,}',
'param2' => '[[:digit:]]{1,}',
))
->defaults(array(
'controller' => 'blog',
'action' => 'edit',
));
我还没有测试过这段代码,但它应该非常接近您所需要的
引用自“”
.htaccess
。PHP无法拦截请求,因此您需要Apache(或其他Web服务器)帮助将请求定向到相应的PHP文件。@Blender。您知道HP MVC框架吗?它已经使用了一个.htaccess文件,该文件将所有流量定向到index.php进行处理。所以这个问题是一个Kohana框架问题,而不是一个普通的PHP问题。我很难理解你的问题。你能不能把它说得更清楚一点,因为在目前的状态下,它是相当模糊的。嗯?默认情况下,在我看来,Kohana允许我检测并路由URL中的“博客”和“编辑”。但对于4000和3200,它不会让我。真正有过Kohana经验的人可能知道这个答案。我可能不得不对前端控制器或其他东西进行子类化。由于您没有得到很多视图(只有九个),我不确定如何提供帮助。每当我使用web框架(我使用Flask)时,每当我在URL中使用输入时,我都必须指定输入的类型。应用程序似乎无法识别整数,但字符串可以工作。我以前从未使用过这个框架,所以我真的能帮上忙…请不要在控制器的方法中使用arg list。它将在v3.2中被弃用。改用$this->request->param('param1')
。另一件事是在正则表达式中。如果您的param1和param2是整数,请将它们定义为整数:Route::set('defaults','…',array('param1'=>'\d+','param2'=>'\d+')代码>。另外,为什么要通过URI传递userID?通常,您可以从会话(或类似于Auth::instance()->get_user()
)获取用户数据,并从defaults()
调用中删除param1和param2$this->request->param()
为空段返回NULL。@blakaveron“为什么用户ID通过URL?”这是一个假设的,但很可怜的例子,我当时在脑海中能想到。请忽略它。重点实际上是传递URL参数。@biakaveron我做了其他建议的更改。非常感谢。至于param1和param2是整数——我需要它们灵活并存储任何数据类型。我可以在控制器操作中验证它们的值。
public function action_edit() {
$sParam1 = $this->request->param('param1');
$sParam2 = $this->request->param('param2');
$this->response->body('param1=' . $sParam1 . ' param2=' . $sParam2);
}
Route::set('blog_edit', 'blog/edit/<param1>(/<param2>)')
array(
'param1' => '[[:digit:]]{1,}',
'param2' => '[[:digit:]]{1,}',
))
->defaults(array(
'controller' => 'blog',
'action' => 'edit',
));
class Controller_Blog
{
public function action_edit($param1, $param2)
{
// or
$param1 = $this->request->param('param1');
$param2 = $this->request->param('param2');
// [...]
}
}