Лучший способ вызвать классы / методы в MVC? - PullRequest
1 голос
/ 14 ноября 2011

Хорошо, поэтому последние пару недель мы с другом (братом) работали над платформой на основе 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?Любая помощь приветствуется!

1 Ответ

3 голосов
/ 14 ноября 2011

Вы можете взглянуть на эту тему: PHP spl_autoload_register для spl_autoload_register (). Я думаю, что это то, что вы пытались реализовать в своем классе Bootstrap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...