我在我的 php 项目中使用 Redbeanphp ( http://redbeanphp.com/ )。我想为我的表使用表前缀。
Redbeanphp 从 3.0 版本开始不支持表前缀。但我想扩展 Redbeanphp 以支持我的项目中的表前缀。
我不想修改 redbeanphp 代码。但如果没有解决方案,我会这样做。
我已经尝试替换 Redbeanphp 的 QueryWriter 但 QueryWriter 类并不总是相同的(这取决于我的数据库类型)。
最好的方法是什么?
最佳答案
我现在得到了回应,所以我回答自己。
一旦 redbean 被初始化,你就可以配置一个新的工具箱。 redbean 中的工具箱处理 3 个重要对象:查询编写器、Redbean OODB 和数据库适配器。您可以使用 R::$toolbox
访问当前的 redbean 工具箱
您可以执行以下代码:
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, R::$writer));
这段代码什么都不做。因为您使用新工具箱配置 Redbean,但使用相同的 OODB、相同的数据库适配器和相同的查询编写器。但是在这段代码中,您可以用您自己的对象替换这些对象之一。
例如,用虚拟作家替换作家:
$writer = new MyQueryWriter();
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));
问题如下:
RedBean_QueryWriter_MySQL
Redbean 查询编写器可能的类是:
所以,这是我的解决方案。我写了 5 个小类。
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
方法,我们为数据库中的每个表名添加一个前缀。