MVC загрузка контроллеров

Zvook

Новичок
Нет, не фреймворк, где-то вычитал, где-то скопировал, где-то сам :)

Да, я в принципе сейчас понимаю как можно передать другую модель, но, я думаю что есть какие-то более рациональные способы.
Допустим, пользователь перешел в раздел "Новости" (www.../news), соответственно подгружается контроллер "controller_news", далее там идет обращение к модели "model_news", там реализуется вся логика, далее возвращается массив с полученными данными, то бишь $data. В нем хранятся только данные полученных новостей. Дальше все поступает в вид и там реализуется. Вот в чем вопрос. Я могу конечно в модели "model_news" подгружать другие модели, допустим модель с пользователями online и потом в представлении уже выводить этот блок, но это получается как-то не рационально, создавать в каждой модели метод с получением этого блока. Может быть можно как-то обойтись без этого ?
Может быть я чего-то не допонимаю, подскажите! Спасибо !
Ну вообще, ИМХО, модель не обязательно должна быть сторого привязана к контроллеру. Модель это фактически набор правил, методов, аттрибутов (еще бог знает чего), описывающая какую-то конкретную сущность (например, таблицу из БД) и предоставляющая функционал для работы с этими данными (типа create update delete). А ты "пришил" модель к контроллеру. Контроллер часто вообще без модели работает, а модель без контроллера. "но это получается как-то не рационально, создавать в каждой модели метод с получением этого блока" - не совсем понял о чем ты... Не нужно "В модель news" подгружать другие модели. Вообще, у нас немного разнится понимание что такое модель, свое понимание я описал выше, и на его основе могу сказать, что создать хоть 10 разных моделей в одном контроллере вполне нормально, если они тебе конечно там нужны. С другой стороны для тех же "пользователей online", имхо, лучше сделать отдельный блок, в УИИ например это виджет, в Симфони - компонент, это как раз позволит тебе использовать блок кода в разных местах сайта, не "создавая в каждой модели метод с получением этого блока". Если я правильно понял о чем ты... :)
 

buuni

Новичок
А вообще, конечно, для 15 лет хороший код )) Некоторые в 25 такое не пишут... Но, сильно ZF1 напоминает...
Спасибо большое, очень благодарен, стараюсь :)
Ну вообще, ИМХО, модель не обязательно должна быть сторого привязана к контроллеру. Модель это фактически набор правил, методов, аттрибутов (еще бог знает чего), описывающая какую-то конкретную сущность (например, таблицу из БД) и предоставляющая функционал для работы с этими данными (типа create update delete). А ты "пришил" модель к контроллеру. Контроллер часто вообще без модели работает, а модель без контроллера. "но это получается как-то не рационально, создавать в каждой модели метод с получением этого блока" - не совсем понял о чем ты... Не нужно "В модель news" подгружать другие модели. Вообще, у нас немного разнится понимание что такое модель, свое понимание я описал выше, и на его основе могу сказать, что создать хоть 10 разных моделей в одном контроллере вполне нормально, если они тебе конечно там нужны. С другой стороны для тех же "пользователей online", имхо, лучше сделать отдельный блок, в УИИ например это виджет, в Симфони - компонент, это как раз позволит тебе использовать блок кода в разных местах сайта, не "создавая в каждой модели метод с получением этого блока". Если я правильно понял о чем ты... :)
Да, ты правильно меня понял :)
Вот сейчас у меня навеяло мысли.
Что если сделать один главный контроллер, который получает данные из роутера, далее он там уже реализует подключение модулей, разных виджетов и вызывает другой контроллер, где уже реализуется модель, которую запрашивает пользователь. Вроде как-то так. Сейчас попробую сделать, может что-то полезное получится. Потом сразу вам отпишу что получилось :)
 

Zvook

Новичок
Спасибо большое, очень благодарен, стараюсь :)


Да, ты правильно меня понял :)
Вот сейчас у меня навеяло мысли.
Что если сделать один главный контроллер, который получает данные из роутера, далее он там уже реализует подключение модулей, разных виджетов и вызывает другой контроллер, где уже реализуется модель, которую запрашивает пользователь. Вроде как-то так. Сейчас попробую сделать, может что-то полезное получится. Потом сразу вам отпишу что получилось :)
Ну да, как-то так. Это Base Controller от которого уже наследуются классы контроллеров с экшенами
 

buuni

Новичок
Ну да, как-то так. Это Base Controller от которого уже наследуются классы контроллеров с экшенами
Нет, немного не то, Base controller он и так уже есть. Я имею в виду один - главный контроллер, через который уже присоединяются другие контроллеры, а там уже реализуется модель, если она есть и передается опять-же в главный контроллер и там генерируется вид.
 

Zvook

Новичок
главный контроллер, через который уже присоединяются другие контроллеры, а там уже реализуется модель, если она есть и передается опять-же в главный контроллер
*facepalm*
 

Василий М.

Новичок
Василий М., с каждым instanceof где-то умирает котёнок. Зачем вводить различия между XML и PNG с точки зрения фронт-контроллера?
различные типы. редирект и вьюха - как бы не одно и тоже, требует разных правил обработки.

отсюда front-controller это не обязательный элемент это часть controller!
controller не может сам по себе запускаться, это лишь мотор, который нужно кому-то запускать.
 

ваяс

Все чикан-пикан
Да, отсюда вычитал про структуру контроллеров/видов/моделей.
еще вот, тоже подчеркнуть можно много чего ссылка
Ещё про namespace почитай, лишним не будет, и более правильный маршрутизатор построишь...
В любом случае все к ним и идет.
 

ваяс

Все чикан-пикан
Кстати роутер перепиши немного, как например сформируешь такую ссылку
?act=1&name=vayas
Или такую
publication-news
Не факт что они тебе будут нужны,но все таки.
И не говори что всем папкам будешь давать такие названия ))
 

buuni

Новичок
А роутер у меня совершенно другой, я его полностью переделал, еще конечно не идеал, но уже что-то :)
 

ваяс

Все чикан-пикан
Ну это по сути то же что include, только на порядок лучше
Можешь по гуглить типо так
how to create namespace in mvc php
И проку в англоязычных сайтах будет больше. Заодно и английский подучишь просто так, а пока google translit (это на тот случай если ты им не владеешь ;))
 

ваяс

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

buuni

Новичок
Вот мой роутер, критикуйте, учту любую критику :)

PHP:
<?php
class Route {
    private $parseArray;
	
	public function __construct($controller = 'index', $action = 'index'){
	    $this->parseURL();
        $controller = $this->getController();
        $action = $this->getAction();
        $option = $this->getOptions();
	}
    
    public function parseURL($url = null){ // Работаем с URL, распределяем в массив
    
        if($url == null) $url = $_SERVER['REQUEST_URI'];
        $url_path = array();
        $url_path = parse_url($url, PHP_URL_PATH);
		$uri_parts = explode('/', trim($url_path, ' /'));
        $this->parseArray = $uri_parts;
    }
    
    public function getController(){ // Получаем имя контроллера
        if(empty($this->parseArray[0])) $controller = 'index';
        else $controller = array_shift($this->parseArray);
        return $controller;
    }
    
    public function getAction(){ // Получаем имя экшена
        return self::getController();
    }
    
    public function getOptions(){ // Получаем опции экшена
        if(!empty($this->parseArray) and !(count($this->parseArray) & 1)){ // Проверяем четность
            $option = array();
            do{
                array_push($option, array(array_shift($this->parseArray) => array_shift($this->parseArray)));
            }while(!empty($this->parseArray));
            return $option;
        }
    }
}
?>
Этот роутер только получает значения, не проверяет на наличие файлов.
Вот результат работы по ссылке: www.../controller/action/option1/value1/option2/value2/

Controller: controller
Action: action
Option:
Array
(
[0] => Array
(
[option1] => value1
)

[1] => Array
(
[option2] => value2
)

)
 
Сверху