Yii Composite Key和Url参数

时间:2013-02-22 16:03:35

标签: php yii

我已经被一个包含大量复合主键(以及相关的外键朋友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以使用单个字符串,但老实说,不要认为是最好的选择。

1 个答案:

答案 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) {
    // ...
}

但请记住不要相信用户的输入并对其进行过滤,并且发送给控制器的参数也不例外。