Php 如何在我的应用程序中自定义条令库以使用时间戳类型

Php 如何在我的应用程序中自定义条令库以使用时间戳类型,php,codeigniter,doctrine-orm,timestamp,composer-php,Php,Codeigniter,Doctrine Orm,Timestamp,Composer Php,我在我的应用程序中使用了带条令的Composer,但我需要自定义条令代码,更改条令\DBAL\Platforms\AbstractPlatform和条令\DBAL\Platforms\MySqlPlatform类 因此,我在我的应用程序的libraries目录中创建了MY_AbstractPlatform和MY_MySqlPlatform类,并扩展了相应的超类。然后我在我的自动加载中添加了这些类,但什么都没有发生 当我直接编写条令\DBAL\Platforms\AbstractPlatform和

我在我的应用程序中使用了带条令的Composer,但我需要自定义条令代码,更改条令\DBAL\Platforms\AbstractPlatform和条令\DBAL\Platforms\MySqlPlatform类

因此,我在我的应用程序的libraries目录中创建了MY_AbstractPlatform和MY_MySqlPlatform类,并扩展了相应的超类。然后我在我的自动加载中添加了这些类,但什么都没有发生

当我直接编写条令\DBAL\Platforms\AbstractPlatform和条令\DBAL\Platforms\MySqlPlatform类的代码时,实现是成功的,但是如果我在子类中实现了方法,什么都不会发生


我需要定制条令库,所以任何人都可以帮助我?

我设法以模块化的方式进行定制。我设法在我的应用程序中创建了条令的子类,并从连接设置中使用它们,设置driverClass属性,实例化类my my_Driver Driver

请参见如何设置连接原则,注意“driverClass”属性:

$connection_options = array(
            'driver' => 'pdo_mysql',
            'user' => $db['default']['username'],
            'password' => $db['default']['password'],
            'host' => $db['default']['hostname'],
            'dbname' => $db['default']['database'],
            'charset' => $db['default']['char_set'],
            'driverOptions' => array(
                'charset' => $db['default']['char_set'],
            ),
            'driverClass' => new MY_Driver()
        );
由于我的目标是允许该原则与timetamp字段一起工作,因此我创建了一个类来表示我的应用程序的驱动程序,继承了本机驱动程序类。My子类声明另一个My_MySqlPlatform子类,该子类包含MySql平台的定制,以应用时间戳

class MY_Driver extends Doctrine\DBAL\Driver\Mysqli\Driver {

    /**
     * Define a classe personalizada para o driver da plataforma MySql
     * 
     * {@inheritdoc}
     */
    public function getDatabasePlatform() {

        return new MY_MySqlPlatform();
    }

}
MY_MySqlPlatform类继承MySqlPlatform本机类,但应用它们自己的方法来使用时间戳类型

class MY_MySqlPlatform extends Doctrine\DBAL\Platforms\MySqlPlatform {

    /**
     * {@inheritDoc}
     */
    public function getDateTimeTypeDeclarationSQL(array $fieldDeclaration) {
        if (isset($fieldDeclaration['version']) && $fieldDeclaration['version'] == true) {
            return 'TIMESTAMP';
        }

        return 'TIMESTAMP';
    }

    /**
     * {@inheritDoc}
     */
    public function getTimestampTypeDeclarationSQL(array $fieldDeclaration) {
        return 'TIMESTAMP';
    }

    /**
     * {@inheritDoc}
     */
    protected function initializeDoctrineTypeMappings() {
        $this->doctrineTypeMapping = array(
            'tinyint' => 'boolean',
            'smallint' => 'smallint',
            'mediumint' => 'integer',
            'int' => 'integer',
            'integer' => 'integer',
            'bigint' => 'bigint',
            'tinytext' => 'text',
            'mediumtext' => 'text',
            'longtext' => 'text',
            'text' => 'text',
            'varchar' => 'string',
            'string' => 'string',
            'char' => 'string',
            'date' => 'date',
            'datetime' => 'datetime',
            'timestamp' => 'timestamp',
            'time' => 'time',
            'float' => 'float',
            'double' => 'float',
            'real' => 'float',
            'decimal' => 'decimal',
            'numeric' => 'decimal',
            'year' => 'date',
            'longblob' => 'blob',
            'blob' => 'blob',
            'mediumblob' => 'blob',
            'tinyblob' => 'blob',
            'binary' => 'blob',
            'varbinary' => 'blob',
            'set' => 'simple_array',
        );
    }

}
最后,我在项目TimestampType中创建了一个类,继承了本机类的类型,以在映射期间表示Tymestamp类型的属性

namespace Doctrine\DBAL\Types;

use Doctrine\DBAL\Platforms\AbstractPlatform;

class TimestampType extends Type {

    const TIMESTAMP = 'timestamp';

    /**
     * {@inheritdoc}
     */
    public function getName() {
        return self::TIMESTAMP;
    }

    /**
     * {@inheritdoc}
     */
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {

        return $platform->getTimestampTypeDeclarationSQL($fieldDeclaration);
    }

    /**
     * {@inheritdoc}
     */
    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        return ($value !== null) ? $value->format($platform->getTimestampTypeDeclarationSQL()) : null;
    }

    /**
     * {@inheritdoc}
     */
    public function convertToPHPValue($value, AbstractPlatform $platform) {
        if ($value === null || $value instanceof \DateTime) {
            return $value;
        }

        $val = \DateTime::createFromFormat($platform->getDateTimeFormatString(), $value);
        if (!$val) {
            throw ConversionException::conversionFailedFormat($value, $this->getName(), $platform->getDateTimeFormatString());
        }

        return $val;
    }

}