Pull to refresh

Comments 81

О, на первый взгляд красивее Yii (я был фанатом). Внутренность ещё не смотрел.
UFO just landed and posted this here
Перешел на Ruby&ROR. Но младшему брату уже посоветовал посмотреть в этот фреймворк.
Извиняюсь за оффтоп.
Как впечатления от перехода на RoR?
Влезу в ваш диалог )

Тоже с начала года перехожу с PHP&ZF\ Yii на Ruby\RoR (на PHP продолжаю писать, да и живых проектов на нем остается предостаточно у нас).

Впечатления от фреймворка только положительные, Yii и RoR похожи… но RoR в контексте Ruby смотрится куда… естественнее что-ли, чем Yii в контексте PHP.

Ruby тоже весьма впечатляет после C и PHP с которыми работал последние года, единственное, рефлексия и class_eval удивление вызвали, на PHP удобнее как-то это все.
Метапрограммирование изначально фишка Ruby, а в PHP лишь жалкое подобие в виде классов Reflection.
Не знаю с чем это связано, с тем что опыта в Руби мало, с тем что на PHP пишу давно и, в общем то, этот язык мне по душе, но это «жалкое подобие метапрограммирования» мне ближе и кажется проще и логичнее.
С тем, что оно проще согласен. Но смотрите код, Yii и Ror

class Post extends CActiveRecord
{
public function scopes()
{
return array(
'published' => array('condition' => 'published=1'),
);
}
}

Post::model()->published()->findAll();
Неудачно Ctrl нажал, всю красоту сломал. Хотел сказать, чтобы пользоваться вкусностями Ruby не нужно полностью знать все тонкости… Вы ведь не знаете как растет вкусное яблоко с биологической точки зрения? Тут ведь тоже самое.

PHP
class Post extends CActiveRecord
{
  public function scopes()
  {
    return array(
      'published' => array('condition' => 'published=1'),
    );
  }
}

Post::model()->published()->findAll();


Ruby
class Post < ActiveRecord::Base
  named_scope :published, :conditions => { :published => 1 }
end

Post.published.all
Ruby компактнее по синтаксису. Но вот, посмотрите на тот же Propel

PostQuery::create()->filterByPublished()->find();


При этом такой вызов не требует никаких изменений в классе Post или PostQuery.

Итого, РНР может быть компактнее и удобнее. Просто не нужно криво переносить продукты с Ruby (или Java) на PHP, а нужно делать свои ноу-хау.
Тот же Propel похож на AR из ROR. Вот аналог, из коробки.
Post.find_by_published


Ruby не просто компактней, а короче в 2 раза.
Я говорил скорее о примерах вроде

class_eval %Q{def #{ attr_name}=(value) ; @#{attr_name} = value ; end }


Так я и не понял можно ли реализовать функицнал attr_accessor без eval
Есть create_method, также можно ловить через missing_method. Можно и чуть карявей через send. на любой вкус. А вообще ваш пример лучше смотреть так
Some.class_eval do
    def #{attr_name}=
       #...
    end
end
— огромное количество гемов (готовых модулей, можно так сказать)
— очень краткий синтаксис
— меньше конкуренция за работу, больше $
— очень мало людей выбрали Ruby первым языком, поэтому можно нормально читать форумы Ruby-программистов
— очень быстро все развивается и создается

Ещё куча-куча всего вкусного, уже начинаю смотреть косо на PHP.
— меньше конкуренция за работу, больше $
Меньше и вакансий
Некторые штуки действительно сделаны довольно красиво.
Ну, по крайней мере, попробуем на правктике и, возможно, учтём в Yii2.
UFO just landed and posted this here
UFO just landed and posted this here
А где так по вашему не чистый код? Мельком глянул, все довольно опрятно.
UFO just landed and posted this here
Аккуратность — залог успеха…
Структурированный, документированный, читаемый…
Наткнулся на эту штуку пару лет назад, когда искал MVP (Movel-View-Presenter) фрэймворки на PHP. Это, вроде как, единственный.
Чем NEON лучше YAML?

P.S.: Хочу выразить свою любовь к blitz, после него любые шаблонизаторы уже «не те».
UFO just landed and posted this here
На сайте ne-on написано чем отличается. Он не лучше и не хуже, просто чуть-чуть другой.
UFO just landed and posted this here
UFO just landed and posted this here
Вообще-то это yaml + entities.
JSON не круче в плане читаемости.
К сожалению, в английской версии документации уже на третьей странице заканчивается английский язык.
На четвертой снова начинается...)) Да, документация переведена не вся.
UFO just landed and posted this here
Причем тут вкусы?
Человек просто встретил интересный проект и поделился им с нами!
Давайте просто вынесем для себя что-то полезное и не будем разводить бессмысленные сравнения…
> Человек просто встретил интересный проект и поделился им с нами!

Именно так :)
Нужно мнение людей, которые пробовали Yii. В чём сравнительные плюсы/минусы?
Насколько я понял в нем в отличии от Yii в модели не надо указывать свойства, я прав? А шаблонизатор на первый взгляд хорош, но вот документация на чешском…
Указывать свойства?
В Yii не надо указывать атрибуты для модели. Он берет данные с соответствующей таблицы, и генерит атрибуты на лету.
Единственное, когда надо явно прописывать свойства, это для всяких select count(id) as count
Кто им пользовался, этот фреймверк может обрабатывать такие вещи:
use Nette\Mail; // вот это меня интересует
throw SmtpException('blah blah'); // и тут он найдет класс? Судя по их лоадеру нет, но может я не доглядел.

Или вот такие вещи:
use Nette\Mail as Mail; // вот это меня интересует
throw Mail\SmtpException('blah blah'); // и тут он найдет класс? Судя по их лоадеру нет, но может я не доглядел.
А при чем тут фреймворк? Это всё чистый PHP 5.3

В первом случае будет искаться класс в текущем неймспейсе, во втором для неймспейса создан алиас и тоже всё ок. Любой аутолоадер с таким справится.
Лоадер их интересует. Хотите поумничать, можете сходить на php.net и там в каментах отписаться. Меня интересует конкретный вопрос, не можете ответить, читайте дальше.
Для особо умных я могу обьяснить, чтоб любой лоадер справился с этим, нужно подключить файл с классом. Вот меня и интересует, находит ли это чудо нужные файлы, ибо в автолоадер приходит совсем не то что ожидается поумолчанию в таких случаях.
UFO just landed and posted this here
А есть с чем сравнивать? ;)
Спасибо, но сколько людей, столько и мнений. Зачем кричать о своём во всеуслышание в не подходящем месте?
А может Вы всё же посмотрите Nette. С точки зрения архитектуры он в разы выше Yii, с точки зрения удобства использования сказать точно не могу.
В Yii статические методы, евалы, дикие текстовые магические строки и прочие гадости, потому что архитектура полождена на алтарь удобства. А Nette это архитектурно правильный фреймворк как Zend, только удобнее.

Вместо того, чтобы говорить о минусах, лучше бы хоть немного аргументировали своё ИМХО.
Ну все как обычно — свой шаблонизатор, свой формат конфигов, даже свой базовый класс для объектов сделали. Молодцы. Я бы добавил ещё пару своих операторов в язык и свою реализацию APC кеша.

Верно! Надо было взять базовый класс из Yii, конфиги из Symfony, формы из Zend — и всё было бы зашибись!
А ведь и вправду было бы :).
Порадовал текст на главной:
Real programmers don't use frameworks. They write web applications through command-line straight to the server
Смущают архитектурные решения типа Nette\Object
Хотя код в целом приличный.
Это не такая уж редкость. Есть в CakePHP, будет в Yii2.
К сожалению, степень рапространенности не свидетельствует об удачности решения, которое довольно близко к BaseBean.
К сожалению, некоторые штуки PHP не позволяет сделать иначе.
А это уже вопрос цены/необходимости, что довольно спорно.
В частности, на его основе сделан сайт президента страны – Вацлава Клауса. Довольно громко.

Всегда удивляют такие заявления.

Ну сайт президента, и что?..

Это значит что при его создании участвовали лучшие программисты и профессионалы страны и именно они выбрали идеальный инструмент?
> Это значит что при его создании участвовали лучшие программисты и профессионалы страны и именно они выбрали идеальный инструмент?

Нет, не значит.

> Ну сайт президента, и что?..

А то, что встречаясь с другими фреймворками, этот сможет похвастать своей близостью к президенту, только и всего.
Эмм… doc.nette.org/en/forms
Концепция генератора форм любопытна…
use Nette\Forms\Form;

$form = new Form;

$form->addText('name', 'Name:');
$form->addPassword('password', 'Password:');
$form->addSubmit('send', 'Register');

echo $form; // renders the form


Однако это в итоге контроллер или представление?
Всё кроме последней строчки в контроллер, по идее.
Симфонично
$form = $this->createFormBuilder($task)
->add('task', 'text')
->add('dueDate', 'date')
->getForm();
А это что в итоге?

{foreach $database->table('book')->order('title')->limit(5) as $book}
{$book->title} ({$book->author->name})

{foreach $book->related('book_tag') as $book_tag}
{$book_tag->tag->name}{sep}, {/sep}
{/foreach}
{/foreach}
Есть любопытный момент в этом примере.
Если смотреть только на этот кусок шаблона, то кажется что он должен сделать N+1 запросов к БД, т.к. в цикле дергает $book->related('book_tag')
Но! Но в документации написано что будет выполнен один запрос за тегами:
SELECT `book_id`, `tag_id` FROM `book_tag` WHERE (`book_tag`.`book_id` IN (1, 4, 2, 3))


Как? Как они это делают? И если действительно делают, то одно это достойно уважения.
Теоретически они должны пробросить в $book контекст выполнения, чтобы метод related понимал что стоит сразу достать все теги для всех результатов запроса $database->table('book')->order('title')->limit(5)

А если мы бы хотели сделать что-то типа:
$books = $database->table('book')->order('title')->limit(5);
$books[0]->related('book_tag');

Он тоже достанет все теги для всех найденных книг? Или догадается что тут нам нужны только теги первой?
Это написано в NoORM библиотеке. Только сомневаюсь я что это будет работать быстрее чем JOIN всех таблиц на стороне базы в одном запросе. Сделать запрос. Обработать его в ПХП, собрать ID, ещё один запрос опять обработка на ПХП
Тут все очень сильно зависит от. Подобный «ум» иногда помогает. Но создает очень непредсказуемое поведение.
А что если нам будет нужно достать 100500 объектов $book, и только у первых 5ти вывести теги? Как об этом догадается ОРМ?
Вычитал в документации:

The first query will be SELECT * FROM application. Then NotORM stores the information about used columns to the cache and all next requests will issue SELECT id, title FROM application. If you change the script and add more columns then one extra SELECT * will be issued and all next queries will be optimal again.

Очень интересный подход. Надо поизучать повнимательнее.
Т.е. они анализируют паттерн использования и кешируют. Такой себе JIT прямо:)
Context-Aware Escaping — интересная штука. По идее, работать быстро это не должно.
Почему нет? Это же при компиляции происходит.
Посмотрел почти до конца документации. Много интересных штук, есть офигенные (по крайней мере на первый взгляд) решения, есть кривые решения. Очень много похожего на Yii/Prado. В общем, интересный фреймворк.
Значит, товарищ Нетте — это теперь не только человек и пароход?
Бегло просмотрел документацию.
Ну, забавный фреймворк, да. Надо попробовать.
По крайней мере, они соблюдают стандарты оформления кода :) (оформление кода в Yii меня всегда дико раздражало)
Sign up to leave a comment.

Articles