2012-02-28 3 views
2

Так вот что я хотел бы достичь. Я хотел бы использовать PDO, joust, так как мне это нравится, но я хотел бы добавить некоторые новые методы поверх PDO.PHP - расширение объекта данных PHP для добавления новой функциональности

как: обновление(), вставить(), удалить(), fetchAllAssoc(), и т.д. ...

Так что я должен был бы работать как с PDO и PDO Ведомость объектов из внутри одного класса. Beacuse для обновления, мне нужно было бы построить запрос, подготовить() его, чтобы вернуть объект Statement PDO, а затем мне пришлось бы привязывать Values ​​и затем выполнять.

Это то, что я сделал до сих пор:

<?php 

    namespace Database\DBAL; 
    use PDO; 

    class Database extends PDO 
    {    
     protected static $instance; 

     public static function getInstance() 
     { 
      if(empty(static::$instance)) 
      { 
       // This will be fetched from config 
       $dns = "mysql:host=localhost;dbname=db_name";    
       $username = "root"; 
       $password = "my_pwd"; 
       static::$instance = new Database($dns, $username, $password); 

      } 
      return static::$instance; 
     } 

     /** 
     * Detect param type 
     */ 

     protected function detectType($value) 
     { 
      if(is_string($value)) 
      { 
       return PDO::PARAM_STR; 
      } 
      else if(is_int($value)) 
      { 
       return PDO::PARAM_INT; 
      }        
      else if(is_null($value)) 
      { 
       return PDO::PARAM_NULL; 
      } 
      else if(is_bool($value)) 
      { 
       return PDO::PARAM_BOOL; 
      } 
      else 
      { 
       return false;  
      } 
     }   

     /** 
     * Updates table 
     */ 

     public function update($table, $data, $identifier) 
     { 

      $set = array(); 

      foreach ($data as $columnName => $columnValue) { 
       $set[] = $columnName . ' = ?'; 
      } 

      $query = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' = ? AND ', array_keys($identifier)) . ' = ?'; 
      $params = array_merge(array_values($data), array_values($identifier)); 

      array_unshift($params, null); 
      unset($params[0]); 

      echo $query; 

      $pdos = static::$instance->prepare($query); 

      foreach($params as $key => $param) 
      { 
       $pdos->bindValue($key, $param, $this->detectType($param)); 
      } 

      return $pdos->execute(); 

     } 

    } 

?> 

Вы бы использовать его как это:

use Database\DBAL\Database; 
$db = Database::getInstance(); 
$db->update("users", array("user_password" => "new password"), array("user_id" => 1)); 

Мой вопрос, это правильный способ сделать это? Я читал о декораторе и фасадном узоре, и он доцент выглядел так. Каков наилучший способ расширить класс PDO с помощью моих методов, которые бы выполняли простые удаления, вставляли и извлекали некоторые данные? И я хочу, чтобы PDO был неповрежденным, поэтому я могу использовать его так, как я обычно делал ... Какую модель мне следует использовать, и какой был бы лучший способ?

Спасибо!

+1

Считаете ли вы, что работаете с orm как доктрина? –

+0

ну не совсем, я использовал Doctrine DBAL, и мне это нравится, но я думаю, что он может стать лучше, чем API DBAL. Мне не нужен ORM, joust DBAL, но мне нужно больше методов, поэтому мне может быть проще получить данные, и мне нужно все, что защищено от SQL-инъекции, и это не относится к Doctrine DBAL. Поэтому я хотел бы построить нечто похожее на Doctrine DBAL, но проще, joust PDO с некоторыми дополнительными функциями, и все, что мне нужно, - это найти, какие шаблоны я должен использовать, и какой лучший способ расширить PDO. – Limeni

ответ

0

Если я прав, вы реализуете шаблон активной записи, который является анти-шаблоном. Обратите внимание на несколько рамок ORM. Я создал свой собственный: класс DataContext, который содержит всю PDO stuffess (я не расширяю PDO!), Классы TableEntity, которые обрабатывают все операции CRUD и классы Entity, которые являются «строками из таблиц».

$dc = new TestDataContext(...); 
$dc->users()->Where(column, 1, '=')->... 
$dc->users()->InsertOnSubmit(new User()) 
$dc->SubmitChanges(); 

Как Linq to SQL. :-)

Смежные вопросы