Я проделал довольно много чтения об этом, и многие люди говорят, что я должен использовать одноэлементный класс. Я подумывал написать класс «Config», который будет включать файл «config.php» в __construct и цикл через значения $ config array и поместить их в значения $ this-> ...
Но тогда я прочитал все больше и больше о том, как нельзя использовать синглтоны. Поэтому мой вопрос: какой лучший подход для этого? Я хочу иметь конфигурационный файл для целей организации, содержащий все мои переменные $ config. Я не хочу быть жестким кодом, например, именами баз данных и паролями непосредственно в методы, с целью гибкости и еще чего-то.
Например, я использую следующий код в проекте MVC, я работаю над:
общественности/index.php
<?php
include '../app/bootstrap.php';
?>
приложение/bootstrap.php
<?php
session_start();
function __autoload ($class) {
$file = '../app/'.str_replace('_', '/', strtolower($class)).'.php';
if (file_exists($file)) {
include $file;
}
else {
die($file.' not found');
}
}
$router = new lib_router();
?>
приложение/lib/router.php
<?php
class lib_router {
private $controller = 'controller_home'; // default controller
private $method = 'index'; // default method
private $params = array();
public function __construct() {
$this->getUrl()->route();
}
private function getUrl() {
if (isset($_GET['url'])) {
$url = trim($_GET['url'], '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
$url = explode('/', $url);
$this->controller = isset($url[0]) ? 'controller_'.ucwords($url[0]) : $this->controller;
$this->method = isset($url[1]) ? $url[1] : $this->method;
unset($url[0], $url[1]);
$this->params = array_values($url);
}
return $this;
}
public function route() {
if (class_exists($this->controller)) {
if (method_exists($this->controller, $this->method)) {
call_user_func(array(new $this->controller, $this->method), $this->params);
}
else {
die('Method '.$this->method.' does not exist');
}
}
else {
die('Class '.$this->controller.' does not exist');
}
}
}
?>
Теперь, скажем, я посещаю http://localhost/myproject/lead/test
Он собирается вызвать controller_lead класс и тест метод внутри.
Вот код для приложения/контроллер/привести
<?php
class controller_lead extends controller_base {
public function test ($params) {
echo "lead test works!";
}
}
?>
приложение/контроллер/BASE
<?php
class controller_base {
private $db;
private $model;
public function __construct() {
$this->connect()->getModel();
}
private function connect() {
//$this->db = new PDO($config['db_type'] . ':host=' . $config['db_host'] . ';dbname=' . $config['db_name']. ', $config['db_user'], $config['db_pass'], $options);
return $this;
}
private function getModel() {
$model = str_replace('controller', 'model', get_class($this));
$this->model = new $model($this->db);
}
}
?>
Это где я бегу в вопрос. Как вы можете видеть, метод connect попытается создать новый объект PDO. Теперь, как я буду вводить эту переменную $ config, учитывая весь другой код, который я только что представил?
Мои варианты кажутся:
- Используйте синглтон (плохой)
- Использовать глобальные (хуже)
- Включите config.php в bootstrap.php, и ввести его в течение нескольких классов (Почему я должен вводить это в свой класс lib_router, когда lib_router не имеет абсолютно никакого отношения к базе данных? Это звучит как ужасная практика.)
Какой еще вариант у меня есть? Я не хочу делать какие-либо из этих трех вещей ...
Любая помощь была бы принята с благодарностью.
частное лицо $ db; должен вводиться через публичную функцию __construct ($ db) в controller_base, затем идти и искать лучшее, как создается PDO (возможно, lazyload, в bootstrap.php). –
или попробуйте подключить ваш MVC https://github.com/AnthonyWlodarski/Design-Pattern-Examples/blob/master/registry.php –
Это синглтон. Спасибо за ваши комментарии, но мой оригинальный вопрос все еще стоит. Кроме того, при вводе $ db в controller_base требуется сначала ввести его в lib_router, и, как я уже упоминал, lib_router не имеет абсолютно никакого отношения к базе данных. Его единственная цель - направить пользователя на соответствующий контроллер на основе URL-адреса, который они запрашивают. – inkd