我已经被一个包含大量复合主键(以及相关的外键朋友XD)的数据库惊呆了。我正在使用Yii Framework开发一个应用程序,我创建了我需要的所有模型和crud,但我发现传递复合pk以创建自动URL时存在问题。
--- view ---
// this generate a php warning
Yii::app()->createUrl('controller/dosomething', array('id' => $model->primaryKey));
--- controller --
public function actionDoSomething(array $id) { ... }
此解决方案生成警告,因为createUrl在内部使用urlencode,它只是声称第二个参数不应该是数组。当然,禁用PHP警告即使$ model-> primaryKey返回一个数组而不是一个标量,它也能正常工作。但我想要一个“干净”的解决方案来解决这个问题!有任何想法吗?我正在考虑序列化/反序列化或加密/解密params以使用单个字符串,但老实说,不要认为是最好的选择。
答案 0 :(得分:0)
通常,控制器方法不接收任何参数,因为它们由$_GET['field']
访问。此外,Yii提供了方法getActionParams
,它几乎与你想要的一样:
查看:强>
Yii::app()->createUrl('controller/dosomething', $model->primaryKey);
<强>控制器:强>
public function actionDoSomething() {
$id = $this->getActionParams();
// ...
}
要仅获取包含所需值的子数组,可以过滤参数:
public function actionDoSomething() {
$keys = array_flip(array("pk1", "pk2"));
$id = array_intersect_key($this->getActionParams(), $keys));
// ...
}
或者甚至更好,不要使用任何棘手的解决方案并明确说明:
查看:强>
Yii::app()->createUrl('controller/dosomething', array('pk1'=>$model->pk1,'pk2'=>$model->pk2));
<强>控制器:强>
public function actionDoSomething(array $id) {
// ...
}
但请记住不要相信用户的输入并对其进行过滤,并且发送给控制器的参数也不例外。