[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как правильней передать параметр
SoMeOnE
Немного запутался. Возможно изначально неверная архитектура. Но может кто поможет.
Есть класс 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 то хочется тебе помоч, но твоя проблема както не очень понятна.

Спустя 54 минуты, 17 секунд (29.02.2012 - 00:35) SoMeOnE написал(а):
caballero
Что бы не прописывать одни и те же вещи в каждом контроллере, а прописать все в одном.

Цитата
Была  бы   верная   не   возникал  бы  такой   архитехнологический   вопрос  как   передать  параметр

Я так и подозревал)))

На этой архитектуре пока только один сайт обкатывается. Так, что думаю скидку можно сделать)

Спустя 10 минут, 57 секунд (29.02.2012 - 00:45) SoMeOnE написал(а):
SlavaFr
Сейчас постараемся. Прям с оригинала. Представи м что есть параметры записанные в массив 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, прав. каждый контроллер, должен сам вызывать нужную себе модель.
Т.е мне нужно переработать еще базовый класс контроллера и модели...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.