Примеры приложений на Kohana

Вурдалак

Продвинутый новичок
Примеры приложений на Kohana

Приведите, пожалуйста, примеры приложений на Kohana 2.x или, лучше, Kohana 3.x с открытым кодом.
 

fixxxer

К.О.
Партнер клуба
http://code.google.com/p/hanami/ не? это то что на первой странице есть, а там их полно
 

gerasim

Новичок

zerkms

TDD infected
Команда форума
эм, а смысл смотреть?
берите ko3 и пишите сами %)
 

Вурдалак

Продвинутый новичок
Я не понимаю как по умолчанию должны называться классы-модели в Kohana 3.x: там есть отдельная директория под модели («classes/models»). Чтобы класс автоматически загрузился надо его назвать Models_xxx, что довольно странно.

-~{}~ 04.06.10 22:13:

А вот тут дан пример с «classes/model». Kohana 3.x ещё «сырой» фреймворк?

-~{}~ 05.06.10 00:28:

Да и непонятно зачем пихать
PHP:
defined('SYSPATH') or die('No direct script access.');
в файлы, содержащие только определения классов.
 

Вурдалак

Продвинутый новичок
А зачем метод factory() в Model? То есть нафиг писать
PHP:
$article = Model::factory('Article');
, когда можно сразу
PHP:
$article = new Model_Article();
?

-~{}~ 06.06.10 01:39:

Далее, правильно ли я понимаю, что по-хорошему в Kohana 3 отлавливать 404 (отсутствие controller/action) нужно, отключив стандартный обработчик ошибок при инициализации в bootstrap.php:
PHP:
Kohana::init(array(
    'base_url'   => '/',
    'index_file' => FALSE,
    'errors'     => FALSE
));
и зарегистировав свой обработчик?
 

zerkms

TDD infected
Команда форума
А зачем метод factory() в Model? То есть нафиг писать
Model::factory('Article')->where('id', '=', 42)->find();

отключив стандартный обработчик ошибок при инициализации в bootstrap.php:
неправильно, отключать ничего не надо, надо просто ловить эксепшны. вот нижняя часть бутстрапа tvfedor.ru, которая как раз и ловит всё-всё-всё:

PHP:
try
{
  try
  {
    $request = Request::instance();
    $request->execute();
  }
  catch (ReflectionException $e)
  {
    Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

    if (!IN_PRODUCTION)
    {
      throw $e;
    }

    $request->response = Request::factory('err/404')->execute();
  }
  catch (Exception404 $e)
  {
    Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

    if (!IN_PRODUCTION)
    {
      throw $e;
    }

    $request->response = Request::factory('err/404')->execute();
  }
  catch (Kohana_Request_Exception $e)
  {
    Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

    if (!IN_PRODUCTION)
    {
      throw $e;
    }

    header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404);
    echo Request::factory('err/404')->send_headers()->execute()->response;
    exit;
  }
  catch (exception $e)
  {
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

    if (!IN_PRODUCTION)
    {
      throw $e;
    }

    $request->status = 500;
    $request->response = Request::factory('err/500')->execute();
  }
}
catch (exception $e)
{
  if (!IN_PRODUCTION)
  {
    throw $e;
  }
  echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
Хостинг провайдер Фёдора испытывает затруднения. Мы в курсе проблемы и будем делать все от нас зависящее для скорейшего разрешения данной ситуации. Приносим извинения за перебои в работе.<br /><br /> Команда tvfёdor.ru (<a href="mailto:[email protected]">[email protected]</a>)
</body>
</html>';
  exit;
}

if ($isCli && isset($e))
{
  echo $e->getMessage();
}

echo $request->send_headers()->response;
 

Вурдалак

Продвинутый новичок
zerkms
OK, спасибо за примеры.

Сделал так:
PHP:
try
{
    $request = Request::instance();
    
    try
    {
        $request->execute();
    }
    catch(Exception $e)
    {
        if( $request->status == 404 || $request->status == 500 )
        {
            Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
    
            $request->response = Request::factory(Route::get('default')->uri(array(
                'controller' => 'error',
                'action'     => $request->status,
            )))->execute();
        }
        else
        {
            throw $e;
        }
    }
    
    echo $request
         ->send_headers()
         ->response;
}
catch(Exception $e)
{
    if( Kohana::$environment == Kohana::PRODUCTION )
    {
        die('The page you are looking for is temporarily unavailable');
    }

    throw $e;
}
-~{}~ 06.06.10 14:44:

Хм... Неприятную вещь открыл. Если нет подходящего роута, то выбрасывается Kohana_Request_Exception. Это ладно, но после не выполняется Request::factory(...), т.к. в первый раз не инициализировалась переменная Request::$current.

Вот такой код:
PHP:
try
{
    try
    {
        $request = Request::instance();
        $request->execute();
    }
    catch(Kohana_Request_Exception $e)
    {
        Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
    
        echo Request::factory(Route::get('default')->uri(array(
                'controller' => 'error',
                'action'     => '404',
             )))->execute();

        exit;
    }
    catch(Exception $e)
    {
        if( $request->status == 404 || $request->status == 500 )
        {
            Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));
    
            $request->response = Request::factory(Route::get('default')->uri(array(
                'controller' => 'error',
                'action'     => $request->status,
            )))->execute();
        }
        else
        {
            throw $e;
        }
    }
    
    echo $request
         ->send_headers()
         ->response;
}
catch(Exception $e)
{
    if( Kohana::$environment == Kohana::PRODUCTION )
    {
        die('The page you are looking for is temporarily unavailable');
    }

    throw $e;
}
Ошибка:
ErrorException [ Notice ]: Trying to get property of non-object

SYSPATH/classes\kohana\request.php [ 962 ]

PHP:
 			$benchmark = '"'.$this->uri.'"';
 
 			if ($this !== Request::$instance)
 			{
 				// Add the parent request uri
 				$benchmark .= ' « "'.Request::$current->uri.'"';
 			}
 
 			// Start benchmarking
 			$benchmark = Profiler::start('Requests', $benchmark);
 		}
Почему у тебя нет этой ошибки?
 

zerkms

TDD infected
Команда форума
mod_telepathy: выключи профайлинг?
PHP:
Kohana::init(array('base_url' => '/', 'caching' => true, 'index_file' => '', 'profile' => false));
 

zerkms

TDD infected
Команда форума
ps: у меня, кстати, такого кода нет даже %) ко 3.0.4

-~{}~ 06.06.10 21:52:

Я не знаю как нормально, в моей версии такого кода нет. А если в свежей версии есть и вываливает такую ошибку - то нужно писать в багтрекер.
 

Вурдалак

Продвинутый новичок
Стандартный класс Security, как говорится, «доставляет». Кто-нибудь этим говном пользуется? :)

-~{}~ 09.06.10 00:00:

Единственное, там token()/check() могут быть нужны.

-~{}~ 09.06.10 00:04:

Какой фреймворк, кстати, вы можете назвать самым «правильным» с точки зрения структуры, стандартных классов и т.д.? Понятно, что он может быть не самым удобным и быстрым.

-~{}~ 09.06.10 01:02:

Вывод ошибок в формах на tvfedor.ru ты с помощью стандартного Validate делал?
 

Вурдалак

Продвинутый новичок
Тогда непонятно как ты сделал вывод ошибок типа
Укажите email
Укажите пароль
Там ведь сообщение вида
PHP:
'not_empty'    => ':field must not be empty',
То есть подставляется имя поля, а у тебя — «пароль».
 

zerkms

TDD infected
Команда форума
application/messages/validate.php:

PHP:
return array(...
  'email' => array(
    'not_empty' => 'Укажите email',
    'validate::email' => 'Некорректный email',
    'not_available' => 'Этот email уже указан другим пользователем'
  ),
...);
 
Сверху