Kohana 3.2 устанавливает маршрутизатор для контроллера, который имеет префикс URI, принадлежащий другому контроллеру.

У меня есть 2 контроллера account.php и address.php в одном каталоге APP/controller. Для первого контроллера account.php я использую маршрутизатор по умолчанию для URI, например: учетная запись/создание, учетная запись/логин, учетная запись/выход из системы... При написании второго контроллера я хочу использовать все URI address.php, начиная с учетной записи/адреса /. Как вы можете видеть здесь, я беру те же совпадения маршрутизатора URI с контроллером учетной записи.

Мой первый подход:

// Add new address
Route::set('address', 'account/address/<action>')
        ->defaults(array(
                'controller' => 'address',
                'action'     => 'index',
        ));

Мой адресный контроллер

public function before()
{
    parent::before();

    if ( ! Auth::instance()->logged_in())
    {
        // Redirect to a login page (or somewhere else).
        $this->request->redirect('');
    }
}



// nothing here
public function action_index()
{
    $this->request->redirect('');
}


// create account
public function action_create()
{

    // Create an instance of a model
    $profile = new Model_Address();

    // received the POST
    if (isset($_POST) && Valid::not_empty($_POST)) 
    {   

        // // validate the form
        $post = Validation::factory($_POST)
        ->rule('firstname', 'not_empty')
        ->rule('lastname', 'not_empty')
        ->rule('address', 'not_empty')
        ->rule('phone', 'not_empty')
        ->rule('city', 'not_empty')
        ->rule('state', 'not_empty')
        ->rule('zip', 'not_empty')
        ->rule('country', 'not_empty')
        ->rule('primary_email_address', 'email');

        // if the form is valid and the username and password matches
        if ($post->check()) 
        {

            if($profile->create_profile($_POST)) 
            {
                $sent = kohana::message('profile', 'profile_created');
            }

        } else {
            // validation failed, collect the errors
            $errors = $post->errors('address');
        }

    }

    // display
    $this->template->title = 'Create new address';
    $this->template->content = View::factory('address/create')
            ->bind('post', $post)
            ->bind('errors', $errors)
            ->bind('sent', $sent);
}

Вроде все нормально, но не работает учетная запись/адрес/создание роутера. Kohana выдает сообщение 404 для этого URI.

Кто-нибудь знает, почему это происходит?


person lnguyen55    schedule 03.04.2012    source источник


Ответы (1)


Я проверил ваш маршрут в своей системе, и он работает нормально, поэтому я предполагаю, что ошибка где-то еще. Проверьте, является ли имя вашего класса контроллера Controller_Address, также попробуйте разместить этот маршрут первым в начальной загрузке, как документы говорят:

важно понимать, что маршруты сопоставляются в том порядке, в котором они добавляются, и как только URL-адрес соответствует маршруту, маршрутизация по существу «останавливается», а оставшиеся маршруты никогда не проверяются. Поскольку маршрут по умолчанию соответствует практически чему угодно, включая пустой URL-адрес, новые маршруты должны быть размещены перед ним.

Еще одна вещь, не связанная с вопросом - вы действительно должны разместить проверку внутри своей модели. Контроллер не место для него ;)

person matino    schedule 04.04.2012
comment
Удивительный человек, поставив это на первое место, делает свое дело. И да, вы правы, валидация должна быть в модели, тогда наш контроллер будет выглядеть чистым и читабельным. - person lnguyen55; 05.04.2012