Кохана: запрошенный URL не найден - PullRequest
2 голосов
/ 25 января 2012

Итак, я пытаюсь установить и запустить Kohana. Я очень новичок в этом и фреймворки в целом (хотя я немного использовал CakePHP).

В любом случае ... в моем файле начальной загрузки у меня есть это:

// GET PARAMS -- This basically splits domain.com/kohana/controller/action/param1/etc
// into: controller | action | param1 | etc
$requestURI = explode('/', $_SERVER['REQUEST_URI']);
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);

    for($i= 0;$i < sizeof($scriptName);$i++){
      if ($requestURI[$i] == $scriptName[$i]){
         unset($requestURI[$i]);
      }
    }

    $param = array_values($requestURI);
    $controller = @ $param[0];
    $action = @ $param[1];
    $param1 = @ $param[2];
    $param2 = @ $param[3];
    $param3 = @ $param[4];
    $param4 = @ $param[5];
    $param5 = @ $param[6];
    $param6 = @ $param[7];

Теперь я хочу подключиться к своей базе данных и в основном посмотреть, равен ли первый параметр $ param [0] aka $ controller одной из моих страниц "категориям" (соответствует моей таблице category_pages). Если это категория, то я хочу использовать контроллер категорий по умолчанию, в противном случае контроллер должен иметь значение $ param [0]. Это означает, что если я захожу на domain.com/kohana/movies или domain.com/kohana/games, он отображает контроллер категорий, в противном случае domain.com/kohana/users отображает контроллер пользователей.

$db = Database::instance();
$getiscategory  = DB::select('*')->from('categories_pages')->where('directory', '=', $controller)->execute();
$is_category = $getiscategory->count();

if($is_category){
$controller = "categories";
}

    $controller = (empty($controller)) ? 'index' : $controller;
    $action = (empty($action)) ? 'index' : $action;      

То, что я хотел выполнить вышеупомянутые работы. Если я отображаю $ is_category, я вижу, что при совпадении категорий возвращается значение 1, а если я отображаю $ controller, я вижу, что «category» установлен как контроллер.

Вот мой код фактического метода маршрутизации ...

Route::set(
    'custom',
    '(<controller>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>)))))))'
    )->defaults(array(
    'controller' => $controller,
    'action'     => $action,
    'param1'     => $param1,
    'param2'     => $param2,
    'param3'     => $param3,
    'param4'     => $param4,
    'param5'     => $param5,
    'param6'     => $param6,
));

К сожалению, я не уверен, куда он направляется. Как я упоминал ранее, $ controller возвращается как категории, что является правильным, но все же я получаю сообщение об ошибке «HTTP_Exception_404 [404]: Запрошенный URL $ param [0] (фильмы или игры и т. Д.) Не найден на этом сервере». 1014 *

Имейте в виду, у меня нет класса контроллера для $ param [0], если он соответствует категории, потому что я хочу использовать класс контроллера "категории". Если я захожу на domain.com/kohana/categories, он работает нормально.

У кого-нибудь есть какие-нибудь идеи / знаете обходной путь?

Дополнение № 1

Я понял, что, хотя контроллер категорий вызывается и вызывается правильное действие, он все еще требует, чтобы контроллер «показывает» для отображения. Я добавил контроллер шоу с самой базовой информацией (шаблон, контент и т. Д.), И он показывался правильно. Есть ли обходной путь в классе маршрутизации, чтобы назначенный контроллер показывал? Как я уже сказал, я говорю ему, к какому контроллеру обращаться, и он это подтверждает, но на самом деле не идет к нему.

1 Ответ

1 голос
/ 27 января 2012

Я думаю, вы слишком усложняете вещи.Кроме того, ваш код будет принудительно устанавливать ограничение в 6 параметров для каждого запроса.

Возможно, мне будет проще использовать два разных маршрута, и если он не соответствует первому, то он может вернуться ко второму..

Route::set(
    'categories',
    '(<category>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>)))))))',
    array('category' => '(movies|games)')
    )->defaults(array(
        'controller' => 'category',
        'action'     => 'index',
));
Route::set(
    'users',
    '<username>(/<action>(/<param1>)(/<param2>(/<param3>(/<param4>(/<param5>(/<param6>))))))'
    )->defaults(array(
        'controller' => 'users',
        'action'     => 'index',
));

Если у вас есть только одна или две категории, вы можете встроить их в строку регулярного выражения с некоторым кэшированием, конечно.

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

...