(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Приведение к типам в Yii::app()->request

Источник: habrahabr
anonimizer_me

Всем привет!

Хочу поделиться с вами небольшим решением проблемы, с которой столкнулся при переносе части данных проекта в 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 типы данных различает, по этому нельзя найти запись используя условие id == '1' если id в mongodb является числом.

Для того, чтобы не усложнять и не увеличивать количество кода за счет добавления (int) для приведения типа

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

было выбрано седующее решение - создание собственного request менеджера на основе стандартного 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'
    ),

Теперь полученные данные всегда будут приводиться к нужному типу. Если нам приходит массив любой вложенности, то все его элементы тоже будут приведены к нужным типам.

У нас не возникает ситуаций, когда число нужно передать в виде строки, по этому данное решение полностью покрыло потребности проекта.

Будет интересно услышать мнение других людей о том, как они решали данную проблему.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 17.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
erwin Data Modeler Standard Edition r9.7 - Product plus 1 Year Enterprise Maintenance Commercial
СУБД Линтер Бастион. Серверная лицензия. 5 клиентских подключений
Allround Automation Direct Oracle Access Standard license
Rational ClearCase Multisite Floating User License
Quest Software. Toad for Oracle Development Suite
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
СУБД Oracle "с нуля"
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Новые материалы
Один день системного администратора
Windows и Office: новости и советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100