Ответы пользователя по тегу PHP
  • Правильно ли я понимаю MVC?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет, вы не правильно поняли MVC.

    Попробуйте подойти к проблеме чуть с другой стороны. Реализуйте ваше приложение так, что бы оно ничегошеньки не знало о HTTP, внутри него небыло ни единого echo, оно ничего не знало о сессиях и вообще ничего не знал о таких вещах. Проще всего этого добиться - ваше приложение можно запускать через CLI. Грубо говоря как-то так:

    <?php
    // run.php - просто скрипт для разового теста
    
    require __DIR__ . '/vendor/autoload.php'; // вы же уже используете composer?
    
    $app = new App();
    $app->getService('login_handler')->login('user@example.com', 'password');


    Что-то типа такого. То есть на каждый "юз кейс", то есть то что приложение должно делать, у вас должен быть метод. Типа "сделай то-то" и "сделай еще что-то".

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

    Делается это за счет того что между UI и приложением вводят дополнительный промежуточный слой адаптеров - контроллеры (это опять же не обязательно один объект, это может быть целая цепочка адаптеров, каждый из которых делает что-то конкретное, в плодь до последнего адаптера который уже конвертирует http запрос в нужный вызов нужного метода).

    То есть что бы сказать "я сделал MVC" у вас приложение не должно зависить от UI. Если вы хоть где-то в приложении используете суперглобальные массивы, и т.д. вы проиграли. Ну либо просто не называйте это MVC, скажите что вы просто шаблоны отдельно ложите ну и роутер еще есть. Но это не MVC, это smartui, то есть наше приложение вкурсе что у него есть UI и они сильно связаны.

    MVC нужно далеко не всем, и smartui сойдет для простых проектов. Но вы должны понимать разницу, и знать когда стоит загоняться а когда можно логику в контроллеры выносить.

    Надо ли было создавать глобальные переменные в модели

    Это вы еще не уяснили значит что такое ООП, почему глобальное состояние плохо и что такое побочные эффекты (погуглите в контексте состояния).

    делать сеттеры и геттеры?

    А этим мы нарушаем инкапсуляцию. Внешний мир должен знать только что можно делать с моделью, но никак не ее структуру. То есть вместо setSomething у вас должно быть осмысленное название, типа updateSomething, changeSomething и т.д. Типа "user should be able to change password" и у вас появляется метод "changePassword". Или "User should be able to update profile details" и у вас появляется один единственный метод "updateProfileDetails()". А что оно как состояние меняет - это консерн исключительно объекта. Ему рашеть менять чего или нет. Мы таким образом изолируем побочные эффекты и уменьшаем вероятность багов. Ну и нам не нужно валидировать при таком раскладе ничего так как нет промежуточного невалидного состояния.
    Ответ написан
  • Сравнение объектов через "оператор кораблик" в PHP. ...?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    То есть сравниваем мы по значению, а ключи массивов не считаются?

    p.s. пример из доки у меня работает. php 7.0.4.
    Ответ написан
  • WebSocket. На чём его можно использовать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Давайте так, расскажу вам как самому себе отвечать на такие вопросы.

    1) у нас есть ключевое слово - WebSockets. Заходим в гугл и вбиваем, он отправляет нас читать википедию. Замечательно.
    2) там мы видим что это протокол поверх TCP и т.д. и тп. То есть гуглим все новые и непонятные для нас слова.
    3) как только мы ознакомились что это за штука, мы можем поискать реализации web socket сервера и глянуть требования.
    4) делаем выводы.
    Ответ написан
  • Что такое APCu?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    php.net/manual/en/intro.apcu.php

    Был раньше такой экстеншен для PHP - Alternative PHP Cache или APC. Его суть сводилась к кэшированию байт кода в общей памяти (для всех процессов, например для всех php-fpm воркеров). И разработчики впилили туда простенькое key-value хранилище, которое так же расположено в шаред мемори.

    Так вот, в php5.5 появился opCache который намного эффективнее работал, потому ребята для совместимости выдрали из APC реализацию хранилища и сделали отдельный экстеншен. Буковка u в названии это типа user cache.

    Это нечто вроде Memcached?


    Намного намного проще. Грубо говоря это как завести в памяти хэш-таблицу, к которой имеет доступ множество процессов. Скорость доступа к таким данным сравнима со скоростью доступа просто к оперативке, однако ложить туда надо только ооооочень горячие данные. Что-то большое лучше ложить в memcache/redis.
    Ответ написан
  • Какую ОС выбрать для локальной разработки на php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    это вообще нормально для профессиональных php разработчиков?


    Нет.

    так как хочу стать таковым , то меня интересует какой веб сервер использовать ?


    Ставьте себе убунту. Ну или virtualbox + ubuntu. Ну или vagrant. Ну или docker но это уже для продвинутых. Последние две штуки как раз и придуманы что бы невилировать (или хотя бы уменьшить) различия между окружениями.
    Ответ написан
  • Как избежать дублирования в контроллерах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Каким паттерном лучше всего решить данную проблему?


    Вы для начала не поняли зачем нужен контроллер. У вас логика "модели", то есть нашего приложения вытекла в контроллер, раз возникает дублирование. Контроллеры нужны для снижения связанности между UI (HTTP в нашем случае, шаблонизаторы и прочее) и непосредственно приложением. В вашем же случае у вас по сути нет того самого промежуточного слоя и контроллеры являются частью приложения, без которого оно не работает.

    В целом при дублировании обычно все решается очень просто - общую реализацию выносим в общую зависимость. Отдельный класс который делает дела и который юзают наши контроллеры. Сервис.
    Ответ написан
  • Есть ли возможность настроиь отправку почты, без MX записей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Возьмите smtp шлюз какой готовый (sendgrid - 12000 писем в месяц бесплатно, mailgun - 10000 писем бесплатно) и не парьтесь.
    Ответ написан
  • Есть ли смысл осваивать визуальные редакторы HTML?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    только если вы дизайнер и верстка это не то чем вы будете заниматься.
    Ответ написан
  • Почему правильнее делать сайт по mvc?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У вас может быть и модель, и прдставление и контроллер хоть в одном файле, суть то не в этом.

    MVC описывает не все приложение (есть Model2 которое убого но описывает все приложение, но я бы не рекомендовал вам сейчас на него ориентироваться). Оно описывает только "как сделать так, что бы приложение ничего не знало о UI".

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

    Далее, у нас есть представление. Вопреки вашему мнению, представление это не html а http. Поскольку PHP должен сформировать именно HTTP ответ (так или иначе, при помощи echo и header или при помощи абстракций над http). Просто обычно сайтики в качестве тела ответа содержат html. Но намного проще воспринимать "представление" как HTTP ответ. "шаблонизаторы" в этом плане не относятся к представлению, это способ его генерации. Сделаем допущение что весь view в нашем MVC это обычный HTTP ответ. Просто кусок текстовой инфы выплюнутый в буфер вывода. Помимо HTTP есть еще варианты: CLI или консольные скрипты, у них сфой формат представления. А еще есть менеджеры очередей и кучи других вариантов.

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

    Ранее мы уже сказали что "шаблонизаторы" это не часть представления а только способ его получения. Где мы должны использовать шаблонизатор тогда? Как сделать так, что бы наша "модель" или точнее наше приложение ничего не знало об этом "шаблонизаторе" (или сериалайзере, или json_encode, или еще чем-то там)? Положим между представлением и моделью что-то промежуточное - контроллер.

    Опять же контроллер - это не обязательно один объект. Это может быть целая цепочка объектов, которая может передавать запросы друг дружке и что-то с ними делать. Например один "контроллер" глянет мол "ага, он в качестве тела запроса прислал json - десериализуем". А второй контроллер такой "ага, он должен быть авторизован - надо проверить". Ну и т.д. покуда мы не дойдем до последнего контроллера в цепочке, который уже будет дергать "один" метод модельки. Это слой адаптеров между http и нашим приложением. Вот ключевая мысль MVC на бэкэнде (или ели точнее Mediating controller MVC или MVA, паттерн который реализован в большинстве современных бэкэнд фреймворков).

    Зачем нужно отделять UI от приложения? потому что что-то из этого явно меняться будет чаще и не одинаково. А еще можно распаралелить работу. А еще можно заменить реализацию одной из частей без вреда для другой. Словом мы получаем намного больше гибкости, но только если приложение ничего не знает о представлении.. В противном случае мы получаем антипаттерн под названием smart ui, для борьбы с которым 40 лет назад и придумывали MVC.
    Ответ написан
  • Как реализовать ajax запрос в mvc?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Использую mvc модель


    почитайте еще раз что это такое и зачем оно надо.

    Я хочу подгружать текст статьи через ajax,


    Ajax, он же XmlHTTPRequest - это просто API для выполнения HTTP запросов из javascript. С точки зрения бэкэнда (то есть php) - это просто очередной http запрос. То есть никакой разницы.
    Ответ написан
  • Как правильно писать названия переменных, функций и тому-подобное?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нижнее подчеркивание у функции убираем и все уже чуть получше.

    В целом же названия надо делать осмысленными. То есть если не знаем как что назвать, просто формулируем что мы хотим сделать (на английском языке), и исходя из этого уже выдумываем названия:

    // calculate sum
    $sum = calculateSum(); 
    // generate report for premium users
    $sum = generateReport(new PremiumUsersSpecification());


    как-то так. Ну а что как, у меня такие правила:

    - константы - SCREAMING_SNAKE_CASE
    - названия объектов - UpperCamelCase
    - названия переменных, методов, функций и т.д. - lowerCamelCase
    - таблички/поля в бд, json, yml - snake_case
    Ответ написан
  • Как может применяться Object Iterator?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сначала разбираемся что такое "итератор", потом открываем доку, там в комментариях даже приводят ваш случай в качесве варианта использования. Ну и потом вообще разные виды итераторов смотрим.
    Ответ написан
  • Как безопасно выполнить исходный код PHP из строки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) изолировать код в песочнице, передавать в качестве аргументов только то что можно юзать (php.net/manual/en/function.create-function.php)
    2) воспользоваться, например, nick/php-parser и удостовериться что не используются штуки типа global
    Ответ написан
  • Чем связать php и java?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    pub/sub на rabbitmq/zeromq/activemq и т.д. Можно конечно RPC организовать но...
    Ответ написан
  • Какой стиль комментирования кода правильнее?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с последовательным объяснением всех действий


    Пишите код так, что бы не нужно было комменты делать для действий, только для отдельных методов. Если вот совсем никак и надо объяснить что делает блок кода - выносим его в приватный метод с адекватным названием. Вот и все.
    Ответ написан
  • Совмещение angular, yii2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Laravel бери и не мудри. Если нет нормального опыта работы с javascript (jquery не считается) - лучше не брать angular. Лучше погоди чутка пока не релизнится ng2, по ng1 слишком много булшита написано, достаточно вопросы на тостере глянуть.

    Но по вопросу "совмещение" - учить надо по отдельности, да и работать это все независимо друг от друга. Ангуляры отдельно, бэкэнды отдельно, между ними rest api. Ну то есть бэкэнды ничего не знают о том на чем написан клиент и наоборот.
    Ответ написан
  • Как использовать шаблоны проектирования на практике?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    зачем они вообще нужны в работе, ведь всё хорошо и без них?


    Видите ли, паттерны это не что-то такое, что "применяют намерянно", они просто появляются. Им просто дали названия и все. Это "словарь", что бы быстро сказать другому разработчику мол "мы тут медиатор впихнем, а сверху вот этой фигни фасадом закроем". И всем сразу все понятно.

    Словом, если вы разберетесь с принципами SOLID и GRASP, а так же в принципе с ООП (сокрытие состояния, обмен сообщениями между объектами разных типов), то паттерны будут появляться сами по себе.

    Еще хорошо себя показывает TDD в вопросах "как узнать как лучше делать". В виде теста описываем что должен делать объект, или как они взаимодействуют, потом делаем. Если неудобно в тестах или они становятся слишком завязаны на реализацию (опять же неудобно поддерживать) - то значит что-то пошло не так и надо рефакторить. А при наличии тестов это делать очень легко и просто.
    Ответ написан
  • Что выбрать для back-end медицинского портала?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Устойчивость - любой мэйнстрим язык

    Читаемость кода - это не имеет отношение к языку или платформе, сделать плохо можно всегда и везде.

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

    Словом... вот что разработчик знает, то и надо брать. Либо опять же на усмотрение разработчика.
    Ответ написан