• Как правильно спроектировать Laravel приложение с уклоном в enterprise?

    SowingSadness
    @SowingSadness
    web-разработчик
    Сейчас напишу немного высокомерно, но опыт позволяет. Уже почти 20 лет в разработке и около 15 в веб.
    Надо понимать, что почти все кто используют многочисленные Фреймворки не понимают что такое ООП. А уж тем более, что такое SOLID и т.д.
    И поэтому, что бы они не писали, в конце-концов превращается в какашку с костылями.
    Да, потом героически проект переписывается с учётом изменений (или ещё чаще умирает) Но, он по прежнему остаётся абсолютно не расширяемым и не поддерживаемым.

    И вот мы возвращаемся к Фреймворкам.
    Нужно брать тот Фреймворк, который писали с учётом определённых парадигм и принципов. Так как этих вот парадигм, достаточно описанных и изученных не так много (на самом деле их 2.5 штуки), то можно сразу ориентироваться на ООП + MVC(или MVP или MVVM) + SOLID
    Если Фреймворк что-то из этого нарушает, то он по умолчанию не может вам дать возможность написать хорошее, расширяемое приложение. А хороший Фреймворк, даже начинающим программистам должен прививать правильные подходы к разработке. Что-бы хочешь, не хочешь, а hello world уже не превращался в ад.

    Сразу оговорюсь, что я давно "забил" на Фреймворки. Есть один идеальный — это Pyramid. А оцениваю любой продукт по документации. Там сразу видны все огрехи и косяки. Буду писать и параллельно смотреть в доки.

    Larvel
    Первое что я вижу в этом Фреймворке, что большая часть работы каркасных компонентов завязана на статических вызовах. На этом можно уже, даже и остановиться. ООП, по большому счёту тут нет. Суть ООП в использовании объектов. Тут же класс выступает в качестве пространства имён функций.
    Раз нет ООП, то и нет всей теории и принципов связанных с ним.
    А раз под этим Фреймворком не заложено никакой теории, то в 99% случаев можно сказать, что на нём что-то правильно, написать невозможно.

    Если взглянуть глубже, то открывается ещё больше ада:
    ActiveRecord.
    Плох по умолчанию. С ним очень тяжело контроллировать целостность данных. Вам нужно придумать слой абстракции, где вы будете транзакционно записывать все данные вне бизнес логики. Фреймворк вам тут не поможет. Он предложит это делать в экшене (контроллере). И тут вы столкнётесь, что при написании чего-то сложнее чем бложик, вы будете терять целостность. Ибо бизнес логика и работа БД будет в одном методе. Отладка будет усложняться, ошибок плодиться и т.д.
    И не зависит это от программистов. Шаблон сам по себе провоцирует ошибаться.
    Далеко за примерами ходить не нужно, уже треш.

    Чем больше примеров я смотрю, тем больше не понимаю, как все это дело расширять. Как вставлять прозрачно через весь проект свои собственные аспекстные решения. Например RBAC. Или, если нужно, логику работы приложения отделить от БД и когда нужно, подставлять необходимую реализацию.
    Или сделать работу всех экшенов в рамках клиента, но производить авторизацию по пользователю(сотруднику)

    Все это предлагается зашивать прям в контроллерах, с помощью protected или private методов.
    Повеситься. Сложность приложения зашкалит.

    Symfony
    Только при выходе 2 версии я работал с этим чудом. Разработчики писали его под хапйом dependency injection. Мало того, что они взяли не самую хорошую стратегию для реализации всего костяка фреймворка, так ещё и сделали её не правильно.
    Они написали универсальный DI Container и кладут в него все что угодно, используя в качестве идентификатора строчку.
    Строчку, М**Ь ЕЁ! Не интерфейс — строчку!
    И знаете чем это аукнется? А тем, что при разработке своего приложения или очередного бандла, вам будет говорить, что в контейнере лежит что-то не то и вы подохните в конфигурационных настройках. А все потому что, подход: ВСЁ через DIC — строго навязывается.
    Расширение этого чуда, тоже причинит вам массу головной боли. Ведь, зачастую, вы будете работать с классами, которые ждут не интерфейс, а что-то из контейнера с ключём "я_твой_дом_шатал".

    Проблема с внедрением аспектов сквозь весь фреймворк, никуда не пропадает. Но тут по другой причине. Сложность платформенных компонентов зашкаливает. Все пишется с завязкой на конкретную реализацию, но получают все по строчке из DIC.
    Потому что это центральная концепция. Другой нет.

    Но, по правде говоря, слепить что-то годное возможность есть.
    Если взять микро ядро symfony, прикрутить Doctrine, то получится что-то годное.
    Но встаёт вопрос. А зачем вообще symfony, если можно взять doctrine и написать все остальное свое?
    И тут вы окажетесь правы — незачем.

    Ситуация с Symfony в enterprise очень схожа с ситуацией с Django. Повидал уже с десяток проектов, где последнюю брали для больших приложений. В итоге от Django оставались рожки да ножки. Всю её переписывали.
    Спрашивается — и зачем? Просто потратили кучу времени.

    Так что, если нужен суровый enterprise. Что бы писать что-то большое, с возможностью расширения — берите Pyramid и переходите на python.
    Ничего, даже близко с пирамидкой, по возможностью расширения, даже близко не лежало.
    Ответ написан
    33 комментария
  • Nginx + php7-fpm High load?

    @miksir
    IT
    5000 запросов в 1 секунду на PHP скрипт? Давайте начнем с PHP, может, а не с nginx. Считаете время ответа одного запроса T, считаете количество воркеров PHP N = 5000*T. Далее запускаете это число воркеров, делаете одновременные запросы на все воркеры и путем увеличения числа ядер процессора добиваетесь времени ответа сервера такого же, какой был на одном воркере. Ну, это без учета того, что если используется СУБД - ее время ответа тоже нужно будет исправлять на заданной конкурентности. Не хватает ядер, добавляем сервера.
    Ответ написан
    4 комментария
  • Как устроена архитектура современного front-end приложения?

    @pwnz2
    Напишу краткий ответ.

    Начни изучать VueJS. Просто потому что он прост в изучении и начинании и не только, также он приобрел все хорошие стороны таких фреймов как Angular, React, Ember. Его можно использовать просто подключив к странице как и jQuery. Далее иди в сторону бандлеров, изучи webpack и начни использовать готовый шаблон vue-webpack который очень просто можно скачать с vue-cli.
    Ответ написан
    Комментировать
  • Есть ли обучение по созданию push уведомлений?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Если ты не понимаешь теорию, значит на практике у тебя ничего стоящего не выйдет.
    А так вполне себе хорошая теория тут https://developer.mozilla.org/en-US/docs/Web/API/P...
    И она содержит ссылочку на вполне себе реальный пример https://github.com/chrisdavidmills/push-api-demo

    Как эта штука используется на практике.

    После того, как вы определились с тем, что вы собираетесь отправлять, вам нужно сделать несколько вещей.
    1. Запросить у пользователя разрешение на отправку уведомлений. Делается это через Notification.requestPermission. Если мы получили подтверждение, то идем дальше, если нет, забиваем на это дело. Здесь нужно быть очень осторожным и делать это ненавязчиво.

    2. Создать фоновый обработчик, который будет принимать push-уведомления от сервера. Это делается через вызов navigator.serviceWorker.register. Например так https://github.com/chrisdavidmills/push-api-demo/b...
    Он подписывается на канал. Канал - это как комната в чате.

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

    3. Написать сервер уведомлений. У nginx есть хороший модуль. Он будет обслуживать клиентов.

    Рекомендую к просмотру https://www.youtube.com/watch?v=5A5Iw9z6z2s
    Ответ написан
    7 комментариев
  • Аренда дешевого дискового пространства, подскажете?

    alsopub
    @alsopub
    Дешево, много места, без бекапов - https://billing.time4vps.eu/cart/storage-server/
    Есть лимит на трафик, но для устаревших товаров, думаю, его будет достаточно.
    Хороший пинг из России.
    Ответ написан
    3 комментария
  • Модульность на фронтенде?

    @Lev_Shestov
    1. Посмотрите пристальнее на BEM, они разработали не только подход, но и многие утилиты под разработку. Въехать сложно, но есть на что посмотреть.

    2. TARS - сборщик фронтенда от ДубльГис. Очень интересная штука, позволяет не только внедрить модульность, но и избавить программиста от многих задач. Работает она на основе того же gulp'а, но создавать сборки не нужно, нужно только в конфигах указать, какие препроцессоры использовать, и дальше TARS уже сам разберется.
    В TARS используется методология БЭМ, но в отличие от нативного БЭМ-сборщика от яндекса, в TARS гораздо проще въехать и начать работать.
    Статья на хабре - она не очень, если честно. Всех фишек TARS не раскрывает.
    Документация
    Использование вышеуказанного Bemto под TARS позволит дополнительно привнести ясности в код.
    Ответ написан
    Комментировать
  • Модульность на фронтенде?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    (кратко про себя)
    Все лежит в папках: компонент + стиль. Собирается webpack'ом. Но у меня react-проекты.

    (длинно, но вроде бы по делу)
    Если относительно долго занимаетесь - у вас скорее всего уже выработались части, которые похожи - их выносите. Так же скорее всего у вас есть одинаковая структура (обычно это js/css/images и html, либо как вы пишите компонентами (отдельными папками) внутри котороых html + стили и может js ). Делайте шаблон для будущих проектов, в первую очередь удобным для себя - ведь вам с ним работать, а в нем реализуйте то что умеете по-максимуму (жмите картинки, оптимизируйте js и т.д)

    Плагины, которые используете для Gulp, просто проверьте в блэклисте, а так же можете посмотреть новые версии. Вообще, хорошо если вы знаете все свои плагины, в таком случае - вам и этот пункт можно не выполнять.

    кажется, что не использовал это все на 100%

    Всем так кажется, поэтому когда не хочется заниматься работой, идем в гугл и смотрим опен-сорс проекты других людей: gulp, wepback, затем если нашли что-то любопытное идем в npm/github читаем доку. Пытаемся применить в работе.

    Что имеем в итоге?
    1) если все работает и вас устраивает (скорость сборки, удобство проверки в разных браузерах ...) - "работу работать";
    2) если есть время и желание - гуглите опен-сорс решения, читайте твиттер интересных людей / новостную подписку;
    3) если хочется услышать мнение коллег, но при этом коллег рядом нет - пишите статью на хабр. Просто статья: я использую такие-то плагины в своем "шаблоне" - вряд ли получит лестные отзывы, но возможно кто-то напишет: вот в этом месте у вас плохо, сделайте иначе. Возможно, вы придумаете, как написать статью интересно - тогда честь и хвала. И критика. А обоснованная критика всегда хорошо.

    P.S. если используете Jade и следуете BEM-методологии, то я бы порекомендовал посмотреть на этот проект
    Ответ написан
    Комментировать
  • Логин через бота телеграм, кто как привязывает пользователей?

    OPHION
    @OPHION
    Пусть при старте чата бот сообщает пользователю его идентификатор (ID чата), который пользователь самостоятельно введёт в личном кабинете вашего сайта.
    Ответ написан
    Комментировать
  • На чем лучше и быстрее написать парсер (PHP)?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    DiDom: https://github.com/Imangazaliev/DiDOM

    + высокая скорость работы (сравнение с другими парсерами)
    + хорошая дока
    + большое количество поддерживаемых селекторов
    + самое главное - тесты

    Простой пример:

    $document = new Document('http://www.example.com/', true);
    
    echo $document->first('title::text');


    Чуть посложнее - парсим все ссылки:

    $links = $document->find('a[href]::attr(href)');
    
    var_dump($links);


    Еще сложнее - получить адреса всех ссылок-картинок:

    $links = $document->find('a[href]:has(img)::attr(href)');
    
    var_dump($links);


    Другие варианты:
    - Symfony DomCrawler
    - Zend Dom Query
    Ответ написан
    3 комментария
  • Исходники каких PHP-проектов лучше поизучать для примера отличного PHP-кода?

    @vashaaa
    Юх с горы
    Symphony копайте, вам на год хватит.
    UPD:ответ вас позлил наверное но я Объясню. Yii хорош, но symphony лучше. Копайте его, залейте клона с официального гита себе и разберитесь что и как работает. Не узнайте как с ним работать, а именно нарежьте его нано скальпелем до переменных, и посмотрите как он устроен. На том же гите поищите проекты на нем и разберитесь как и почему. Если уверены в своих силах закомитьте что нибудь, мелкую фичу. Почему symphony а не что-то ещё? Разберёшся с ним - с остальными проблем не будет. Конечно можно с дуру взять и смотреть Zend, но пожалейте свои мозги и время,года 3-4 на понимание уйдёт. Почему фреймворк а не книги или что-то ещё? Ну как вам сказать, книги это хорошо и читать их нужно, но фреймворки и примеры работ это здесь и сейчас, это то что востребовано то что вас прокормит, а книги можно почитать для общего развития авось где-то пригодится. Но это я именно об php и структуризации кода. Алгоритмы, архитектуры бд и т.д. закидывать не лзя, это читайте.
    Ответ написан
    7 комментариев
  • Быстрый LIKE по 1 миллиону строк, как быть?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Вначале, все слова записываем в виде хеша так, чтобы буквы шли по-порядку, но повторные - не повторялись. 'мама мыла раму' => 'ма ылру'
    Можно дополнительно создать еще один кэш и отсортировать в порядке убывания кол-во повторов букв:
    Приведём новый пример: 'мыла раму мама' (переставим слова местами)
    'мыла раму мама' => [м-4][ы-1][л-1][а-4][(пробел)-2][р-1][у-1]=>'ма ылру' (предыдущий пример останется без изменений...)
    и поиск вести по половинам хэша (при нечетном кол-ве -округляем в большую сторону) введённой строки 'ма ылру':
    1. При не найденных совпадениях, порядок такой: 'ма ы'=>'ма'=>'м'
    2. При найденных совпадениях, порядок такой: 'ма ылр'=>'ма ыл' Как выдача будет нулевая - берём предыдущий МИНИМАЛЬНЫЙ! результат выдачи.

    Таким образом можно отловить с большей вероятностью пропущенные буквы при вводе.

    Можно составить отдельную таблицу по всем словам и привязать их к основным данным.

    Затем выборка этажеркой:
    1. Преобразуем так же вводимую строку и выбираем LIKE 'ма мыл%'
    (возможно несколько выборок с проверкой пропущенной буквы) запоминая результат выборки.
    2. По этому результату ищем полную строку с тем же LIKE 'мама мыла раму%'
    3. При следующем поиске, если хэш не уменьшился и символы в диапазоне длины предыдущего хэша не изменились - мы ищем СРАЗУ ЖЕ! по результату п.1 (и снова запоминаем результат), экономя время (т.е. поиск как бы идёт по предыдущему кэшу).

    Таким образом получается, что чем больше букв, тем меньше записей мы перебираем.
    А чем меньше мы перебираем, тем больше у нас времени остаётся и мы можем его использовать на дополнительные запросы: для нечеткого поиска.
    Ответ написан
    Комментировать
  • Continuous delivery, Continuous integration, Docker при "многоверсионном" приложении. Как организовать?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не нравится, что в итоге заводится куча тегов, веток, может есть альтернативное решение для такой задачи?

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

    Схема кажется немного избыточна nginx->nginx->php, в итоге на сервере дофигища разных процессов, особенно nginx.

    Тут все зависит от того, можно ли отдавать клиенту доступ на прямую к nginx2. Если нельзя - ваша схема вполне норм. Если же можно - тогда стоит это делать, смотрите в сторону своего балансировщика, который будет отдавать клиенту сервер, который А - жив, Б - минимально нагружен и штук типа consul.

    ansible забирает из гита исходный код, грузит на сервер, в контейнеры исходники пробрасываются через volume.

    Зачем? Контейнер как бы иммутабельный и все такое. Если у вас там кучка статики подсасывается не под git - смотрите в сторону mogilefs и т.д. Безусловно, для разработки volume - самое оно, но для прода - ну такое..., должна быть веская причина.
    Ответ написан
    1 комментарий
  • Есть ли среди вас те, у кого есть постоянный стабильный доход не от разработки, а от своего продукта?

    myfirepukan
    @myfirepukan
    Жарим поиск
    Есть такие это я.
    MFA тема жива в мировом масштабе. В СНГ на adsense нормально заработать проблемно, в РСЯ новые сайты почти не берут.
    MFA = профессионал в SEO и не только белом )) т.к. вам нужно уметь с минимумом затрат привлекать много дешёвого трафика

    А по поводу проекта ради идеи, то в основе любого проекта даже MFA должна лежать интересная идея. Как минимум идея интересного парсера )))))
    Ответ написан
    2 комментария
  • OctoberCMS - Годится ли как основа для web-студии?

    parotikov
    @parotikov
    Wordpress, Laravel, OctoberCMS, Vue, Nuxt.js
    Отвечу по существу:
    Октябрь для вас будет идеальным вариантом, учитывая, что вы уже работаете с ларой.
    Джуны входят на раз-два. Куча плагинов, легкость разработки, клиенты радуются админке.
    Ну и плагин Билдер - мой фаворит. Творит просто чудеса. В чем-то похож на Pods для вордпресса.
    С ним конвеерная разработка типового функционала (например, модули каталог предприятий, галерея, афиша и т.д.) превращается в трехкликовый копипаст. А учитывая, что все сделанное можно экспортировать в виде плагинов и устанавливать в Октябре через Project ID, то это прям рай для вебстудии.
    Так что для мелко-средних проектов категорически рекомендую.
    Ответ написан
    5 комментариев
  • Как правильно разделять приложение node js на микросервисы?

    saDam
    @saDam
    Microservices, .NET Core, EF Core, SQL, RabbitMQ,
    Попробуйте почитать тут:
    Очень годное руководство по микросервисам: https://www.nginx.com/blog/introduction-to-microse...
    node.js: codewinds.com/blog/2015-11-14-microservices-nodeve... (https://github.com/jeffbski/microservices)
    Ответ написан
    Комментировать
  • OctoberCMS - Годится ли как основа для web-студии?

    @Yadalay
    Php, Mysql, Html, Css, Js/Jquery/Ajax, Laravel
    Проекты не делаю на данной CMS, но работал с ней. Узнал о ней 2 года назад. Она сейчас мало известна, так как находится в бета-тестировании. Скоро, насколько я знаю, будет релиз. За бета-тестирование это они хорошо развили эту cms. Код шикарен, функционал - шикарен, внешний вид - шикарен и удобен. Глаза радуются, когда работаешь с данной cms. Можно делать те же сайты-визитки, практически не влезая в код, что очень удобно и здорово. Да, и большое преимущество, что он сделан на Laravel. Повторю: скоро релиз, а они уже хорошо всё сделали. После релиза, думаю, будет ещё много чего классного. Поэтому советую Вам хотя бы попробовать сделать пару проектов на нём. Если действительно всё хорошо получится, то почему бы не взять его для разработки Ваших заказов?
    Ответ написан
    Комментировать
  • Как отлаживать javascript без console.log?

    SerzN1
    @SerzN1
    Challenge me!
    Для начала неплохо бы посмотреть документацию, а именно эту.

    Затем можно посмотреть доклады по этой теме, например: видео + статья
    Ответ написан
    Комментировать
  • Какой правильный путь при написании роутинга?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала давайте разберемся с тем что такое "правильно". Правильно в контексте вопроса - это максимально гибко. В приведенных вами ссылке "роутер" влияет на то, как будет устроена вся система. То есть в них мы сначала делаем допущение "у нас будут контроллеры, модели и представление, что бы как в рельсах но по другому).

    Роутер же не должен ничегошеньки знать о контексте своего использования. Вот это будет правильно. Мы просто должы скормить ему какие-то правила маршрутизации, задающие соответствие "uri => mixed" к примеру, а так же иметь возможность скормить ему строчку что бы тот сказал кого все же вызывать.

    Все, на этом зона ответственности "роутера" заканчивается. Грубо говоря самая примитивная реализация роутера:

    // наш примитивный роутер
    function getRoute(array $rules, $uri) {
         return $rules[$uri] ?? null;
    }
    
    // использование роутера
    $action = getRoute([
        '/' => 'indexPage',
        '/about' => 'aboutPage',
        '/blog' => 'blogPage'
    ], '/about');
    
    // больше нам уже роутер не нужен
    // вызываем действие
    call_user_func($app, $action);


    Далее уже мы можем решать как нам будет удобнее организовать работу с правилами. То есть сразу мы видим что тут статическая карта маршрутов, а стало быть... мягко скажем не гибко. Тут мы можем использовать либо uriTemplates либо просто регулярные выражения либо придумать свою надстройку над регулярками для более удобного составления правил.

    Сами же значения карты роли роутеру играть не должны. Хотя мы можем добавить туда какие-либо дополнительные ограничения, вроде поддерживаемый HTTP метод и т.д. Но в этом плане проще сделать так:

    $rules = [
         [ 'uri' => '/blog/page{pageNumber:\d+}', 'method' => ['GET', 'HEAD'] ]
    ];


    далее мы можем сделать загрузчики правил и прочую чушь. Но повторюсь - цель роутера - на основе строчки, представляющей URI выбрат из списка маршрутов подходящий. Роутер не должен больше ничего уметь.

    Запуском же конкретных действий по найденному маршруту пусть лучше занимается другой компонент.
    Ответ написан
    5 комментариев
  • Какой CRM для Фитнес Тренера?

    Antonoff
    @Antonoff
    Разработчик
    CRM незнаю, но большинство нужд можно покрыть простым и бесплатным Trello & Trello Apps
    Ответ написан
    Комментировать