Pergunta

Eu tenho um problema que eu não consigo descobrir.

Eu estou construindo um pequeno quadro (prática) e agora eu estou construindo a biblioteca Validator. tudo funciona soberba exceto quando eu tentar corrigir a regra "callback". regra de retorno de chamada é usado quando a necessidade dev para usar uma regra que existe dosen't na lib validador ..

Aqui está como eu estou fazendo isso.

No controlador:

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

Validator Classe:

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='') {

}

Meu problema é que, como eu posso usar o controlador "atual". Por exemplo, neste caso, eu preciso encontrar:

UserController::test();

posso encontrar o método certo em $ key, mas é a maneira simples de descobrir controlador wich que está rolando?

Eu tentei usar a url como:

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

Mas isso não funcionou em todos .. Alguma idéia?

Foi útil?

Solução

Algumas maneiras diferentes de abordar esta questão.

Em primeiro lugar, eu suponho que em algum lugar você tem algum código que transforma um URI

example.com/foo

para um controlador classname

class FooController

Este é normalmente chamado de "encaminhamento". Se assim for, de alguma forma exponha sua classe / método de router para o validador e / ou todo o sistema. Isso permitirá que você, a qualquer momento, obter o nome de um controlador da URI.

Em segundo lugar, ao instanciar o validador, dar-lhe uma referência para o objeto de controlador para o pedido particular. Então é apenas uma simples chamada para get_class_name ou o reflexo API de distância.

Em terceiro lugar, exigem que seu controlador ser passado junto com sua chamada para o método check.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top