Универсальный конроллер

vvolovikov

Новичок
Хочу написать универсальный контролер для одного проекта.

Дано:
index.php?Members=&Students=&Group=1&Show
PHP:
$_GET = 
Array
(
    [Members] => 
    [Students] => 
    [Group] => 1
    [Show] => 
)
или возможная строка с передачей параметров так:

index.php?Members=&Students=&Group=1&Student=15&Edit

PHP:
$_GET =
Array
(
    [Members] => 
    [Students] => 
    [Group] => 1
    [Student] => 15
    [Edit] => 
)
или возможно такая строка с передачей параметров:

index.php?Courses=&Course=1&Theory&Lecture=3&Edit

PHP:
$_GET = 
Array
(
    [Courses] => 
    [Course] => 1
    [Theory] => 
    [Lecture] => 3
    [Edit] => 
)
Зачем все это? Затем, что хочу сделать универсальный контролер, который бы все передаваемые параметры в $_GET превращал бы в :

PHP:
Admin::Members()->Students()->Group(1)->Edit();
Admin::Members()->Students()->Group(1)->Student(15)->Edit();
Admin::Courses()->Course(1)->Theory()->Lecture(3)->Edit();
Я надеюсь что очевидная наглядность такого вызова видна всем. Но вот так запустить систему нельзя.

PHP:
foreach ($_GET as $key => $value) {
	$command[] = isset($value) ? $key."(".$value.")" : $key."()";
}
$command = implode($command, "->");

Admin::$command;
Возникает вопрос, как реализовать такой механизм? Заранее спасибо за помощь
 

DYPA

Настоящая dypa (c)
первый вопрос который возник - как определить какой параметр будет первым в запросе :)
чем не устраивает передача значения как index.php?module=blabla ?
 

Dovg

Продвинутый новичок
С точки зрения синтаксиса - это возможно.
Как-то так:
PHP:
$object = call_user_func(array('className', $staticMethodName));

foreach ($arr as $method => $value)
  $object->$method($value);
Сразу подумай о валидации входных данных. Очень плохо пытататься исполнить все, что пришло из $_GET.
Где-то может быть карта доступных методов и значений, например.

Посмотри как устроены формы в популярных фреймворках.
 

AmdY

Пью пиво
Команда форума
бредовая идея, зачем связывать не связанные экшины в цепочку
 

vvolovikov

Новичок
С точки зрения синтаксиса - это возможно.
Как-то так:
PHP:
$object = call_user_func(array('className', $staticMethodName));

foreach ($arr as $method => $value)
  $object->$method($value);
Сразу подумай о валидации входных данных. Очень плохо пытататься исполнить все, что пришло из $_GET.
Где-то может быть карта доступных методов и значений, например.

Посмотри как устроены формы в популярных фреймворках.
То что вы написали, это запуск в цикле всех объектов и их методов, что переданы GET
Если в строке передано, например:
PHP:
index.php?Members=&Students=&Group=1&Edit
То произойдет вызов Admin::Members()->Students();
А дальше? То есть, тут перебор, а мне нужно наростание. Мне нужно чтобы по выше переданной строке, запускалось следующая цепочка объектов

PHP:
Admin::Members()->Students()->Group(1)->Edit();
Вот как технически это оформить?

Я же не могу просто брать все возможные переменные из GET

PHP:
$members = $_GET["Members"];
...
...
$action = $_GET["Student"];
..
Согласитесь, это же не серьезно ?
 

AmdY

Пью пиво
Команда форума
PHP:
$object = call_user_func(array('className', $staticMethodName));
foreach ($arr as $method => $value)
  $object = $object->$method($value);
 

vvolovikov

Новичок
AmdY - простите, я не смог реализовать то, что вы написали. Это не последовательность.
 

Духовность™

Продвинутый новичок
Зачем все это? Затем, что хочу сделать универсальный контролер, который бы все передаваемые параметры в $_GET превращал бы в :
PHP:
Admin::Members()->Students()->Group(1)->Edit();
Admin::Members()->Students()->Group(1)->Student(15)->Edit();
Admin::Courses()->Course(1)->Theory()->Lecture(3)->Edit();
Я надеюсь что очевидная наглядность такого вызова видна всем.
Все бред - от начала и до конца.

Контроллер - это просто скрипт, запускающий определенные части системы. Если тебе хочется красивости типа->вот->таких->вот , то нужно использовать ORM, модели и вообще писать все на ООП.
То, что находится в URL никак не должно влиять на структуру кода и его иерархию.
 

AmdY

Пью пиво
Команда форума
PHP:
class Foo {
	public function Foo1() {
		return new Foo1();
	}
}
class Foo1 {
	public function Foo2() {
		return new Foo2();
	}
}
class Foo2 {
	public function Foo3() {
		return new Foo3();
	}
}
class Foo3 {
	public function run() {
		echo "OK";
	}
}
$a = new Foo();
foreach (array('Foo1', 'Foo2', 'Foo3', 'run') AS $v) {
	var_dump($a);
	$a = $a->{$v}();
}
 

vvolovikov

Новичок
PHP:
class Foo {
	public function Foo1() {
		return new Foo1();
	}
}
class Foo1 {
	public function Foo2() {
		return new Foo2();
	}
}
class Foo2 {
	public function Foo3() {
		return new Foo3();
	}
}
class Foo3 {
	public function run() {
		echo "OK";
	}
}
$a = new Foo();
foreach (array('Foo1', 'Foo2', 'Foo3', 'run') AS $v) {
	var_dump($a);
	$a = $a->{$v}();
}

Спасибо. Действительно получилось. Не много ступил :)
 

vvolovikov

Новичок
Все бред - от начала и до конца.

Контроллер - это просто скрипт, запускающий определенные части системы. Если тебе хочется красивости типа->вот->таких->вот , то нужно использовать ORM, модели и вообще писать все на ООП.
То, что находится в URL никак не должно влиять на структуру кода и его иерархию.
Зачем же так сразу шашкой махать? Вы сами пишите " запускающий определенные части системы" - вот он и запускает. Только "вот так", а ни как обычно принято. &section=&task= и т.д.
 

vvolovikov

Новичок
С точки зрения синтаксиса - это возможно.
Как-то так:
PHP:
$object = call_user_func(array('className', $staticMethodName));

foreach ($arr as $method => $value)
  $object->$method($value);
Сразу подумай о валидации входных данных. Очень плохо пытататься исполнить все, что пришло из $_GET.
Где-то может быть карта доступных методов и значений, например.

Посмотри как устроены формы в популярных фреймворках.
Я для примера тут выложил _без_ валидации и _без_ проверки $_GET, а так, конечно, все это есть, в той или иной мере. Спасибо
 

Духовность™

Продвинутый новичок
вот он и запускает.
я пока не вижу того, что кто-то чего-то запускает. обсуждается какая-то абстрактная задача, лишенная какой-либо практической ценности. Ты чего сделать хочешь, можешь внятно объяснить?
 

vvolovikov

Новичок
я пока не вижу того, что кто-то чего-то запускает. обсуждается какая-то абстрактная задача, лишенная какой-либо практической ценности. Ты чего сделать хочешь, можешь внятно объяснить?
Ответ на мой вопрос уже дали. Спасибо.
Внятно написано в стартовом топике. Подробней написать просто не возможно.
А задача не абстрактная, а самая что есть реальная. Сам "текучий интерфейс" я уже создал, а вот контролер, с ходу сделать не получилось :)
 
Сверху