swoft-db-model
基于Swoft的Model封装, (*1)
, (*2)
Mysql Connection 事件的使用
- 增加事件类
<?php
namespace SwoftTest\Db\Testing\Listener;
use Swoft\App;
use Swoft\Bean\Annotation\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
use SwoftTest\Db\Testing\Entity\User;
use Xin\Swoft\Db\Driver\Mysql\MysqlConnection;
use Xin\Swoft\Db\Event\MysqlConnectionEvent;
/**
* Model before save handler
*
* @Listener(MysqlConnectionEvent::AFTER_EXECUTE)
*/
class AfterExecuteListener implements EventHandlerInterface
{
/**
* @param \Swoft\Event\EventInterface $event
*/
public function handle(EventInterface $event)
{
/** @var MysqlConnection $model */
$model = $event->getConnection();
$runtime = App::getAlias('@runtime');
$file = $runtime . '/sql.log';
file_put_contents($file, $model->getSql() . PHP_EOL, FILE_APPEND);
}
}
- 重写默认DB连接池
主库, (*3)
<?php
namespace App\Pool;
use Swoft\Bean\Annotation\Pool;
use Swoft\Db\Pool\DbPool as SwoftDbPool;
use Xin\Swoft\Db\Pool\CreateConnectionTrait;
/**
* OtherDbPool
*
* @Pool("default.master")
*/
class DbPool extends SwoftDbPool
{
use CreateConnectionTrait;
}
从库, (*4)
<?php
namespace App\Pool;
use Swoft\Bean\Annotation\Pool;
use Swoft\Db\Pool\DbSlavePool as SwoftDbSlavePool;
use Xin\Swoft\Db\Pool\CreateConnectionTrait;
/**
* OtherDbSlavePool
*
* @Pool("default.slave")
*/
class DbSlavePool extends SwoftDbSlavePool
{
use CreateConnectionTrait;
}
- 实体类增加DB连接池的Instance
此实体重写了Mysql和同步Mysql链接,但是连接池配置与default一致,可以放心使用。
注解如下
@Entity(instance="dbModel")
模型事件的使用
增加事件类, (*5)
<?php
namespace SwoftTest\Db\Testing\Listener;
use Swoft\Bean\Annotation\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
use SwoftTest\Db\Testing\Entity\User;
use Xin\Swoft\Db\Event\ModelEvent;
/**
* Model before save handler
*
* @Listener(ModelEvent::BEFORE_SAVE)
*/
class BeforeSaveListener implements EventHandlerInterface
{
/**
* @param \Swoft\Event\EventInterface $event
*/
public function handle(EventInterface $event)
{
/** @var User $model */
$model = $event->getModel();
if (method_exists($model, 'setCreatedAt') && method_exists($model, 'setUpdatedAt')) {
$date = date('Y-m-d H:i:s');
$model->setCreatedAt($date);
$model->setUpdatedAt($date);
}
}
}
将事件类的位置放到 beanScan 中, (*6)
<?php
// config/properties
return [
'version' => '1.0',
'autoInitBean' => true,
'beanScan' => [
'SwoftTest\\Db\\Testing' => BASE_PATH . '/Testing',
'Xin\\Swoft\\Db' => BASE_PATH . '/../src',
],
'I18n' => [
'sourceLanguage' => '@root/resources/messages/',
],
'env' => 'Base',
'user.stelin.steln' => 'fafafa',
'Service' => [
'user' => [
'timeout' => 3000
]
],
'db' => require dirname(__FILE__) . DS . 'db.php',
];