Php 如何在我的应用程序中自定义条令库以使用时间戳类型
我在我的应用程序中使用了带条令的Composer,但我需要自定义条令代码,更改条令\DBAL\Platforms\AbstractPlatform和条令\DBAL\Platforms\MySqlPlatform类 因此,我在我的应用程序的libraries目录中创建了MY_AbstractPlatform和MY_MySqlPlatform类,并扩展了相应的超类。然后我在我的自动加载中添加了这些类,但什么都没有发生 当我直接编写条令\DBAL\Platforms\AbstractPlatform和条令\DBAL\Platforms\MySqlPlatform类的代码时,实现是成功的,但是如果我在子类中实现了方法,什么都不会发生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和
我需要定制条令库,所以任何人都可以帮助我?我设法以模块化的方式进行定制。我设法在我的应用程序中创建了条令的子类,并从连接设置中使用它们,设置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;
}
}