TIP: Use Markdown or, <pre> for multi line code blocks / <code> for inline code.
Документация, отсортированная по источникам
  • http://docs.google.com/Doc?id=df3mtv9b_17fkfvtjg9
  • Нашел в сети еще один интересный сайт о Kohana, правда он на польском :)
    http://kohana.sher.pl
    и форум
    http://forum.kohanaphp.pl
  • Сам когда-то искал пошаговое руководство по кохане, думаю и сейчас многим пригодится. Сам так и не собрался написать, но нашел в сети: http://devcookbook.net

    P.S.: понравилась идея с кешированием страниц. Считаю, что правильнее в кеше хранить данные, но иногда можно и полностью страницы (статичные, например).
  • Не нравится мне манера пихать валидацию модели в контроллер. Даже если модель не ОРМ - все равно надо создать в ней метод check() и в нем проверять...
    Ну и всяких по мелочи недочетов хватает, но в принципе как начальное руководство неплохо. Посмотрим, что там дальше будет :)
  • Раз Вы считаете, что
    в принципе как начальное руководство неплохо
    , то добавлю его.
  • 2biakaveron: я наоборот считаю, что валидация должна проходить в контроллере. Модель должна получить проверенные и очищенные данные. Меня очень раздражает, когда в модели несколько функций валидации - совсем не удобно.

    По поводу примеров - местами ужасны, на мой взгляд. Но для новичков лучше просто нет на данный момент.
  • в ORM-модели уже заложены средства валидации, глупо от них отказываться.
    насколько я понял это называется активной моделью, в отличие от пассивной, которая как раз и служит скорее интерфейсом меджу базой и контроллером.
    хотя я могу и ошибаться...
  • @aktuba
    1. Откуда контроллер знает логику модели? Какова максимальная длина полей, к примеру.
    2. Модель может редактироваться/создаваться из разных контроллеров - как тут быть? Копировать правила из одного места в другое? Не DRY :)
    3. Вообще, я бы не стал полагаться на то, что данные в модель всегда будут передаваться очищенными.
    4. Несколько функций валидации - это Вы про случаи, когда отдельно идет валидация при смене пароля/емейла? Так это все равно можно по уму сделать более удобно, чем в контроллере. Модель содержит все возможные правила валидации, разбитые по полям, а потом просто выдергивает необходимые.
  • >1. Откуда контроллер знает логику модели? Какова максимальная длина полей, к примеру.

    Ну так это и закладывается в валидацию, верно? Как-раз модель не должна заботиться, не прислали ли ей слишком длинную строку или строку вместо числа.

    >2. Модель может редактироваться/создаваться из разных контроллеров - как тут быть? Копировать правила из одного места в другое? Не DRY :)

    Как раз для этих случаев у меня правила валидации находятся в отдельном файле, вот в таком виде(application/config/validation/user.php):

    <?php<br />
    return array(
    'username' => array(
    'label' => 'Ваше имя',
    'rules' => array(
    'not_empty' => NULL,
    'alpha_numeric' => NULL,
    'min_length' => array(3),
    'max_length' => array(32),
    ),
    'filters' => array(
    'trim' => NULL,
    'Common::enhtml' => NULL,
    ),
    'callbacks' => array(),
    ),
    'wmr' => array(
    'label' => 'Ваш WMR-кошелек',
    'rules' => array(
    'not_empty' => NULL,
    'alpha_numeric' => NULL,
    'exact_length' => array(13),
    ),
    'filters' => array(
    'trim' => NULL,
    'Common::enhtml' => NULL,
    ),
    'callbacks' => array(
    'Validation_Callbacks_Users::validate_wmr'
    ),
    ),
    );

    Соответственно - никакого копирования и т.д.

    >3. Вообще, я бы не стал полагаться на то, что данные в модель всегда будут передаваться очищенными.

    Надо не полагаться на это, а быть в этом уверенным. Но это уже зависит от программиста, а не от стиля.

    >4. Несколько функций валидации - это Вы про случаи, когда отдельно идет валидация при смене пароля/емейла? Так это все равно можно по уму сделать более удобно, чем в контроллере. Модель содержит все возможные правила валидации, разбитые по полям, а потом просто выдергивает необходимые.

    Вот как-раз "Модель содержит все возможные правила валидации" мне и не нравится. Модель разрастается как на дрожжах, а толку - ноль. А если модель будет наследоваться - все это будет тянуться в новую модель мертвым грузом. Плюс, хранить в каждой модели свои функции валидации - не айс.
  • 1. Как это не должна? А зачем тогда модель (точнее драйвер DB) автоматом экранирует введенные данные? Или это все лишние телодвижения и все должно происходить в контроллере, а драйвер просто "не должен заботиться"?
    2. Лишние обращения к ФС, по сути - костыль. Ограничения полей в таблице БД никаким образом не относятся к контроллеру. Контроллер должен просто пользоваться "рычагами", предоставляемыми моделью, а не указывать, что и как там лежит. Мы ведь список полей в контроллере не храним. Тем более, что код для загрузки правил в модель, вызова валидации и т.д. все равно писать придется.
    3. См. п1. Помним о том, что любой посторонний (т.е. не написанный нами изначально) код в приложении (например плагин) может обращаться к модели. Тут уж нас не спасет знание того, какие правила в модели должны были быть.
    4. А когда приходится наследовать модель с правилами валидации, да еще и расширять ее? А как таковых функций валидации нет - есть правила (в соответствующем свойстве модели) и сколько-то методов, их использующих (по умолчанию вообще-то один - check()). Как минимум, в контроллерах их будет столько же.

    В итоге скатываемся к спору о "толстых" моделях.
  • Толще модель — тоньше контроллер. Тоньше контроллер — проще поддерживать. Проще поддерживать — проще приложение. Ну а последнее — одна из причин использования фреймворка в построении серьёзного приложения, как мне кажется.
    Да и проще модель подковырнуть при каких-то проблемах с выдаваемыми её данными для многих контроллеров, нежели пробегаться по всем используемым её контроллерам. А так как модель "толстая", то и разобраться в ней проще — видно все взаимодействия с базой и понятна бизнес логика (особенно при грамотном документировании).
    Имели когда-нибудь приложение с парой-тройкой десятков контроллеров с пересекающимися данными, построенными по принципу валидации в них самих? Это ад их мэинтенсить! :)

    p.s. Опять оффтопный холивар вокруг нахождения валидации намечается?:)
  • @Avis
    Все - в шаблоны! :)
    PS. Заоффтопили прикрепленый топик. На серьезных форумах за это уже бы атата сделали
  • >1. Как это не должна? А зачем тогда модель (точнее драйвер DB) автоматом экранирует введенные данные? Или это все лишние телодвижения и все должно происходить в контроллере, а драйвер просто "не должен заботиться"?

    Верно, автоматом, а не правилами валидации. И причина здесь абсолютно понятная, никак не относящаяся к валидации, верно? =)

    >2. Лишние обращения к ФС, по сути - костыль.

    Тогда весь фреймворк - костыль. Любое телодвижение = подключение нескольких файлов, верно?

    >Ограничения полей в таблице БД никаким образом не относятся к контроллеру. Контроллер должен просто пользоваться "рычагами", предоставляемыми моделью, а не указывать, что и как там лежит.

    А это и не относится к контроллеру - разговор про валидацию. Ограничение полей идет в валидации, а вот где вызывать валидацию - есть предмет нашего разговора ;). Я считаю, именно в контроллере. Например, незачем в модель передавать несколько принятых файлов (картинок), когда надо только проверить права пользователя...

    >Тем более, что код для загрузки правил в модель, вызова валидации и т.д. все равно писать придется.

    Зачем прописывать все это в модель, если не использовать в ней валидацию? Что-то я не понял этого предложения...

    >3. См. п1. Помним о том, что любой посторонний (т.е. не написанный нами изначально) код в приложении (например плагин) может обращаться к модели. Тут уж нас не спасет знание того, какие правила в модели должны были быть.

    Убил бы за это... А как же кеширование, например? Любой плагин может сменить любые данные без ведома движка? Бред полный...

    >4. А когда приходится наследовать модель с правилами валидации, да еще и расширять ее? А как таковых функций валидации нет - есть правила (в соответствующем свойстве модели) и сколько-то методов, их использующих (по умолчанию вообще-то один - check()). Как минимум, в контроллерах их будет столько же.

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

    >В итоге скатываемся к спору о "толстых" моделях.

    "В споре рождается истина" (с) не_помню_кто...

    >Толще модель — тоньше контроллер. Тоньше контроллер — проще поддерживать.

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

    >Да и проще модель подковырнуть при каких-то проблемах с выдаваемыми её данными для многих контроллеров, нежели пробегаться по всем используемым её контроллерам.

    Вот-вот... Именно поэтому модель должна быть простой и надежное, без лишних телодвижений.

    >Имели когда-нибудь приложение с парой-тройкой десятков контроллеров с пересекающимися данными, построенными по принципу валидации в них самих? Это ад их мэинтенсить! :)

    Каждый день имею опыт работы с приложением из десятка контроллеров + десяток-полтора моделей со встроенной валидацией - досталось "в наследство". И прекрасно понимаю что это такое. Поэтому и считаю, что валидации в модели быть не должно - модель должна получить чистые и проверенные данные и выдать результат по ним...

    >Все - в шаблоны! :)

    Не поверишь, но даже такой подход имеет право на жизнь. Встречал фреймворк на данном принципе, к сожалению не помню названия...
  • > "В споре рождается истина" (с) не_помню_кто...

    В спорах истина никогда не родится, ибо никто не хочет принять сторону оппонента. Может родиться только плохое настроение и испорченное отношение к друг другу у спорящих. На то он и спор, чтобы один удавил второго. ;) (Плюс ко всему, очень редко встречаются люди, которые умеют правильно говорить и слушать, дабы спор был конструктивен и имел положительные результаты)

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

    О каких внутренних и внешних вызовах в модели Вы ведёте речь? Я об этом не говорил... Чувствую попытку выдать одну информацию за другую.

    > Вот-вот... Именно поэтому модель должна быть простой и надежное, без лишних телодвижений.

    Ну, тут тоже бабушка надвое сказала. представьте 10 обращений контроллеров к 1 модели (сферических, в вакууме). Если в этих 10 обращениях будет валидация, то, как мне кажется, логичней эту валидацию вынести в 1 модель.

    > Каждый день имею опыт работы с приложением из десятка контроллеров + десяток-полтора моделей со встроенной валидацией - досталось "в наследство". И прекрасно понимаю что это такое. Поэтому и считаю, что валидации в модели быть не должно - модель должна получить чистые и проверенные данные и выдать результат по ним...

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

    > Не поверишь, но даже такой подход имеет право на жизнь. Встречал фреймворк на данном принципе, к сожалению не помню названия...

    Что ж, если уж отходить от архитектуры, которую предлагает фреймворк, то зачем этим фреймворком пользоваться? Можно прекрасно писать и без него, не находите? В свою очередь, хотелось бы поинтересоваться Вашими критерии выбора Kohana? Только лишь потому что Вам навязали поддержку продукта, который был написан на этом фреймворке?

    И так, чтобы конкретизировать: мы ведём спор об использовании валидации в моделях при работе с ORM библиотеками или же с plain query моделями?

    Ну и раз это Вас так задело, давайте попросим перенести данное обсуждение в отдельный топик и там разовьём её? Без троллинга, с конкретными примерами и обоснованиями своей точки зрения. @biakaveron — есть рычаги для этого?
  • Единственный имеющийся у меня рычаг - созданная отдельная дискуссия :)
  • @AeR
    Скажем так, это первый ресурс после http://kohanaframework.org/guide, который обязан посетить любой Kohana-программист :)