Метод загрузки из текущего контроллера
-
05-07-2019 - |
Вопрос
У меня есть проблема, которую я не могу решить.
Я строю небольшой фреймворк (практика), а сейчас я создаю библиотеку Validator. все работает превосходно, за исключением случаев, когда я пытаюсь исправить " callback " править. Правило обратного вызова используется, когда разработчику необходимо использовать правило, которого нет в библиотеке Validator.
Вот как я это делаю.
В контроллере:
$this->validator->check('req|callback:test', У меня есть проблема, которую я не могу решить.
Я строю небольшой фреймворк (практика), а сейчас я создаю библиотеку Validator. все работает превосходно, за исключением случаев, когда я пытаюсь исправить " callback " править. Правило обратного вызова используется, когда разработчику необходимо использовать правило, которого нет в библиотеке Validator.
Вот как я это делаю.
В контроллере:
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();
Моя проблема в том, как я могу использовать " текущий " контроллер. Например, в этом случае мне нужно найти:
$controller = ucfirst($uri->uri[1]).'Controller';
$controller::$key();
Я могу найти правильный метод в $ key, но есть ли простой способ выяснить, какой контроллер работает?
Я пытался использовать URL как:
<*>
Но это не сработало вообще ... Есть идеи?
POST['module_name'], 'Module Name');
Класс валидатора:
<*>Моя проблема в том, как я могу использовать " текущий " контроллер. Например, в этом случае мне нужно найти:
<*>Я могу найти правильный метод в $ key, но есть ли простой способ выяснить, какой контроллер работает?
Я пытался использовать URL как:
<*>Но это не сработало вообще ... Есть идеи?
Решение
Несколько разных способов подойти к этому. Р>
Во-первых, я предполагаю, что где-то у вас есть код, который превращает URI
example.com/foo
в имя класса контроллера
class FooController
Обычно это называется "маршрутизацией". Если это так, каким-то образом предоставьте свой класс / метод маршрутизатора валидатору и / или всей системе. Это позволит вам в любое время получить имя контроллера из URI.
Во-вторых, при создании экземпляра вашего валидатора дайте ему ссылку на объект контроллера для конкретного запроса. Тогда это просто простой вызов get_class_name
или API отражения. Р>
В-третьих, потребуйте, чтобы ваш контроллер передавался вместе с вашим вызовом метода check
.