Не расширять Repository
:
- База данных не является хранилищем, а хранилище имеет базу данных
- Ваша база данных / сеанс / конфигурация не связаны и не должны быть. Принцип подстановки Лискова :
[...] если S является подтипом T, то объекты типа T в программе могут быть заменены объектами типа S без изменения каких-либо желательных свойств этой программы (например, корректности).
Редактировать: пытается ответить на дополнительные вопросы в этом ответе.
Эта техника называется внедрением зависимости. Пример сеанса:
class Session {
// notice the clean API since no methods are carried along from a possibly huge base class
public function __construct(ISessionStorage $storage) {
$this->_storage = $storage;
}
public function set($key, $value) {
$this->_storage->set($key, $value);
}
}
interface ISessionStorage {
public function set($key, $value);
}
class DatabaseSessionStorage implements ISessionStorage {
public function __construct(Db $db) {
$this->_db = $db
}
public function set($key, $value) {
$this->_db->query("insert....");
}
}
class CookieSessionStorage implements ISessionStorage {
public function set($key, $value) {
$_SESSION[$key] = $value;
}
}
// example where it's easy to track down which object went where (no strings used to identify objects)
$session = new Session(new DatabaseSessionStorage(new Db()));
$session->set('user', 12512);
// or, if you'd prefer the factory pattern. Note that this would require some modification to Session
$session = Session::factory('database');
$session->set('user', 12512);
Конечно, вы можете хранить настройки подключения в жестком коде в файле конфигурации. Это только означает, что другие файлы должны получить доступ к этому классу конфигурации, не обращаясь к своим родителям. Например:
class Database {
// The same pattern could be used as with the sessions to provide multiple database backends (mysql, mssql etc) through this "public" Database class
public function __construct(Config $config) {
$this->_config = $config;
$this->_connect();
}
private function _connect() {
$this->_config->getDatabaseCredentials();
// do something, for example mysql_connect() and mysql_select_db()
}
}
Если вы предпочитаете хранить информацию о конфигурации вне php-файлов (для облегчения редактирования / чтения), см. Классы Zend_Config
для примеров доступа к различным устройствам хранения, включая более распространенные. : INI, массив PHP, XML. (Я упоминаю только Zend_Config, так как я использовал его и доволен, parse_ini_file
также подойдет.)
Хорошее и, надеюсь, легко читаемое: Fabience Potencier - Что такое внедрение зависимостей?
Редактировать # 2:
Также см. Слайд: Мэтью Вейер О'Финни - Архитектура ваших моделей