Хорошо, поэтому последние пару недель мы с другом (братом) работали над платформой на основе MVC.Однако мы не знаем, как лучше загружать другие классы / методы.
Сначала мы использовали «загрузчик», который позволял нам вызывать любой конкретный класс, который мы хотели, а затем соответствующийметод (Bootstrap::$load->Base_Model()->query()
).Однако этот подход не казался очень эффективным, поскольку почти каждый класс / метод (по большей части) должен загружать другой контроллер, модель и / или представление.Это означало, что было бы много вызовов Bootstrap:$load
, что делало классы более длинными и менее организованными.
Вот основной класс Bootstrap, который вызывается в индексе, и все в основном построено здесь:
class Bootstrap {
public static $load;
public function __construct() {
require_once 'Slave/Base/Loader.php';
self::$load = new Loader();
$this->load = self::$load;
}
public function build() {
Bootstrap::$load->Base_Controller();
Bootstrap::$load->Controller_Pages()->load($_GET['src']);
}
}
Вот как выглядел наш загрузчик, для которого в Bootstrap было установлено статическое значение:
class Loader extends Bootstrap {
public static $classes = array();
public function __construct() {
//do nothing
}
public function __call($method, $arg = null) {
if(!is_object($this->classes[$method])) {
$url = 'Slave/' . str_replace('_', '/', $method) . '.php';
if(file_exists( $url )) {
require_once $url;
$this->classes[$method] = new $method((count($args) > 0 ? $args : null ) );
}else{
trigger_error( 'Cannot find class "'. $method.'" within "' . $url . '"', E_USER_ERROR );
}
}
return $this->classes[$model];
}
}
Поэтому мы решили установить дочерние классы для Controller, Model и View вконструкция каждого из них, что позволяет нам сделать что-то вроде $this->Model->User->register()
в стороне от контроллера пользователя.Хотя с этим тоже были проблемы.Это не позволяло нам вызывать parent::__construct();
внутри дочернего класса, если мы установили этот дочерний класс (например, пользовательский контроллер) в $this->User = Bootstrap:$load->Controller_User();
в родительском классе (то есть, контроллере).
Это также означалочто каждый класс должен вызываться, даже если он не нужен для этой конкретной страницы.
Например, вот как должен выглядеть наш основной класс Controller:
class Base_Controller extends Bootstrap {
public $Model;
public $Validate;
public $View;
public function __construct() {
/* Call Other Classes */
$this->Model = Bootstrap::$load->Base_Model();
$this->View = Bootstrap::$load->Base_View();
/* Call Other Functions */
$this->Validate = Bootstrap::$load->Controller_Validate();
}
}
будьте ясны, мы хотели бы иметь возможность сделать что-то подобное в любом классе / методе:
$this->Model->query();
$this->Controller->Validate->chars($string);
.. или как это, так как мы смотрим на это с точки зрения контроллера:
$this->Model->query();
$this->Validate->chars($string);
В отличие от необходимости делать что-то вроде метода загрузчика Bootstrap:
Bootstrap::$load->Base_Model()->query();
Bootstrap::$load->Controller();
Bootstrap::$load->Controller_Validate()->chars($string);
Но без необходимости устанавливать каждый дочерний класс в Controller, Model и View.
Итак, как лучше всего вызывать методы в MVC?Любая помощь приветствуется!