2013-10-07 1 views
1

в настоящее время с маршрутом по умолчанию Kohana 3.3, если я говорю о пользователе контроллера и действии, и я вызываю/пользователь/логин, все в порядке, действие вызывается и выполняется.Kohana 3.3 Route - действие не найдено перенаправлено на значение по умолчанию контроллера

, но теперь, если я изменяю URL-адрес/пользователь/логины, система не найдет никаких действий с именем логинов и возвратит ошибку «Kohana_HTTP_Exception [404]: запрошенный URL-адрес пользователя/логины не найден на этом сервере».

Мой вопрос в том, есть ли способ принудительно перенаправить/user/index (действие по умолчанию) в случае, если в контроллере не указано действие?

ура!

ответ

1

На самом деле вы должны переопределить класс HTTP_Exception_404.

Вы можете сделать страницу 404 NotFound. Но если вы хотите, чтобы перенаправлять на какой странице - вам необходимо выполнить следующие действия:

class HTTP_Exception_401 extends Kohana_HTTP_Exception_401 { 

/** 
* Generate a Response for the 401 Exception. 
* 
* The user should be redirect to a login page. 
* 
* @return Response 
*/ 
    public function get_response() 
    { 
     $response = Response::factory() 
      ->status(401) 
      ->headers('Location', URL::site('user/index')); 

     return $response; 
    } 
} 
1

EDIT:

Так, как @Darsstar предложил в комментарии, что лучше изменить действие в перед методом в контроллере, чем для переопределения метода выполнения. Так он идет, как это, в контроллере пользователя:

protected $default_action = 'index'; 

public function before() 
{ 
    $action = 'action_'.$this->request->action(); 
    if (!empty($this->default_action) && !method_exists($this, $action)) 
    { 
     $this->request->action($this->default_action); 
    } 
} 

Так что, если нет текущего действия действия и по умолчанию определяется она изменяет текущее действие запроса по умолчанию. Вы можете поместить этот код в главный контроллер и определить только $ default_action в субконтроллерах.


Старый ответ:

Вы должны переопределить выполнить метод из класса контроллера. Обычно это выглядит так:

public function execute() 
{ 
    // Execute the "before action" method 
    $this->before(); 

    // Determine the action to use 
    $action = 'action_'.$this->request->action(); 

    // If the action doesn't exist, it's a 404 
    if (! method_exists($this, $action)) 
    { 
     throw HTTP_Exception::factory(404, 
      'The requested URL :uri was not found on this server.', 
      array(':uri' => $this->request->uri()) 
     )->request($this->request); 
    } 

    // Execute the action itself 
    $this->{$action}(); 

    // Execute the "after action" method 
    $this->after(); 

    // Return the response 
    return $this->response; 
} 

Изменить его на что-то вроде этого:

public function execute() 
{ 
    // Execute the "before action" method 
    $this->before(); 

    // Determine the action to use 
    $action = 'action_'.$this->request->action(); 

    // If the action doesn't exist, check default action 
    if (! method_exists($this, $action)) 
    { 
       //Can be hardcoded action_index or $this->default_action set in controller 
       $action = 'action_index'; 

       // If the action doesn't exist, it's a 404 
       if (! method_exists($this, $action)) 
       { 
        throw HTTP_Exception::factory(404, 
          'The requested URL :uri was not found on this server.', 
          array(':uri' => $this->request->uri()) 
        )->request($this->request); 
       } 
    } 

    // Execute the action itself 
    $this->{$action}(); 

    // Execute the "after action" method 
    $this->after(); 

    // Return the response 
    return $this->response; 
} 

Теперь, если действие не существует, она проверяет действие по умолчанию и запускает его, или, если не существует бросками 404 .

+0

Изменение действия в методе before() было бы лучше. Это сделано для таких вещей. – Darsstar

+0

Хорошо, это имеет смысл. Не думал об этом ... – f1ames

Смежные вопросы