Как стать автором
Обновить

Комментарии 58

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

Прочитал статью, так и не понял что вы имели в виду…

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

Впрочем, что касается самого фреймворка — одобряю минимализм.
Я так понял, об этом речь пойдёт в последующих статьях.
Веб-программирование действительно отличается от десктопного. Конкретно в статье имеется в виду программирование веб-форм, подобно тому, как это происходит в ASP.NET (система контролов, каждый контрол — отдельный объект, подробнее тут). Также нечто похожее есть в Prado Framework.
ASP.NET — если мне не изменяет память, не десктопное программирование).
Десктопное просто неудачный термин в статье ))
Декларативный UI? аля QML, DFM..?
Скорее обычные XHTML шаблоны со спец. тэгами. Например:

<div>
  <textbox id="name" maxlength="100" readonly="1" />
<div>

и в php просто $this->control('name')->value;
нет никакой надобности в коде типа:
$form = new Form('id');
$input = new Input('name');
$input->setAttribute('readonly', 1);
$input->setValue('text');
$form->addElement($input);


и т.дю
Насколько я помню, это касается управляющих элементов и элементов форм. Как аналогия формы в Zend через ZendForms.
Только фреймворк еще и постоянно мониторит состояние элемента (аля asp) + элементы задаются не в php, а в темплейтах.
Таким образом работа с элементами больше похожа на подход Delphi и иже с ним.
Аналогия с делфи, мне помогла понять что имелось в виду, спасибо. Но даже в этом случае, следовало бы указать что речь идет лишь о элементах интерфейса.
Сразу бросилось в глаза

if (isset($config['customLogMethod']) && $config['customLogMethod'])


что автоматически мое подсознание захотело изменить на

if (isset($config['customLogMethod']) && is_callable($config['customLogMethod']))


Есть над чем работать ;)
Скоро будет больше сводобного времени — форкну и свяжусь с Вами. Я не против поучавствовать в разработке open-source ;)
Желаю удачи в развитии.
В данном случае is_callable($config['customLogMethod']) не подходит, т.к. $config['customLogMethod'] может быть просто строкой — делегатом (см. тут)
Тогда хотя-бы !empty.
Не хочу вас снова расстраивать, но empty тоже не подходит. Второе выражение условия (&& $config['customLogMethod']) это по сути преобразование к булевому типу, что работает несколько иначе по сравнению с empty. См. подробнее тут.
Проверяли бы сначала… !empty($a) — полный аналог isset($a) && $a.
Для замены полного условия подходит. Спасибо, исправлю.
Посмотрю на досуге.
Примеры для роутинга, по крайней мере в статье, чудовищны. В документации стоит что-нибудь попроще показать.
В доке они попроще. Для статьи намеренно сделал сложные.
Простые запросы будут выглядеть как-то так:

$a->bind('/add/#x#/#y#', function($x, $y){...});
На первый взгляд выглядит почему-то как библиотека для роутинга, но не как фреймворк. Ведь файл index.php мы пишем сами при создании приложения?

И если метода не существует, то 404 мы не получим?
Потому что, это только ядро полноценного фрэймворка.
Я не буду спорить насчет вашего опыта. Сделали — молодцы. Но внимательно, очень внимательно прочтите следующее.

call_user_func_array :

This function is relatively slow (as of PHP 5.3.3) and if you are calling a method with a known number of parameters it is much faster to call it this way: 

$class->{$method}($param1, $param2);


ссылка ...
Это не критично в текущей реализации, т.к. метод route по хорошему должен вызываться один раз. К тому же в дальнейшем делегаты будут улучшены и более оптимизированы, это касается и метода route().
Представьте что у вас отказывают почки и печень, разве врач скажет вам:
«Сначала лечим печень, а позже почки». Не правда ли это как то ужасно?
В чём тут аналогия с фрэймворком?
Боюсь вас огорчить, но есть PHP Slim, и он выглядит более стройно с учетом возможностей PHP 5.3.
Я в курсе, что есть такой фрэймворк, но он не обладает функциональностью Алефа.
Ждем анонса фнукциональности ;)
Он есть на сайте.
Возможно, я неправ, из-за тотального фэйла в документации на.
Насчёт статьи скажу что презентация подкачала. Когда я читал про PHP Slim и F3 было сразу всё понятно и ясно, всё просто и чётко. В вашем случае, к сожалению, я не въехал — т.е. нужно скачивать, открывать IDE и начинать разбираться.
А роутинг, ох уж этот роутинг, это адЪ для моих глаз — понять что там происходит с ходу сложно (я работаю с Yii — там тоже регулярки, но гораздо проще разобраться), тот же PHP Slim тоже крайне прост в этом плане.

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

public function &offsetGet($var)
{
   if (!isset($this->config[$var])) $this->config[$var] = null;
   return $this->config[$var];
}


Возврат значения по ссылке — неправильно. Для установки значения есть метод offsetSet.

В целом метод можно сократить до

return isset( $this->config[$var] ) ? $this->config[$var] : null;


Избавившись тем самым от ненужной инициализации.
А как Вы по ссылке возвращаете null? :)
что вы имеете в виду?
Первый приведенный пример — из репы автора, я и говорю, что так делать неправильно!
а второй — как нужно сделать, при этом так же нужно убрать знак & перед именем функции, потому что возвращать по ссылке конкретно тут — минимум бессмысленно.
Теперь понятно.
Не всё так просто как кажется. Ссылка тут для обеспечения рекурсивного array access (только для версии php от 5.3.4 и выше). Само по себе такое решение есть костыль, который наконец-то устранили в php 5.4

Вот это if (!isset($this->config[$var])) $this->config[$var] = null; нужно для того чтобы рекурсивный array access правильно работал в строгом режиме.
Никогда особо не интересовался микрофреймворками. После этой статьи наверное и не заинтересуюсь. Показанные примеры выглядят не сильно лучше процедурной лапши (ИМХО), вся работа идет через один класс ядра…

Ну а роутинг конечно — врагу не пожелаешь. Динамически метод контроллера, я так понимаю, нельзя определять, только хардкор в маппинге? Насколько же удобнее работать через отдельный класс Route, в котором есть еще и фильтры, дефолтные значения и т.д. Кстати, а в Aleph можно хотя бы анонимную функцию повесить на обработку роутинга? Это если мы говорим про возможности PHP5.3.
Всё можно: и метод динамически определять и замыкания указывать. А один класс ядра это удобней чем 5 классов ядра… Хотя кому как конечно )
Микрофреймворки всегда интересны, вот и мой фреймворк — github.com/AntonShevchuk/Bluz
В скором времени опубликую на хабре :)
Aleph, Bluz, Yii,… Скажите, где люди берут ТАКИЕ имена своим проектам…
Написал человек под ником boodda :)
Хорошие имена вообще-то. Короткие и легко запоминающиеся.
Сам фреймворк еще толком не посмотрел, но меня просто убило, когда открыл файл aleph.php и увидел, что в нем 3000 строк и черт знает сколько классов.
Такие вещи меня сразу отпугивают — в таком коде трудно ориентироваться и поддерживать его. Пожалуй, любая книга по написанию хорошего кода или рефакторингу рекомендует первым делом сократить размер (длину) файлов, классов, методов и не забывать про принцип единой ответственности.
Если Вы хотели минимизировать количество подключений в проекте, то, как мне кажется, это глупо — экономия на спичках, других сколько-нибудь разумных причин для такого решения я вообще не вижу.
Там 7 классов и один интерфейс. Все эти классы обязательны для подключения. Запихнул я их в один класс не из-за увеличения производительности, а из за удобства масштабирования. Если все классы ядра лежат в одном файле, то можно создавать любую структуру папок сайта не боясь испортить пути к обязательным подключаемым классам. А все другие классы (которые будут позже) подключать вообще не требуется, фрэймворк их сам подключит где-бы они не лежали.
НЛО прилетело и опубликовало эту надпись здесь
'/rom2dec/#x|(?i)M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])#' => 'Aleph\Demo\Transform->rom2dec'
REALY???
Что вас так испугало? Сложное регулярное выражение для проверки римского числа? Взято между прочим из википедии…
прошло три года и ни один ресурс уже не открывается.
Естественный отбор.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории