Pull to refresh

Comments 87

Первые версии Phalcon были написаны на С. Теперь на зефире переписан.
UFO just landed and posted this here
Как и в самом фреймворке Phalcon. Он был востребован до PHP7, после стал «не нужон».
UFO just landed and posted this here
И какой фреймворк на новом пхп может уделать phalcon по скорости и потреблению памяти? Есть сравнения?

ps: А что не так с ubiquity, почему нет в списке?
UFO just landed and posted this here
UFO just landed and posted this here

По сути российские программисты на PHP — прямые конкуренты разработчиков из Индии и данный комментарий весьма полезен: позволяет понять, на что стоит обратить внимание при изучении

CakePHP используют норм в Японии и США. У нас нет. Yii используют много где, но у нас, как раз, это ярко выражено. А так, если по глобальной популярности смотреть, то да, Laravel на первом месте. Symfony сильно меньше, но тоже немало.

Пост точно писал человек, далекий от PHP разработки. Главные преимущества некоторых фреймворков вообще не указал, а у некоторых указал сомнительные непопулярные вещи как основные фичи.

Зато кто-то плюсов статье наставил…

а еще
Laravel — это бесплатный опенсорсный PHP-фреймворк
, получается в статье остальные платные?

А есть ли в принципе платные php-фреймворки?
Есть платные готовые решения, как xenforo для форумов. Такое тоже можно найвать фреймворком, но специализированым.

Интересно, т.е. по вашему Yii и Laravel достойны 1 и 2 места?


Мне всегда казалось, что рейтинг должен начинаться с Symfony и выглядеть примерно так:


Symfony
Laravel
Yii 2
Zend
и тд


Мне доводилось программировать на каждом из них, причем во всех мажорных версиях начиная с первых. В каждом из них я смотрел под капот в исходники.


ИМХО, я бы не ставил Symfony так далеко.

Laravel хорош для новичка — все из коробки, просто развернуть, просто работать — но как только появляется необходимость что-то поменять в ядре — жизнь боль, Job's если поменять параметры конструктора — тоже валяться на раз два. При работе с миграциями — необходимо быть предельно осторожным.


Symfony — монстр с решениями на все случаи жизни, но на его изучение также придется потратить пару жизней.


Zend — раньше жил только за счет его форса ZendFoundation и был жутко неудобной страшной штукой. Сейчас (Laminas) даже не смотрел.


Yii — Собран на коленке для создания проектов на коленке, после laravel покажется жутко не удобным.


Phalcon — был актуален на php5.6 так как работал намного быстрее всего что было тогда — за счет того что ядро скомпилировано как плагин php. При php >= 7.0 уже почти не имеет смысла так как из самого php выжали почти все возможное и теперь дожимают остальное.


Все остальное — уже жуткий legacy — проще с нуля собрать свой фреймворк с помощью php-di

Symfony давно уже не тот монстр, каким был лет 5 назад. Сейчас это практически образцовый фреймворк с хорошей архитектурой, низкой связанностью классов и огромнейшим выбором сторонних компонентов на все случаи жизни.
ага, а еще с горой yaml файлов и просто каким то болезненным числом вещей, которые нужно делать руками. Все писать в аннотации, все регать в конфигах, это не программирование, это описательство какое-то. То ли дело Yii2, имхо
Плюсую, все везде пиарят symfony, но там половина кода — это yaml + комментарии, ни отрефакторить нормально ничего
Если вы про «отрефакторить код фреймворка» — то с 5.2 все изкоробочные конфиги — на php

github.com/symfony/symfony/tree/5.2/src/Symfony/Bundle/SecurityBundle/Resources/config

А если вы про свой код (который под вашим управлением), то вы были вольны держать его в php формате уже несколько лет как. Если вы держали его в ямле — ну, значит, видимо, вы приняли такое решение зачем-то.

symfony.com/doc/2.8/configuration/configuration_organization.html
на вскидку в документации к 2.8 уже были вкладки yaml\xml\php в документации, так что можно было оформлять конфиги в любом удообном вам формате

Аннотации — никто никогда не заставлял пользовать тоже на самом деле. Все можно описывать в тех же конфигах.

Поэтому и говорят, что он мощный. Просто далеко не все осознают что поменять можно почти все.

О чем и говорит TheCluster. Этого уже нет. Вот, к примеру, конфиг для демо приложения. Он отличается от дефолтного всего несколькими строчками.
Ну а что касается аннотаций, то их можно не использовать: php, yaml, xml — выбирай не хочу

Можете писать на php, вот ещё не закоммитил даже роутинг для прототипа:


<?php declare(strict_types=1);

use App\User\RegisterFormController;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

return function (RoutingConfigurator $routes) {
    $routes->add('register', '/{_locale}/register')
        ->methods(['GET'])
        ->requirements(['_locale' => 'uk|ru'])
        ->controller([RegisterFormController::class, '__invoke']);
};

На аннотациях/атрибутах явно лучше было бы
На аннотациях/атрибутах явно лучше было бы


Так можно и на php лучше сделать. Вот пример из laravel:

Route::get('register', [RegisterFormController::class, 'invoke'])
     ->name('register');


А локаль вынести на уровень выше, так как она нужна для большинства роутов.
Локаль можно и в симфони выше вынести, там есть импорты ресурсов с префиксом. А вот насчет того, делают ли статик колы «лучше» — можно очень долго холиварить

А разве такие вызовы обязательно статические? Массив [$className, $method] не в каждом роутере будет восприниматься, как callable. Такая запись удобна тем, что IDE это понимает и не ругается, что у контроллера есть невызываемый публичный метод. Но под капотом сначала проверяется возможность получить контроллер из контейнера, и, если такая возможность есть, то роут-диспетчер получит контроллер из контейнера и вызовет соответствующий метод. А если контейнер отвечает, что не знает о таком контроллере, то тогда уже передает вызов массиву как статик методу.


Или я не правильно понял статик колл?

Я про Router::get. То, что описано как контроллер — технически может быть чем угодно, да. Может быть стат. методом, может быть парой сервис-идентификатор + метод итд. Тут нормально все.

А, ну в этом случае используется фасад. Можно и без статики сделать:


<?php

$router = app()->get(\Illuminate\Routing\Router::class);
$router->get('register', [RegisterFormController::class, 'invoke'])->name('register');

Но в проектах такого я не встречал


app()-> — ничем не лучше в данном случае ) наличие таких вещей означает, что у вас в памяти где-то есть глобальный или статический объект, который вы получаете вызовом данной функции для доконфигурации. Фактически это синглтон. Чем плох синглтон я надеюсь можно не объяснять.

Вообще да, но мы же сейчас про конфигурацию роутинга говорим. Можно и в сервис-провайдере определить конфигурацию роутинга, но я не видел, чтобы так делали. Во всех laravel-проектах, с которыми я сталкивался, роутинг конфигурируется через фасады, будь они не ладны

Вообще да, но мы же сейчас про конфигурацию роутинга говорим

Вы так говорите, как будто в остальных местах лара проповедует SOLID
laravel.com/docs/8.x/validation#manually-creating-validators
Фасад на фасаде.

Во всех laravel-проектах, с которыми я сталкивался, роутинг конфигурируется через фасады, будь они не ладны


Поэтому для меня laravel — это некоторый yii на стероидах. Да, модные компоненты. Но статика, магия, рантайм конфигурация…
Вы так говорите, как будто в остальных местах лара проповедует SOLID

Нет, я говорю лишь о том, что в ларе многие вещи можно сделать по SOLID.


Фасад на фасаде.

Да, и мне ужасно не нравится эта концепция. И не нравится, что документация не рассказывает о best practies.


Поэтому для меня laravel — это некоторый yii на стероидах. Да, модные компоненты. Но статика, магия, рантайм конфигурация…

ППКС

Если речь о файлах web.php и api.php, в которых из коробки описываются роуты, то в них переменная $router доступна без объявления.
Только для IDE приходится ее тип в начале файла прописывать:


/** @var \Illuminate\Routing\Router $router */

Аналогичный кусок:


$routes->add('register', '/register')->methods(['GET'])
Что делает этот код? Открывает доступ к /register? Это, конечно, только мое мнение, но это как то очень сложно читать… почему такие настройки, как допустимый метод не задавать на уровне самого контроллера, зачем это куда то выносить?

Рассказывает фреймворку какой метод какого контроллера дернуть, когда придёт GET запрос /ru/register и как сформировать урл для роута с именем register


Аннотации/атрибуты и задаются на уровне контроллера. Есть, правда, минус — поиском по исходникам сложно понять какой контроллер за обработку конкретного урла отвечает. Ну и формально нарушается SRP — контроллер должен знать что-то о роутах, на которые он должен откликаться, управлять конфигурацией фреймворка по сути

Про SPR — все верно, поэтому мы делим контроллеры на экшены и все экшены, которые относятся к контроллеру указываем в его (контроллере) аннотациях. А уже в классе экшена настраиваем все, как нам нужно
любые аннотации технически нарушают SRP. если вам вдруг захочется подключить этот же контроллер по другим роутам вам почему-то придется менять не конфиг приложения, а код контроллера (его аннотации, но технически они неразрывно связаны с кодом)
А мне после Yii2 Laravel кажется жутко неудобным. Особенно после AR и Yii2-debug. Но это всё дело вкуса.
>Laravel хорош для новичка
О да, то, что новички вытворяют на Laravel, такого ужаса на Yii мне не встречалось. Кстати, документация у Yii2, как по мне, более удобная и информативная.
вот поддержал бы, последний год проект вели на Yii2, всё отлично было
в этом решили сделать его форк на Laravel, сделав упор на оптимизацию, переписав логику, упростив процессы и после Yii2 Лара просто вызывает удивление. Yii2 из коробки убирает возню с маршрутами, с генерацией CRUD, простое введение ролей в проект за счёт RBAС, валидация простая и понятная, шаблоны в плане синтаксиса как-то поаккуратнее шаблонов блейда выглядят. В Ларе мы успели и с путями покуролесить, и с валидацией поморочились, и CRUD-генератор, который варит контроллеры/модели/формы, тоже искали. В Ларе строка текста, которая имеет переводы, выглядит как __('admin.Enter name'), к нам подходил джун, спрашивал, что это за «магические методы у нас в формах, я не знаю, как такое гуглить»))
Да, мы потом со всем разобрались и настроили, но Yii2 из коробки в плане документации и удобства выглядит как зрелый, цельный фреймворк, а Лара как хайп-фреймворк, который дёргал с миру по нитке + такое ощущение, что эти люди страшно скучали по разработке на javasript)
п.с: хотя у этих фреймворков, скорее, разные назначения и возможности, но вот как раз в плане удобства Yii2 как раз, имхо, максимально удобен, а на основные вещи есть даже актуальная документация на русском
И ещё у Laravel странное поведение кеша. А ещё постоянные с архитектурой. Например, то мы модели в одном месте храним, то в другом, то снова в первом.

Основная проблема не в этом а в том что все это прибито намертво гвоздями в ядре.


В тем проблема вынести это в отдельный service provider и дать выбор пользователю самому решить где и что в каком виде хранить?


В итоге приходиться делать патч на ядро а это боль и при обновлении все это слетит.

решили сделать его форк на Laravel, сделав упор на оптимизацию

Вот тут я очень растерялся. Не самый логичный выбор, на мой взгляд.


В Ларе строка текста, которая имеет переводы, выглядит как __('admin.Enter name')

Ещё с 4 версии PHP было расширение для локализации gettext, так вот в нём был оператор _($string). Скорее всего оттуда и растут корни. Опять же, никто в ларе не заставляет использовать __(), можно использовать более понятное trans(), учитывая что


<?php

# vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

// ...

if (! function_exists('__')) {
    /**
     * Translate the given message.
     *
     * @param  string|null  $key
     * @param  array  $replace
     * @param  string|null  $locale
     * @return string|array|null
     */
    function __($key = null, $replace = [], $locale = null)
    {
        if (is_null($key)) {
            return $key;
        }

        return trans($key, $replace, $locale);
    }
}

// ...

А можно инжектить Illuminate\Contracts\Translation\Translator. А в шаблонах можно использовать диркективу @lang(). Вряд ли фреймворк виноват в том, что вы в своем проекте выбрали тот путь, который ваши джуны теперь не могут гуглить.

А потом получается что в шаблоне используем lang(), в контроллере, если надо trans(), не очень удобно, но всяко понятнее, чем __(), да.

а если инжектить Illuminate\Contracts\Translation\Translator, то вообще $this->translator->get();...

1) вот смотрите — сначала мы повели проект на Yii2, который наш лид очень хорошо знал на предыдущих проектах. Раз 5 нам заказывали большие изменения проекта/интеграции/наборы хотелок в урезанные сроки, из-за чего была добавлена куча кода с реализациями, многие из которых были плохо изучены, компромисны, переутяжелённы либо тянулись из-за принципа «работает — не трогай».
Когда появилось время — решили это переписать, хотели фреймворк на актуальной версии php, который активно развивается, посмотрели, что на рынке ходовое, что на stackOverFlow активно обсуждается и, по сути, всё свелось к Symphony или Laravel. В итоге выбор пал на Laravel — его охотно хотят на рынке проектов и вакансий, на нём делается много проектов, сам фреймворк активно обсуждается на стековерфлоу, развивается, выходят релизы и полезные дополнения + он нам показался проще для ознакомления, чем, например, Syphony
2) про gettext() вы совершенно правы, просто если гуглить «навскидку», то запросы вида «два подчерка» «php two underscores» выдают много результатов про магические методы
Не знаю на сколько ваши джуны — джуны, и какой у них был фронт работ.
Может это мое мнение основанное на опыте, но я как минимум поискал бы в коде фреймворка «function __(».
Что же касается гуглежа, то «php two underscores» + «laravel» дает вполне себе результат.
Yii2 из коробки убирает возню с маршрутами, с генерацией CRUD, простое введение ролей в проект за счёт RBAС

Это достоинство выльется в фатальный недостаток, когда окажется, что приложение должно выполнять требования бизнеса. Шаг влево — и начинаются велосипедостроения, а палки в колеса подкинут излишне связанные части ядра.
Фреймворк должен давать только прочный скелет, но не определять что и каким образом будет на нем реализовано. Увы, что Yii, что Laravel в пролете по этому параметру.
всё так
всего лишь хотелось отметить, что начать работу c Yii2 показалось проще и понятнее, чем с Laravel
. В Ларе строка текста, которая имеет переводы, выглядит как __('admin.Enter name'), к нам подходил джун, спрашивал, что это за «магические методы у нас в формах, я не знаю, как такое гуглить»))

а в чем проблема отправить джуна читать оф доку перед началом работы?

Ну из остального не всё legacy. Slim вполне себе норм, на нём и php-di всё же проще собрать приложение, чем на php-di с нуля.

Zend — раньше жил только за счет его форса ZendFoundation и был жутко неудобной страшной штукой. Сейчас (Laminas) даже не смотрел.
Первый зенд был ещё более-менее нормальным, если не брать во внимание длинющие имена классов. Он был типа «фундаментальный», с каркасом но без готовых решений, навязываемых фреймворком. Мне такой подход даже импонировал в чём-то.

Laminas на этих выходных (31.01.2021) немного копал, первое впечатление — у.г., так что лучше и не смотрите :-) На мой взгляд оверэнжинирнг во всей красе, плюс скудная документация и малое комьюнити. Общее впечатление сугубо отрицательное.

Статья откуда то скопирована явно, большая часть этих «популярных» фреймворков была популярна раньше, сейчас практически не используется, и не развиваются. Реально популярными можно назвать только Laravel, Symfony и может быть еще Slim
Сейчас актуальны только 2.5 фреймворка: Symfony, Laravel и Yii (с натяжкой).
В основном, все более-менее хорошие ваканции крутятся вокруг них.
Yii 3 обещает быть хорош. Но его ожидания напоминают ожидания Half-Life с той же тройкой на конце.

А чего ждать? Yii не Half-Life, он открыт. Никто же не мешает внести свой вклад в ускорение выхода :)

Простите, но разрабатывать Yii — не мой бизнес. Нельзя объять необъятное.
В свою защиту скажу, что я являюсь донатером Yii не Патреоне.
Он несколько лет обещают сделать то что в Ларавеле и Симфоне появилось уже лет 5 назад
Это делает его идеальным выбором для крупномасштабных веб-проектов, создаваемых на уровне организаций.

Использую его всегда, даже для своих мелких экспериментов/проектов. Благодаря flex подключаешь только то, что необходимо для проекта.

Да и кодогенерация там вполне хорошая. Можно по-быстрому сущности, миграции, crud, аутентификацию и т.д. организовать.

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

Как лихо автор называет черное белым прямо в первых строчках.

мне очень нравится и я его использую уже довольно давно, это FatFreeFramework, перешел на него в свое время с Phalcon'а.

А почему 9 примеров? В таких статьях должно быть 10 для красоты!
Не хватает Битрикса ведь по словам его разработчиков он тоже фреймворк :)

Я как настояший православный програмист пользуюсь своим велосипедом
Я начинал лепить этакий велосипед еще в 2008 году, и он до сих пор жив) Написал несколько классов:
  • для работы с БД
  • для шаблонизации
  • для кеширования
  • работа с картинками (ресайзы, ватермарки, кропы)
  • простейший CRUD чтобы в админке редактировать
  • ну и еще контроллер, который можно кастомизировать


Все это влепил в некую систему инициализации, автолоад чтобы нужные классы сразу подгружались и в целом работает, но это все больше как фан-проектик.
В коммерческой разработке всем пофиг обычно на оптимизацию и скорость, там триста раз в день бизнес меняет задания и нужно все это успевать, а еще текучка кадров такая что из 100 человек 30 за год обновляется и может так получиться что в твоей команде из 3х разрабов двое поменялись, поэтому там всеобщая стандартизация, проще сразу нанять человека со знанием определенного фреймворка, чем учить полгода твоему велосипеду.
Что выбрать?

Забыли упомянуть, что далеко не всегда выбирать вообще нужно. Фреймворк — штука громоздкая и часто можно обойтись чистым PHP + компонентами при необходимости.

Абсолютно согласен. Лично я чистым PHP и обхожусь.

Тряхнул стариной и леплю свой фреймворк велосипед на базе Swoole и Symfony Components :)

btw, одна из лучших, на мой взгляд, статей для понимания того, зачем вообще нужен фреймворк и как работает симфони — это вот эта серия

symfony.com/doc/current/create_framework/index.html

по факту как раз рассказывает как слепить свой фреймворк на базе симфонёвых компонент

Спасибо, но я читал ещё первую версию в режиме сериала )

А почему не взять что-то из микрофреймворков?
Slim, Mezzio?

Ну свуле емнип есть пакеты и для того и для другого.


Я больше о компонентах симфонии любопытствовал

Подход Symfony мне сильно импонирует. Несколько основных компонентов (контейнер, роутинг, конфиги, события) интегрировать и вся экосистема Symfony будет доступна. Огорчает немного местами отход от PSR

что в вашем понимании микрофреймворк? для запуска проекта на симфони вам достаточно (в исходниках) иметь три файла — composer, kernel и index.php, каждый на несколько строчек
Давайте я вам просто приведу примеры, а вы сравните разницу сами?

Микрофреймворки — Slim, Mezzio
Фреймворки — Symfony, Laravel, Laminas

И все-таки какие критерии?


composer create-project mezzio/mezzio-skeleton mezzio
composer create-project symfony/skeleton symfony

Размер:


15M ./mezzio
9,1M    ./symfony

Количество файлов в скелете?


cd ./mezzio
git status | grep 'new file' | wc -l
      31
cd ./symfony
git status | grep 'new file' | wc -l
      19
Руки наконец-то дошли сделать хоть что-то более вразумительное вашей попытки сравнивать размеры.

Симфония несомненно прошла большую эволюцию со времен 1/2/3 версии. Меня особенно порадовал приход Flex и ориентация на микроядро.
В этом контексте разница с микрофреймворками существенно сократилась.

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

Задумался над тем как внятно объяснить свои ощущения и опыт — понял что это сложно.
Поэтому собрал вот такой вот наглядный пример, который отчасти демонстрирует разницу для меня.

Вот результат выполнения кода в рамках вами же предложенных скелетов приложений.
По моему опыту в mezzio код имеет тенденцию оставаться линейным по максимуму.
Хотя писать, естественно, можно по-разному.

image

P.S. Для симфонии пришлось прописать простой индекс-контроллер с банальным эхо.
Запускал все под встроенным в php сервером.
UFO just landed and posted this here
Вместо чистого Slim имеет смысл использовать его версию на стероидах — Comet:

github.com/gotzmann/comet

Внутри доступны все возможности Slim, только быстрее в 10 раз
Sign up to leave a comment.