0

私は最近、多くの複合主キー (および関連する外部キーの友人 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 を使用し、2 番目のパラメーターは配列であってはならないと主張しているため、このソリューションは警告を生成します。もちろん、PHP 警告を無効にすると、$model->primaryKey がスカラーではなく配列を返す場合でも問題なく動作します。しかし、私はその問題に対する「クリーンな」解決策が欲しい!!! 何か案は?単一の文字列で動作するようにパラメーターをシリアル化/逆シリアル化または暗号化/復号化することを考えていましたが、正直なところ、それが最良の選択だとは思いません。

4

1 に答える 1

0

通常、コントローラ メソッドは によってアクセスされるため、パラメータを受け取りません$_GET['field']。その上、Yii は methodgetActionParamsを提供します。これは、あなたが望むものとほぼ同じことを行います:

意見:

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 に答える