考虑到每个应用程序启动一个书架实例的惯例[下面的示例],应该如何更改数据库[下面的用例]?
或者是同时启动具有与多个数据库的不同连接的多个书架实例的唯一可能的解决方法?
例如,一个简单的 CMS 应用程序,用于提供多个博客。所有博客和所有内容都遵循相同的架构,具有相同的模型等,只有子域/目录和相应的数据库不同。
通常情况下,Bookshelf 实例是在应用程序处理请求之前启动的,因此,需要动态设置/更改数据库,同时维护其余的连接凭据。
在app.js
module.exports = {
'database': {
mysql: {
client: 'mysql',
connection: {
host : 'localhost',
user : 'root',
password : '',
database : 'db',
charset : 'utf8'
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
在bookshelf.js
const config = require('./app.js');
const knex = require('knex')(config.database.mysql);
module.exports = require('bookshelf')(knex);
Run Code Online (Sandbox Code Playgroud) 我需要检查实体是否为特定实体的实例,并在保存新实体后做一些事情。类似于cakephp中的afterSave方法。我试过postFlush,onFlush,postPersist和postLoad。
AppBundle / EventListener / DoSomethingAfterSaveNewEntity.php
namespace AppBundle\EventListener;
use Doctrine\ORM\Event\OnFlushEventArgs;
use AppBundle\Entity\SomeEntity;
class DoSomethingAfterSaveNewEntity
{
public function onFlush(OnFlushEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
if (!$entity instanceof SomeEntity) {
die('not instance!!!');
}
die('post flush!!!');
$entityManager = $args->getEntityManager();
}
}
Run Code Online (Sandbox Code Playgroud)