McLotos
8.10.2015 - 15:02
Добрый вечер!
Есть базовый класс Controller. Все остальные контроллеры работают через него. Возникла такая ситуация. На одной из страниц нужно подключить 2 контроллера. Получается что при создании объекта второго контроллера, данные переданные первым объектом теряются. Как сделать так чтобы базовый контроллер не создавал отдельные экземпляры для каждого потомка, чтобы все потомки работали с одним общим объектом?
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Цитата (McLotos @ 8.10.2015 - 15:02) |
Все остальные контроллеры работают через него. |
Что это означает?
Цитата (McLotos @ 8.10.2015 - 15:02) |
На одной из страниц нужно подключить 2 контроллера. |
Зачем?
Цитата (McLotos @ 8.10.2015 - 15:02) |
данные переданные первым объектом теряются. |
Почему?
Цитата (McLotos @ 8.10.2015 - 15:02) |
Как сделать так чтобы базовый контроллер не создавал отдельные экземпляры для каждого потомка, чтобы все потомки работали с одним общим объектом?
|
Тут придется пояснять кодом.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
McLotos
8.10.2015 - 15:15
Цитата (chee @ 8.10.2015 - 17:09) |
Цитата (McLotos @ 8.10.2015 - 15:02) Все остальные контроллеры работают через него. Что это означает? |
Есть базовый класс Controller, остальные классы например menuController являются его потомками.
Цитата (chee @ 8.10.2015 - 17:09) |
Цитата (McLotos @ 8.10.2015 - 15:02) На одной из страниц нужно подключить 2 контроллера. Зачем? |
Мне нужно подключить контроллер, который создает страницу и контроллеры разных модулей, которые нужны на этой странице.
Цитата (chee @ 8.10.2015 - 17:09) |
Цитата (McLotos @ 8.10.2015 - 15:02) данные переданные первым объектом теряются. Почему? |
Есть Controller и есть его потомок, например MainPage extends Controller
Но на этой же странице нужно к примеру построить меню, которое создается объектом MenuBuilder extends Controller
Так вот второй потомок перезапускает базовый контроллер
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Так вот второй потомок перезапускает базовый контроллер
1 контроллер всегда должен запускаться, но можно сделать какую-нибудь function init() и запускать parent::init() где определить нужные параметры
McLotos, у тебя обязаности между слоями MVC распределены не правильно, то есть у тебя как я понял толстые контроллеры. Но это оффтоп.
Я понимаю что у тебя есть наследники, меня интересует как ты инициализируешь и почему у тебя появились проблемы с передачей в них общего контекста?
Нужен код запуска базового контролера и иницализации дочернего, что бы точно сказать, что тебе нужно сделать.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
McLotos
8.10.2015 - 15:33
Вот смотри. Бредокод конечно, но пока по-другому не придумал.
class Controller{
public $model;
public $view;
protected $cfg;
public function __construct($cfg){
$this->cfg = $cfg;
$this->model = new Model($cfg);
$this->view = new View($cfg);
}
}
class Main extends Controller{
private $pageData = array('Id'=>array(), 'name'=>array(),'value'=>array());
public function __construct($cfg, $request){
parent::__construct($cfg);
$this->request = $request;
$this->model = new mainModel($cfg);
}
public function index(){
$block = array();
$page = array('BreadCrumbValue'=>'Краткая статистика');
$data = $this->model->getStat();
foreach ($data as $k=>$v){
$block[count($block)]['Id'] = count($block);
$block[count($block)-1]['Status'] = '{LANG.'.ucwords($k).'}';
$block[count($block)-1]['Count'] = $v;
}
$files['mainBlock'] = 'main';
$this->view->assign('page', $page);
$this->view->assign('block', $block);
$this->view->assign('file', $files);
$this->view->generate();
}
}
class MenuBuilder extends Controller{
private $request;
public $model;
public function __construct($cfg, $request){
parent::__construct($cfg);
$this->request = $request;
$this->model = new menuModel($cfg);
}
public function addMenu(){
$arr = $this->model->getUserMenu($this->request->session('access'), 'left');
for($i=0; $i<count($arr); $i++){
$menu[$arr[$i]['MenuSection']][$i] = $arr[$i];
$menu[$arr[$i]['MenuSection']][$i]['id'] = $i;
}
$file['LeftBlock'] = 'menu';
$this->view->assign('menu', $menu);
$this->view->assign('file', $file);
}
private function array_column($arr, $key){
for($i=0; $i<count($arr); $i++){
foreach($arr[$i] as $k=>$v){
if($k==$key){
$new[$i] = $v;
}
}
}
return $new;
}
}
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.