返事が来たので、自分なりに答えます。
redbean が初期化されると、新しいツールボックスを構成できます。redbean のツールボックスは、クエリ ライター、Redbean OODB、およびデータベース アダプターの 3 つの重要なオブジェクトを処理します。現在の redbean ツールボックスにアクセスするには、R::$toolbox
このコードを実行できます:
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, R::$writer));
このコードは何もしません。新しいツールボックスを使用して Redbean を構成するが、同じ OODB、同じデータベース アダプター、および同じクエリ ライターを使用するためです。ただし、このコードでは、これらのオブジェクトの 1 つを独自のオブジェクトに置き換えることができます。
ライターをダミーのライターに置き換える例:
$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つの小さなクラスを書きました。
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
方法では、データベース内のすべてのテーブル名にプレフィックスを追加します。