Yiiでの型キャスト:: app()-> request

みなさんこんにちは!



プロジェクトデータの一部をmongodbに転送するときに発生した問題の小さな解決策を共有したいと思います。

最初は、Mysqlのみを使用し、クライアントから送信されるすべてのパラメーターにより、問題なくデータベースからデータを受信できました。



<?php $id = Yii::app()->request->getParam('id', 0); $data = Data::getForId($id); ?>
      
      





一番下の行は、mysqlの場合、[select * from data where id = 1]または[select * from data where id = ' 1 ' ]の違いがないことです。

ただし、mongodbはデータ型を区別するため、mongodbのidが数値の場合、条件id == '1'を使用してレコードを見つけることはできません。







キャストに(int)を追加してコードの量を複雑化または増加させないために

 <?php $id = (int)Yii::app()->request->getParam('id', 0); ?>
      
      







次のソリューションが選択されました-標準のCHttpRequestに基づいて独自の要求マネージャーを作成します。

次のクラス

 <?php class CParseRequest extends CHttpRequest { public function getParam($name,$defaultValue=null) { $data = parent::getParam($name, $defaultValue); $this->parseData($data); return $data; } public function getQuery($name,$defaultValue=null) { $data = parent::getQuery($name, $defaultValue); $this->parseData($data); return $data; } public function getPost($name,$defaultValue=null) { $data = parent::getPost($name, $defaultValue); $this->parseData($data); return $data; } /** *     */ protected function parseData(&$data) { if (is_array($data)) { foreach ($data as &$prop) { $this->parseData($prop); } } else { if (preg_match("/^[\d]+$/", $data)) $data = (int)$data; } } }
      
      







次のモジュールを設定に登録する必要があります

  'request' => array( 'class' => 'CParseRequest' ),
      
      







これで、受信したデータは常に目的のタイプにキャストされます。 ネストの配列が来ると、そのすべての要素も必要な型に変換されます。



数値を文字列として送信する必要がある状況はありません。したがって、このソリューションはプロジェクトのニーズを完全にカバーしました。



他の人々がこの問題をどのように解決したかについての意見を聞くのは興味深いでしょう。



更新しました。 VolChが示す変更を行いました



All Articles