Метод загрузки из текущего контроллера - PullRequest
0 голосов
/ 27 ноября 2009

У меня есть проблема, которую я не могу понять.

Я строю небольшой фреймворк (практика), а сейчас я создаю библиотеку Validator. все работает превосходно, кроме случаев, когда я пытаюсь исправить правило "обратного вызова". Правило обратного вызова используется, когда разработчику необходимо использовать правило, которого нет в библиотеке Validator.

Вот как я это делаю.

В контроллере:

$this->validator->check('req|callback:test', $_POST['module_name'], 'Module Name');

Класс валидатора:

public function check($rules, $input, $fieldname='') {
    $rule = explode('|', $rules);
    foreach ($rule as $r) {
        $request = explode(":",$r,2);
        $method = array_shift($request);
        $parameter = $request;
        array_unshift($parameter,$input);   
        array_push($parameter,$fieldname);
        if (method_exists($this, $method)) {
            call_user_func_array(array($this,$method), $parameter);
        }
  }

protected function callback($input, $key, $fieldname='') {

}

Моя проблема в том, как я могу использовать «текущий» контроллер. Например, в этом случае мне нужно найти:

UserController::test();

Я могу найти правильный метод в $ key, но является ли простой способ выяснить, какой контроллер запускается?

Я пытался использовать URL как:

$controller = ucfirst($uri->uri[1]).'Controller';
$controller::$key();

Но это не сработало вообще ... Есть идеи?

1 Ответ

0 голосов
/ 28 ноября 2009

Несколько разных способов подойти к этому.

Во-первых, я предполагаю, что где-то у вас есть код, который превращает URI

example.com/foo

в имя класса контроллера

class FooController

Обычно это называется маршрутизацией. Если это так, каким-то образом предоставьте свой класс / метод маршрутизатора валидатору и / или всей системе. Это позволит вам в любое время получить имя контроллера из URI.

Во-вторых, при создании экземпляра вашего валидатора дайте ему ссылку на объект контроллера для конкретного запроса. Тогда это всего лишь простой вызов get_class_name или API отражения.

В-третьих, требуется, чтобы ваш контроллер передавался вместе с вашим вызовом метода check.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...