2015-04-16 3 views
2

Я проделал довольно много чтения об этом, и многие люди говорят, что я должен использовать одноэлементный класс. Я подумывал написать класс «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 не имеет абсолютно никакого отношения к базе данных? Это звучит как ужасная практика.)

Какой еще вариант у меня есть? Я не хочу делать какие-либо из этих трех вещей ...

Любая помощь была бы принята с благодарностью.

+0

частное лицо $ db; должен вводиться через публичную функцию __construct ($ db) в controller_base, затем идти и искать лучшее, как создается PDO (возможно, lazyload, в bootstrap.php). –

+0

или попробуйте подключить ваш MVC https://github.com/AnthonyWlodarski/Design-Pattern-Examples/blob/master/registry.php –

+0

Это синглтон. Спасибо за ваши комментарии, но мой оригинальный вопрос все еще стоит. Кроме того, при вводе $ db в controller_base требуется сначала ввести его в lib_router, и, как я уже упоминал, lib_router не имеет абсолютно никакого отношения к базе данных. Его единственная цель - направить пользователя на соответствующий контроллер на основе URL-адреса, который они запрашивают. – inkd

ответ

0

В итоге я включил файл конфигурации в моем бутстрапе, который просто содержал константы и использовал константы.

+0

Этот звук просто прекрасен - здесь много преимуществ. – sitilge

0

В итоге я включил файл конфигурации в своем бутстрапе, который просто содержал константы и использовал константы.

Это был тот же случай для меня - потребовался файл в Model. Основанный на файлах подход был наилучшим, так как он имеет некоторые преимущества: вы можете .gitignore, установить настраиваемый набор разрешений, все ваши параметры хранятся централизованно и т. Д.

Однако, если конфигурационный файл содержит только параметры подключения DB, для запроса файла конфигурации только в Model. Возможно, вы также можете разбиться на несколько более конкретных конфигурационных файлов и потребовать их там, где это необходимо.

public function __construct() 
{ 
    if (self::$handle === FALSE) 
    { 
     $db = array(); 

     require APP_DIR.DIR_SEP.'system'.DIR_SEP.'config'.DIR_SEP.'Database.php'; 

     if (!empty($db)) 
     { 
      $this->connect($db['db_host'], $db['db_user'], $db['db_password'], $db['db_name']); 
     } 
     else 
     { 
      Error::throw_error('Abimo Model : No database config found'); 
     } 
    } 
} 
Смежные вопросы