• Для чего нужны модули?

    ppokrovsky
    @ppokrovsky
    Думаю, что вопрос здесь не про определение модульности в целом, а про модульность в контексте Yii.

    В Yii модуль это мини-приложение, имеющее собственные модели, контроллеры и представления. Модуль не может существовать сам по себе, только в контексте приложения. Модули наследуют от yii\base\Module. Пример модуля - админка к CMS.

    Вот здесь про это хорошо написано
    https://yiiframework.com.ua/ru/doc/guide/2/structu...
    Ответ написан
    1 комментарий
  • Чем плоха авторизация через htaccess?

    ppokrovsky
    @ppokrovsky
    Ничем. При достаточной сложности пароля и шифровании.
    Ответ написан
    Комментировать
  • Как правильно организовать мультиязычность в Yii2?

    ppokrovsky
    @ppokrovsky
    Правильно создать абстракцию от языка, которая не будет изменяться. Английский исходник как вариант.
    Ответ написан
    Комментировать
  • Запрос в Яндекс Метрику ecommerce c параметрами оплаченного заказа через curl?

    ppokrovsky
    @ppokrovsky
    Если я правильно понимаю, то кейс "пользователь может не зайти на сайт вновь" возникает при оплате картой, когда после эквайринга. В таком случае я бы сделал так:
    в браузере посмотрел что куда отправляется в Метрику;
    по коллбэку из эквайринга дергал бы Метрику курлом.
    Ответ написан
  • Как правильно сделать сессии и авторизацию на PHP?

    ppokrovsky
    @ppokrovsky
    Оба подхода не очень хорошие, так как смешивают логику аутентификации пользователя с логикой протоколирования событий. Условно у вас есть 3 модели: User, Session и UserLog.
    Связь UserLog и Session опосредованная через User. Такой подход позволит вам а) организовать хранение сессий в виде "1 пользователь - 1 кука", б) даже если у пользователя умерла кука и ему выдалась новая, вы сохраняете историю пользователя, тк UserLog привязана к User через внешний ключ.
    Ответ написан
    Комментировать
  • Почему на production не рекомендуют использовать систему контроля версий?

    ppokrovsky
    @ppokrovsky
    Нет такого, что рекомендуют или не рекомендуют. Все зависит от вашего проекта. Те доводы, которые здесь перечислены насчет CI итд - правильные. Дополнительным аргументом в пользу deploy-скриптов может быть, например, необходимость изменения схемы БД на проде с очередным апдейтом, чего git не сделает сам по себе. Плюс, обновление через git - не очень рабочий вариант в случае компилируемого кода. Конечно, можно навернуть поверх гита каких-нибудь билдеров, но этому уже точно на проде не место.

    Но если, например, проект простой, компилируемого кода нет, и в команде есть договоренность о том, что в master попадает только протестированный код, то никакого криминала в том, чтобы сделать git pull, нет.
    Ответ написан
    Комментировать
  • Как правильно работать с базой данных yii2?

    ppokrovsky
    @ppokrovsky
    Было бы лучше описать, какую конкретно задачу пытаетесь решить.

    Если задача при создании БД создать записи (например дефолтного пользователя), то insert можно использовать в миграциях, например:

    public function up()
        {
            $this->createTable('{{%mymodel}}', [
                'id' => $this->primaryKey(),
                'name' => $this->string(128)->notNull(),
            ], 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB');
            $this->insert('{{%mymodel}}', [
                'name' => 'modelName',
            ]);
            $this->insert('{{%mymodel}}', [
                'name' => 'anotherModelName',
            ]);
        }


    Если нужно наполнить базу тестовым контентом, можно использовать фикстуры (fixtures).
    Ответ написан
  • Как тестировать методы, создающие объекты других классов?

    ppokrovsky
    @ppokrovsky
    Не следует инициализировать объект Bar в методе someMethod, вместо этого следует использовать паттерн Dependency Injection. Так во-первых создается меньше зависимостей, во-вторых такую конструкцию проще тестировать: в юнит-тесте Вы просто добавляете мок Bar через инъекцию. Я лично в Yii2 предпочитаю инъекцию через конструктор, но это скорее дело вкуса.

    Собственно говоря matperez ровно этот паттерн и реализовал.
    Ответ написан
    Комментировать
  • Согласно MVC, как рекомендуется управлять сессиями?

    ppokrovsky
    @ppokrovsky
    MVC тут не при чем.

    session_start() помещен в начало так как выставление HTTP-заголовков, втч кук должно происходить до генераци контента.
    Ответ написан
    Комментировать
  • Yii2: Как выполнить добавление в одну таблицу с включенным режимом транзакции?

    ppokrovsky
    @ppokrovsky
    Конструкция try-catch предполагает, что в блоке try одна из операций может бросить исключение, которое будет обработано блоком catch. В Вашем коде ни одна из операций явно не бросает исключение, поэтому перехода к catch не происходит.

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

    В Вашем случае не очень понятно, для чего реализуется транзакционность.
    Ответ написан
  • Как грамотно и безопасно использовать сессии в связке с cookies?

    ppokrovsky
    @ppokrovsky
    Не нужно распыляться на полутора человек пользователей с дисковыми телефонами или текстовыми браузерами. В одной крупной интернет-компании действует общее правило, что браузеры с < 1% суточной аудитории не поддерживаются. В абсолютных числах это тысячи посетителей в сутки - от них сознательно отказываются чтобы сфокусироваться на массовой аудитории. ID сессий в коде или урле это очень-очень плохо, так как кроме явно костыльного решения, это чревато попаданием сессий например в поисковый индекс со всеми вытекающими
    Ответ написан
    Комментировать
  • Подскажи лучшую книгу по php самую обеьмную по информации с Учетом ООП и общих тем ??

    ppokrovsky
    @ppokrovsky
    www.apress.com/9781430260318

    PHP Objects, Patterns, and Practice
    4th Edition
    By Matt Zandstra

    Он использует странный синтаксис местами, но я считаю это одной из лучших книг по ООП в PHP потому что там проведены параллели с GoF.
    Ответ написан
    Комментировать
  • PHP/Yii2 как правильно обрабатывать исключения?

    ppokrovsky
    @ppokrovsky
    ErrorException используется например когда нужно превратить сообщение об ошибке в PHP в исключение
    см set_error_handler
    Ответ написан
    Комментировать
  • Как работает MVC controller?

    ppokrovsky
    @ppokrovsky
    Ответственность контроллера в MVC:
    1. Получение параметров из представления (GET/POST итд) и передача их в модель
    2. Возврат представления с параметрами, полученными из модели
    3. Валидация и фильтрация параметров в обе стороны
    4. Контроль доступа на основании правил, заложенных в модели

    То есть контроллер - это посредник между представлением и моделью. Контроллер по возможности не должен содержать бизнес-логику. Представление по возможности не должно вызывать методы модели напрямую, модель gо возможности не должна содержать примеси представления (HTML) и возвращать представление. "По возможности" - так как не всегда это возможно/оправдано с точки зрения трудозатрат разработки.

    Общее правило: тонкий контроллер и толстая модель.

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


    Специфика веб-приложений в том, что на каждый запрос клиента создается новый экземпляр приложения, так как HTTP(S) - протокол без сохранения состояния (stateless).
    Для всех клиентов существует один общий класс контроллера (class myController), но на каждый запрос каждый клиент получает собственный экземпляр контроллера (new myController)

    если один пользователь запросит экшен1, а второй пользователь после этого запросит экшен2 - не может ли он получить значение "9"?


    нет, второй пользователь получит 5, так как взаимодействует с собственным экземпляром контроллера.
    Ответ написан
    2 комментария
  • Каковы Ваши доводы за неиспользование транслита в коде?

    ppokrovsky
    @ppokrovsky
    Код пишется не для удобства одного разработчика, а для того чтобы реализовывать бизнес-задачи. Рефакторинг и простота поддержки кода это бизнес-задача. Соглашением является именование методов и переменных на английском, так как, как выше уже сказали, такие названия органично смотрятся при чтении кода. Равно как завтра, например, код может пойти на международный рынок и разработка окажется за рубежом. Нерусскоязычный разработчик не сможет работать с таким кодом.

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

    Мне кажется здесь нужно поставить вопрос ребром - никакие супер-компетенции не должны идти на поводу прихотей. В крайнем случае если разработчик сверхчеловек - отправьте его на курсы языка.
    Ответ написан
    Комментировать
  • Почему не работает xDebug в phpStorm 8?

    ppokrovsky
    @ppokrovsky
    параметры в php.ini

    [xdebug]
    zend_extension=xdebug.so
    xdebug.remote_enable=true
    xdebug.remote_handler=dbgp
    xdebug.remote_host=192.168.0.92
    xdebug.remote_autostart=true
    xdebug.profiler_enable_trigger=true


    в такой конфигурации интерпретатор при запуске запускает дебаггер, тот отправляет на remote_host:9000 сообщения. В PHPStorm включаете слушалку, выше показали как.

    Последний параметр нужен чтобы профайлер автоматом не взлетал.
    Ответ написан
    Комментировать
  • Стоит ли связываться с Docker?

    ppokrovsky
    @ppokrovsky
    Разверните стенд, попробуйте. Пока не пощупаете руками - не поймете.
    Ответ написан
    Комментировать
  • Как сделать post запрос с передачей параметров в виде json?

    ppokrovsky
    @ppokrovsky
    Либо внешней библиотекой, либо параметрами в Curl

    curl -H "Content-Type: application/json" -X POST -d '{"locale":"ru","method":"GetCampaignsList", "param":"параметры метода"}' https://api.direct.yandex.ru/v4/json
    Ответ написан
    Комментировать