Кохана 3: Как я могу передать полный контроль другому действию в моем контроллере?

#kohana-3

#kohana-3

Вопрос:

В моем контроллере у меня есть функция before (), которая вызывает parent::before() , а затем выполняет некоторую дополнительную обработку после возврата родительского элемента. основываясь на определенном условии, я хочу «сохранить» исходный запрос и передать выполнение определенному действию. Вот моя функция before ().

 public function before() {
        parent::before();
        $this->uri = Request::Instance()->uri;
        $match = ORM::factory('survey_tester')
                    ->where('eid','=',$this->template->user->samaccountname)
                    ->find();
        if (!$match->loaded()) {
            self::action_tester("add",$this->template->user);
        }
    }
  

И действие, которое вызывается..

 public function action_tester($op=null,$user=null) {
        $testers                            = ORM::factory('survey_tester')->find_all();
        $tester                         = array();
        $this->template->title              = 'Some new title';
        $this->template->styles         = array('assets/css/survey/survey.css' => 'screen');
        $this->template->scripts            = array('assets/js/survey/tester.js');

        $tester['title']                        = $this->template->title;
        $tester['user']                     = $this->template->user;

        switch ($op) {
            case "add":
                $tester = ORM::factory('survey_tester');
                $tester->name = $user->displayname;
                $tester->email = $user->mail;
                $tester->division = $user->division;
                $tester->eid = $user->samaccountname;
                if ($tester->save()) {
                    $this->template->content = new View('pages/survey/tester_add', $admin);
                } else {
                    $this->template->content = new View('pages/survey/tester_error', $admin);
                }
                break;
            default:
                break;
        }
    }
  

Кажется, все это работает нормально. Это предназначено для запроса у пользователя определенной части информации, которая не предоставляется $ user (заполняется LDAP), если это первый раз, когда они по какой-либо причине обращаются к контроллеру.

Проблема в том, что представления не отображаются. Вместо этого управление возвращается к тому действию, которое было запрошено изначально. Этот контроллер называется survey. Если я перейду к http://my.site.com/survey при входе в систему с новой информацией о пользователе запись записывается, и я получаю представления action_index вместо моих представлений action_tester.

Я не могу понять, что я здесь делаю не так. Любые идеи будут оценены. Спасибо.

РЕДАКТИРОВАТЬ: мне удалось заставить это работать (вроде как) с помощью $this->request->action = 'tester'; , но я пока не уверен, как добавить / задать новые параметры для запроса.

Комментарии:

1. Почему self::action_tester() и нет $this->action_tester() ?

2. Это просто способ, которым это делал человек, у которого я начал учиться. Хотя это не имеет значения, $this->action_tester() делает то же самое. У меня все та же проблема.

3. О частичном решении. Вы можете сохранить дополнительные параметры в сеансе, свойствах контроллера или объекте просмотра ($this-> template-> set(…)). Эти данные будут доступны в выполняемом действии

Ответ №1:

Проблема в том, что вы вызываете свой метод (action_tester), но затем Kohana все равно собирается вызвать исходное действие после вызова метода before, который изменит содержимое ответа, перезаписав изменения, сделанные в action_tester().

Вы можете изменить вызываемое действие (после вызова before) внутри вашего метода before():

 $this->request->action('action_tester');
  

После вызова метода before он должен вызвать новое действие (action_tester) вместо старого, но затем вам нужно что-то сделать с тем, как вы затем передаете свои параметры.

Или вы могли бы просто перенаправить запрос при некоторых условиях:

 if($something) {
    $this->request->redirect('controller/tester');
}
  

В любом случае, это не кажется хорошим способом сделать это.