我现在得到了回复,所以我自己回答。
redbean 初始化后,就可以配置新的工具箱了。 redbean 中的工具箱处理 3 个重要对象:查询编写器、Redbean OODB 和数据库适配器。你可以通过R::$toolbox访问当前的redbean工具箱
你可以做这个代码:
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, R::$writer));
这段代码什么都不做。因为您使用新工具箱配置 Redbean,但使用相同的 OODB、相同的数据库适配器和相同的查询编写器。但在这段代码中,您可以将其中一个对象替换为您自己的对象。
例如,将 writer 替换为 dummy writer:
$writer = new MyQueryWriter();
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));
问题如下:
- 您想用自己的查询编写器替换查询编写器来处理表前缀
- 查询编写器类并不总是相同的。 Redbean 使用 5 个类作为查询编写器。该类取决于数据库类型。例如,如果您使用 Mysql 数据库,则查询编写器类为
RedBean_QueryWriter_MySQL
- 您不想编写完整的查询编写器。
Redbean 查询编写器可能的类是:
- RedBean_QueryWriter_CUBRID
- RedBean_QueryWriter_MySQL
- RedBean_QueryWriter_Oracle
- RedBean_QueryWriter_PostgreSQL
- RedBean_QueryWriter_SQLiteT
所以,这是我的解决方案。我写了 5 个 littles 类。
class MyCubridQueryWriter extends RedBean_QueryWriter_CUBRID {
public function safeTable($name, $noQuotes = false) {
$name = prefix($name);
return parent::safeTable($name, $noQuotes);
}
}
class MyMysqlQueryWriter extends RedBean_QueryWriter_MySQL {
public function safeTable($name, $noQuotes = false) {
$name = prefix($name)
return parent::safeTable($name, $noQuotes);
}
}
class MyOracleQueryWriter extends RedBean_QueryWriter_Oracle {
public function safeTable($name, $noQuotes = false) {
$name = prefix($name)
return parent::safeTable($name, $noQuotes);
}
}
class MyPostgreSqlQueryWriter extends RedBean_QueryWriter_PostgreSQL {
public function safeTable($name, $noQuotes = false) {
$name = prefix($name)
return parent::safeTable($name, $noQuotes);
}
}
class MySQLiteTQueryWriter extends RedBean_QueryWriter_SQLiteT {
public function safeTable($name, $noQuotes = false) {
$name = prefix($name)
return parent::safeTable($name, $noQuotes);
}
}
如您所见,每个类都扩展了一个 Redbean 查询编写器类。我们重写了safeTable 方法。 Redbean 总是在表名上使用safeTable。 prefix 函数很简单:
function prefix($table) {
return "my_prefix_$table";
}
现在,在我们的代码中。我们可以使用数组将 Redbean 查询编写器类映射到我们自己的类并替换它。我们在这里:
$writerMapping = array(
'RedBean_QueryWriter_CUBRID' => 'MyCubridQueryWriter',
'RedBean_QueryWriter_MySQL' => 'MyMysqlQueryWriter',
'RedBean_QueryWriter_Oracle' => 'MyOracleQueryWriter',
'RedBean_QueryWriter_PostgreSQL' => 'MyPostgreSqlQueryWriter',
'RedBean_QueryWriter_SQLiteT' => 'MySQLiteTQueryWriter'
);
$class = $writerMapping[get_class(R::$writer)];
$writer = new $class(R::$adapter);
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));
等等,瞧。现在 Redbean 将使用你自己的作家,你可以做你想做的事!使用我们的safeTable 方法,我们为数据库中的每个表名添加一个前缀。