无法路由到 Yii2 控制器中的自定义操作
Cannot route to custom action in Yii2 controller
我正在使用 Yii2(高级)构建一个 RESTful API,除了我需要的自定义端点之外,端点按预期工作。
我的urlManager
看起来像:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' =>
['class' => 'yii\rest\UrlRule', 'controller' => 'api/v1/step', 'pluralize' => false],
],
如果我像这样将自定义操作添加到 StepController 中,它将正常工作 - 使用 http://example.com/api/v1/step/test
调用
public function actionTest()
但是,如果我想通过路径传递 ID,我将收到 404 错误 - http://example.com/api/v1/step/test/1
public function actionTest($id)
有什么我遗漏的吗?
编辑:添加可能对他人有帮助的注释。
我上面的例子被简化了,但我希望我的 URL 看起来像 http://example.com/api/v1/step/test-by-foobar/1
,调用的方法是 public function actionTestByFoobar($id)
。但是,要使其正常工作,您必须像下面这样设置 urlManager 规则,我发现这不是很明显:
'api/v1/step/test-by-foobar/1' => 'api/v1/step/test-by-foobar',
请注意该值是带连字符的,而不是驼峰式。
使用您的代码,您可以像这样传递一个 id :
http://example.com/api/v1/step/test?id=1
但是如果你想这样做:
http://example.com/api/v1/step/test/1
您应该像下面这样重写 url:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule',
'controller' => 'api/v1/step',
'pluralize' => false
],
/* You are missing this line below */
'api/v1/step/test/<id:\d+>' => 'api/v1/step/test'
]
],
我正在使用 Yii2(高级)构建一个 RESTful API,除了我需要的自定义端点之外,端点按预期工作。
我的urlManager
看起来像:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' =>
['class' => 'yii\rest\UrlRule', 'controller' => 'api/v1/step', 'pluralize' => false],
],
如果我像这样将自定义操作添加到 StepController 中,它将正常工作 - 使用 http://example.com/api/v1/step/test
public function actionTest()
但是,如果我想通过路径传递 ID,我将收到 404 错误 - http://example.com/api/v1/step/test/1
public function actionTest($id)
有什么我遗漏的吗?
编辑:添加可能对他人有帮助的注释。
我上面的例子被简化了,但我希望我的 URL 看起来像 http://example.com/api/v1/step/test-by-foobar/1
,调用的方法是 public function actionTestByFoobar($id)
。但是,要使其正常工作,您必须像下面这样设置 urlManager 规则,我发现这不是很明显:
'api/v1/step/test-by-foobar/1' => 'api/v1/step/test-by-foobar',
请注意该值是带连字符的,而不是驼峰式。
使用您的代码,您可以像这样传递一个 id :
http://example.com/api/v1/step/test?id=1
但是如果你想这样做:
http://example.com/api/v1/step/test/1
您应该像下面这样重写 url:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule',
'controller' => 'api/v1/step',
'pluralize' => false
],
/* You are missing this line below */
'api/v1/step/test/<id:\d+>' => 'api/v1/step/test'
]
],