PHP - расширение PHP Data Object для добавления новых функций - PullRequest
2 голосов
/ 28 февраля 2012

Так вот чего я хотел бы достичь.Я хотел бы использовать PDO, просто как мне это нравится, но я хотел бы добавить несколько новых методов поверх PDO.

Нравится: update (), insert (), delete (), fetchAllAssoc() и т.д ...

Так что мне пришлось бы работать с объектами операторов PDO и PDO из одного класса.Из-за необходимости обновления, мне нужно было бы создать запрос, подготовить его, который бы возвращал объект Заявление PDO, а затем мне пришлось бы выполнить bindValues ​​и затем выполнить.

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

<?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));

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

Спасибо!

1 Ответ

0 голосов
/ 28 февраля 2012

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

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

Как Linq to SQL. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...