Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Kohana 3.3 не принимает аргументы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
Только начинаю осваивать этот фреймворк и для теста сделал, чтобы метод action_index принимал аргументы $name, $surname, $age. Вот весь контроллер Welcome (на всякий случай):

Код:
 
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Welcome extends Controller {
 
    public function action_index($name = 'Vasya', $surname = 'Ivanov', $age = '23')
    {
        $this->response->body('Your Name:' . $name, 'Your Surname:' . $surname, 'Your Age:' . $age);
    }
        public function action_index2()
    {
        $this->response->body('hello!');
    }
 
} // End Welcome
 

Захожу по адресу http://...kohana/welcome/index/name/surname/age и выдает такую ошибку:

Подскажите, как решить эту проблему? Заранее спасибо.

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 16:21 07-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001
а Route как выглядит?
 
аргументы то тут при чем? он явно пишет, что не может найти путь (route) для данного URI

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:03 07-07-2013 | Исправлено: Cheery, 22:10 07-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вся соль в том, что начал изучать по видео-урокам, в которых используется версия kohana 3.1.2, вот роут, который по дефолту в bootstrap.php:

Код:
 
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'controller' => 'welcome',
        'action'     => 'index',
    ));
 

(Веб-сервер поднят под FreeBSD 9.1, apache22, php 5.3)
Если зайти по адресу http://.../kohana/welcome/index/name/ , то выводится имя.
 
Ещё можете подсказать, почему если зайти по адресу http://ip_адрес/kohana/ показывается содержимое директории? ('base_url'   => '/kohana/')
Index of /kohana
• Parent Directory
• LICENSE.md
• README.md
• application/
• composer.json
• composer.lock
• composer.phar
• index.php
• modules/
• nbproject/
• system/
• vendor/

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 12:18 08-07-2013 | Исправлено: serg3001, 18:59 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

Цитата:
показывается содержимое директории?

наверно потому, что ваш апач не знает, что по умолчанию надо запускать index.php  
(директива DirectoryIndex), а путь такой есть.. обычно фреймворк или cms перехватывают несуществующие физически пути.
 

Цитата:
вот роут, который по дефолту в bootstrap.php:  

ну вы же понимаете, что ваш запрос под него не попадает?


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:12 08-07-2013 | Исправлено: Cheery, 19:23 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
дело в том, что от index.php я избавился, по причине создания адреса с ЧПУ
http://../kohana/index.php/welcome/ -> http://../kohana/welcome
в настройках апача копать надо будет?
Переформулирую первый вопрос, вот создал новый контроллер такого вида:

Код:
 
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Index extends Controller_Template {
 
        public $template = 'v_index';
    public function action_index()
    {
        $this->template->title = 'Приветствие';
                $this->template->content = 'Главная страница';
    }
         
        public function action_catalog()
    {
        $this->template->title = 'Приветствие';
                $this->template->content = 'Каталог';
    }
}
 

Этот адрес отображается правильно http://ip-адрес/kohana/index/,
но возникает та же ошибка при переходе по http://ip-адрес/kohana/index/catalog/
 

Цитата:
ну вы же понимаете, что ваш запрос под него не попадает?  

да понимаю, но почему в видео-уроке он выполнился не пойму тогда.

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 19:23 08-07-2013 | Исправлено: serg3001, 19:26 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

Цитата:
дело в том, что от index.php я избавился, по причине создания адреса с ЧПУ

где вы от него "избавились", если файл есть? я понимаю, о чем вы говорите, но ЧПУ же написан для несуществующих путей в файловой системе?
 

Цитата:
но возникает та же ошибка при переходе по

да при чем тут контроллер то? route покажите, они определяют какой контроллер вызвать.
 
в первом случае ваш запрос не попадает под написанное правило по умолчанию.
 

Цитата:
Этот адрес отображается правильно


Цитата:
(<controller>(/<action>(/<id>))

у вас указан контроллер, но нет остального..  
 
когда же указываете и остальные аргументы, то, как понимаю (не использую этот фреймворк, другие), контроллер не вызывается, так как не попадает под условие - ваша функция не принимает аргументы.
 
то есть action и id - необязательны, но если они есть, то функция должна принимать их как аргументы, у вас же функция без аргументов.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:26 08-07-2013 | Исправлено: Cheery, 19:29 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
вот изменнённый роут

Код:
 
Route::set('default', '(<controller>(/<action>(/<id>)))')
    ->defaults(array(
        'controller' => 'index',
        'action'     => 'index',
    ));
 

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 19:29 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

Цитата:
вот изменнённый роут  


Цитата:
но возникает та же ошибка при переходе по http://ip-адрес/kohana/index/catalog/  

а если убрать последнюю / ?
 
объясняю на пальцах.. опять же, с данной системой не работаю, но логика, скорее всего, понятна.
 

Цитата:
(<controller>(/<action>(/<id>)))

в скобках указаны необязательные аргументы, но тогда они должны быть чему то равны по умолчанию.
если вы укажите путь как http://site/controller/, то вы определяете уже два аргумента - controller и action (который будет пустым).
если же указываете http://site/controller, то будет определен только controller, а action будет тот, что выставлен по умолчанию.
 
ну и, скорее всего, система проверяет количество аргументов функции контроллера (symfony проверяет)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:30 08-07-2013 | Исправлено: Cheery, 19:36 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
всё равно  
   
Такое ощущение складывается, что автор видео-уроков чего-то не договаривает
Если так и дальше ничего не выйдет, перейду в codeigniter, может там не всё так печально, ну и новичок, по началу не сразу соображаю что к чему.

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 19:34 08-07-2013 | Исправлено: serg3001, 19:45 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001
читайте выше. слэш в конце, скорее всего, определяет id action, превращая его в пустое значение
но функции, которая бы принимала id, у вас нет..  
 
попробуйте написать как  
public function action_catalog($id = 0)  
 
function overloading в php в наличии, то есть возможна ситуация, когда

Код:
  function compute($first, $second) {
    return $first+$second;
  }
 
  function compute($first, $second, $third) {
    return $first+$second+$third;
  }


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:38 08-07-2013 | Исправлено: Cheery, 19:41 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
нет, ничего, не произошло, к сожалению, из принципа, скачал версию 3.1.2 и буду проверять всё там, очень интересно посмотреть какие будут результаты.
 
Дело не в версии, в 3.1.2 тоже напоролся на те же ошибки, может в FreeBSD что-то не так настроено, хм, вроде бы chmod -R 777 на директорию с коханой поставил, в httpd.conf внесены изменения:
<Directory>
 AllowOverride All
...
Options FollowSymLinks
 AllowOverride All
Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 
для того, чтобы вместо http://.../kohana/index.php/welcome было бы http://.../kohana/welcome
В уроках же автор использует Denwer, вообщем изрядно нервы выматывает эта непонятная ситуация с ошибками.  

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 20:00 08-07-2013 | Исправлено: serg3001, 20:42 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

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

а .htaccess есть ? права тут не при чем.
http://stackoverflow.com/questions/966429/how-to-set-up-htaccess-for-kohana-correctly-so-that-there-is-no-ugly-index-ph

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:50 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а .htaccess есть ?

да, имеется

Код:
 
# Turn on URL rewriting
RewriteEngine On
 
# Installation directory
RewriteBase /kohana/
 
# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>
 
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]
 
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]
 

Что-то config.php не соображу где лежит, не подскажите?

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 20:54 08-07-2013 | Исправлено: serg3001, 21:00 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

Цитата:
да, имеется  

тогда к чему те действия
Цитата:
для того, чтобы вместо http://.../kohana/index.php/welcome было бы http://.../kohana/welcome  
?
 
сделайте распечатку возможных путей (не знаю как насчет kohana, в symfony такое возможно) и посмотрите. я, конечно, могу ее себе поставить, но изучать ее не очень хочется.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:55 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
ну, после таких изменений в httpd.conf заработало, а с .htaccess нет.
Спасибо за подсказки, думаю ещё пару дней поломаю голову, а после, если ничего не получится,то перейду в другой фреймворк.

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 21:08 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001
Вот в чем дело
http://kohanaframework.org/3.2/guide/kohana/upgrading#controller-action-parameters

Цитата:
In 3.1, controller action parameters were deprecated. In 3.2, these behavior has been removed. If you had any code like:

Код:
public function action_index($id)
{
    // ... code
}

You'll need to change it to:

Код:
public function action_index()
{
    $id = $this->request->param('id');
 
    // ... code
}

 

и тогда  

Код:
        $this->response->body('Your Name:' . $this->request->param('name') . 'Your Surname:' . $this->request->param('surname') . 'Your Age:' . $this->request->param('age'));  

и
http://127.0.0.1/kohana/welcome/index/name/surname/age
выдает  

Цитата:
Your Name:nameYour Surname:surnameYour Age:age

 

Цитата:
перейду в другой фреймворк.

я пока изучаю symfony2, особенно понравилось наличие sonata admin bundle, упрощающее создание административного интерфейса.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:24 08-07-2013 | Исправлено: Cheery, 21:26 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
поставил веб-сервер на Denwer и ошибки улетучились, правда насчёт явной передачи параметров, прочитал, что в версии 3.3.0 эту функцию удалили, попробовал ваш код, но http://kohana/welcome/index/Vasya/ выдал Your Name:Your Surname:Your Age:, а http://kohana/welcome/index/Vasya/Ivanov/23/ - ошибку
Ну ничего, главное, что нервы теперь не дергает.

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 22:59 08-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001

Цитата:
прочитал, что в версии 3.3.0 эту функцию удалили, попробовал ваш код, но

у поставил на апач под Windows именно 3.3.0 и все работает..

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:04 08-07-2013
serg3001



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery

Цитата:
поставил на апач под Windows

у меня Apache под FreeBSD, стоял теперь в Windows, в комплекте с Denwer'ом, работает всё хорошо, но с передачей именно таких аргументов не решилось, наверное, руки у меня кривые

Код:
 
public function action_index()
    {
        $this->response->body('Your Name:' . $this->request->param('name') . 'Your Surname:' . $this->request->param('surname') . 'Your Age:' . $this->request->param('age'));
    }
 

вот таким способом?
Этот код:

Код:
 
public $template = 'v_index';
         
    public function action_index()
    {
        $this->template->title = 'Интернет-магазин';
                $this->template->content = 'Главная страница';
    }
         
        public function action_catalog()
    {
        $this->template->title = 'Интернет-магазин';
                $this->template->content = 'Каталог';
    }
 

 выполнился хорошо

Всего записей: 3813 | Зарегистр. 16-10-2010 | Отправлено: 10:55 09-07-2013 | Исправлено: serg3001, 12:34 09-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serg3001
ну так и route надо правильно тогда записать

Код:
Route::set('default', '(<controller>(/<action>(/<name>(/<surname>(/<age>)))))')
    ->defaults(array(
        'controller' => 'welcome',
        'action'     => 'index',
    ));


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:36 09-07-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Kohana 3.3 не принимает аргументы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru