0

我最近被一个包含很多复合主键(以及相关的外键朋友 XD)的数据库惊呆了。我正在使用 Yii 框架开发应用程序,我已经创建了我需要的所有模型和 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 并且它只是声称第二个参数不应该是数组。当然,即使 $model->primaryKey 返回一个数组而不是一个标量,禁用 PHP 警告也会让它工作得很好。但我想要一个“干净”的解决方案来解决这个问题!!!有任何想法吗?我正在考虑序列化/反序列化或加密/解密参数以使用单个字符串,但老实说不认为是最佳选择。

4

1 回答 1

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

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

于 2013-02-23T14:19:40.263 回答