Пишу свою модель MVC
а код привели контроллера. Да и в целом вы уже на этом этапе проигрываете. Не нужно даже пытаться разбираться с MVC, это конкретная реализация принципа разделения ответственности. Сначала стоит разобраться с принципом, лежащим в основе, а уже потом ковыряться с реализацией.
и мне кажется что я делаю что-то не так и хочется его добить
Давайте сначала по мелочам:
if ( !defined( 'FILE_COMPILE' ) )
убрать. Если вы собираетесь "конкатенировать PHP" - не делайте этого. Есть opcache.
if ( !class_exists ( 'Controller' ) ) {
composer и PSR-4 совместимая автозагрузка классов.
class Controller extends UDAPI {
Наследование классов (extends) - плохо (ну опять же в подавляющем большинстве случаев). Наследование типов (implements) - хорошо. Приучайте себя использовать наследование классов как крайнюю меру.
Ну и опять же, что это за UDAPI от которого вы наследуете контроллер? Не выгоднее ли передать его в конструктор контроллера как зависимость?
protected $uri;
protected $params = array();
protected $request = array();
сделайте отдельный класс Request и инкапсулируйте работу с ним там.
$this->uri = filter_input ( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
$this->uri = trim ( $this->uri, '/\\' );
$this->uri = urldecode ( $this->uri );
$this->uri = parse_url ( $this->uri, PHP_URL_PATH );
Опять же, это не задача контроллера. Контроллер пусть принимает уже готовый объект запроса.
if ( $this->uri == '' )
$this->redirect ( $this->config->root_uri . $this->default[ 'controller' ] . '/' . $this->default[ 'action' ], true );
Почитайте про мидлвэры, про фронт-контроллеры, про Model-View-Adapter. Последняя схема куда лучше вписывается в модель HTTP сервера.
public function ready ( ) {
сделайте отдельный компонент - роутер. Кто-то (например фронт контроллер) должен просить роутер узнать какой контроллер дергать. И потом уже дергать этот контроллер. Не надо пихать все в одну хрень, тем самым вы нарушаете саму идею "разделения ответственности" пытаясь реализовать конкретную реализацию этого принципа.
$this->setController ( array_shift ( $this->pattern ) );
$this->setAction ( array_shift ( $this->pattern ) );
Пара слов о состояние. Состояние это сложность. То есть посмотрев на переменную `$this->pattern` мы понятия не имеем что там хранится поскольку с течением времени его значение меняют. Причем зачем меняют - непонятно.
Чем раньше вы поймете что чрезмерная любовь к состоянию убивает в вас хорошего разработчика и возможности писать читабельный поддерживаемый код - тем будет лучше.
call_user_func_array ( array ( $controller, $this->action ), $this->request );
На дворе PHP7 между прочим.
} else {
echo '404 error';
}
раз уж начали - делайте всю обработку ошибок через исключения. Тут вам пригодится как раз фронт контроллеры и прочее.
public function isController ( $controller ) {
if ( is_dir ( SOURCE_DIR . '/controllers/' . $controller . '/' ) ) {
... PSR-4, классы... автозагрузка...
public function getModel ( $controller ) {
Для 2006-ого года в целом нормально, но это ж 10 лет назад.