Есть класс boot.php, который вызывает класс рутера. после передает управление нужному контроллеру вместе с нужными параметрами.
self::$router->controllerObj = new self::$router->controller(self::$router->parameters);
Теперь контроллер в конструкторе видит параметры с которыми нужно работать.
А их должен увидеть абстрактный базовы класс котроллер, конструктор которого, вызывается в конструкторе текущего класса, что бы передать параметры базовому классу модели.
Что бы из модели тоже можно было видеть параметры.
По большому счету главное увидеть параметры в модельном классе, чем в конструкторе.
На данный момент архитектура такая, что в глобальную область видимости из рутера, чтоб написать многовато менять надо. Вот и вопрос как это правильно реализовать.
Надеюсь не запутал сумбурностью высказывания.)))
Спустя 48 минут, 21 секунда (28.02.2012 - 23:32) caballero написал(а):
а почему бы контроллеру самомоу не грузить нужную модель (с помощь функций базового контроллера - как вариант) и передавать ей то что нужно.
Цитата |
Возможно изначально неверная архитектура. |
Была бы верная не возникал бы такой архитехнологический вопрос как передать параметр
Спустя 7 минут, 59 секунд (28.02.2012 - 23:40) SlavaFr написал(а):
а можно чтото типа класс foo примерчик привести (работающий)?
Tак чтоб понятно стало что тебе мешает инициализироват класс foo каимито параметрами типа $х или $y.
A то хочется тебе помоч, но твоя проблема както не очень понятна.
Tак чтоб понятно стало что тебе мешает инициализироват класс foo каимито параметрами типа $х или $y.
A то хочется тебе помоч, но твоя проблема както не очень понятна.
Спустя 54 минуты, 17 секунд (29.02.2012 - 00:35) SoMeOnE написал(а):
caballero
Что бы не прописывать одни и те же вещи в каждом контроллере, а прописать все в одном.
Что бы не прописывать одни и те же вещи в каждом контроллере, а прописать все в одном.
Цитата |
Была бы верная не возникал бы такой архитехнологический вопрос как передать параметр |
Я так и подозревал)))
На этой архитектуре пока только один сайт обкатывается. Так, что думаю скидку можно сделать)
Спустя 10 минут, 57 секунд (29.02.2012 - 00:45) SoMeOnE написал(а):
SlavaFr
Сейчас постараемся. Прям с оригинала. Представи м что есть параметры записанные в массив parameters, которые приходят из класса рутер.
boot.php класс вызывает нужный котроллер
Текущий контроллер теперь видит параметры, а точнее его конструктор, т.е только при запуске класса.
А вот базовый котроллер.
Он и запустит модель под таким же названием. И в нее тоже нужно передавать параметры. Точнее впринципе только в ней они и нужны. Так как по id внутри класса модели будет обращение к базе данный и все такое.
По большому счету передавать параметры в конструктор, мне кажется не совсем хорошей идеей. Я хотел посоветоваться как грамотно реализовать данный момент, что бы можно бало работатьь с параметрами из любого контроллера и любой модели, без записи этих самих параметров в глобальную область видимости.
В универсале хотелось бы переопределять публичный массив
после получения их из класса рутер.
Сорри, что не смог запостить легкий пример с foo. Опыта не хватает быстро смоделировать проблемную ситуацию в легком варианте)
Сейчас постараемся. Прям с оригинала. Представи м что есть параметры записанные в массив parameters, которые приходят из класса рутер.
boot.php класс вызывает нужный котроллер
Свернутый текст
class Boot{
private static $router;
static function init(){
require_once ENGINE.DS. 'AutoLoader.php';
new AutoLoader();
self::$router = new Router();
self::checkController();
echo self::$router;
}
private static function checkController(){
if(!file_exists(CONTROLLERS . self::$router->controller . '.php')) throw new Exception('There is not such controller');
self::$router->controllerObj = new self::$router->controller(Router::$parameters);
if(!method_exists(self::$router->controllerObj, self::$router->action)) throw new Exception('There is not succodeh method in controller');
}
}
Текущий контроллер теперь видит параметры, а точнее его конструктор, т.е только при запуске класса.
А вот базовый котроллер.
Свернутый текст
abstract class Controller{
protected $currentModule;
public $parameters;
public function __construct(){
Router::$parameters;
$this->currentModule = str_replace('Controller', '', get_class($this));
require_once(MODELS . $this->currentModule .'.php');
$model_cur = $this->currentModule.'Model';
$model = new $model_cur;
$this->variables = $model->variables;
$viewfile = LAYOUT . $this->currentModule . '.php';
}
}
Он и запустит модель под таким же названием. И в нее тоже нужно передавать параметры. Точнее впринципе только в ней они и нужны. Так как по id внутри класса модели будет обращение к базе данный и все такое.
По большому счету передавать параметры в конструктор, мне кажется не совсем хорошей идеей. Я хотел посоветоваться как грамотно реализовать данный момент, что бы можно бало работатьь с параметрами из любого контроллера и любой модели, без записи этих самих параметров в глобальную область видимости.
В универсале хотелось бы переопределять публичный массив
public $parameters;, который задан и в базовом контроллереи в базовой модели.
после получения их из класса рутер.
Сорри, что не смог запостить легкий пример с foo. Опыта не хватает быстро смоделировать проблемную ситуацию в легком варианте)
Спустя 41 минута, 33 секунды (29.02.2012 - 01:27) SlavaFr написал(а):
а что мешает в классе просто зделать метод setParams($parameter)
и сразу после его инициализации садить через него нужные параметры?
и сразу после его инициализации садить через него нужные параметры?
Спустя 2 часа, 33 минуты, 33 секунды (29.02.2012 - 04:01) caballero написал(а):
Цитата |
Что бы не прописывать одни и те же вещи в каждом контроллере, а прописать все в одном. |
В таком случае зачем болше одного контроллера если "все в одном"?
Цитата |
По большому счету передавать параметры в конструктор, мне кажется не совсем хорошей идеей. |
Передавать параметры через конструктор вполне логично - для того конструкторы и созданы чтобы инициализировать объект.
Передавай все параметры ассоциативным массивом - будет везде одинаково.
Но все равно непонятно почему надо передавать параметры через базовый контроллер. Есть метод в базовом который позволяет загрузить модель (какого хрена это делает конструктор непонятно). То есть дочерний ее загружает (унаследованым методом) и инициализирвет нужным параметрами.
Спустя 5 часов, 23 минуты, 9 секунд (29.02.2012 - 09:24) SoMeOnE написал(а):
Цитата (SlavaFr @ 28.02.2012 - 22:27) |
а что мешает в классе просто зделать метод setParams($parameter) и сразу после его инициализации садить через него нужные параметры? |
неопытность. Можно поподробнее. Сам метод в каком классе прописать.
Легкий пример если можно.
Спустя 4 минуты, 29 секунд (29.02.2012 - 09:28) SoMeOnE написал(а):
Цитата (caballero @ 29.02.2012 - 01:01) | ||
Передавать параметры через конструктор вполне логично - для того конструкторы и созданы чтобы инициализировать объект. Передавай все параметры ассоциативным массивом - будет везде одинаково. Но все равно непонятно почему надо передавать параметры через базовый контроллер. Есть метод в базовом который позволяет загрузить модель (какого хрена это делает конструктор непонятно). То есть дочерний ее загружает (унаследованым методом) и инициализирвет нужным параметрами. |
Вот и сам сейчас думаю какого хрена это делает базовый контроллер)
Это случилось потому что увидел, что все мои контроллеры похожи друг на друга были. Вот я и вывел эти строки в базовый контроллер.
А учитывая, что передавать параметры в конструктор это правильно, сейчас так сделаю. Посмотрим, что получится.
Спустя 19 минут, 42 секунды (29.02.2012 - 09:48) TMake написал(а):
SoMeOnE не многовато ли статики? подключай к базовому контроллеру файл с массивом, в нем все подгружай, а все загружаемые модули наследуй от базового.
Спустя 52 минуты, 57 секунд (29.02.2012 - 10:41) SoMeOnE написал(а):
stepan
Да согласен) Router и Boot класс все таки придется поменять немного. Более читабельную структуру делать буду.
А в основном caballero, прав. каждый контроллер, должен сам вызывать нужную себе модель.
Т.е мне нужно переработать еще базовый класс контроллера и модели...
Да согласен) Router и Boot класс все таки придется поменять немного. Более читабельную структуру делать буду.
А в основном caballero, прав. каждый контроллер, должен сам вызывать нужную себе модель.
Т.е мне нужно переработать еще базовый класс контроллера и модели...