Ответы пользователя по тегу Yii
  • Для чего нужны модули?

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

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

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

    ppokrovsky
    @ppokrovsky
    Правильно создать абстракцию от языка, которая не будет изменяться. Английский исходник как вариант.
    Ответ написан
    Комментировать
  • Как правильно работать с базой данных 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 ровно этот паттерн и реализовал.
    Ответ написан
    Комментировать
  • Yii2: Как выполнить добавление в одну таблицу с включенным режимом транзакции?

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

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

    В Вашем случае не очень понятно, для чего реализуется транзакционность.
    Ответ написан
  • 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 комментария
  • Как сделать 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
    Ответ написан
    Комментировать
  • Где сохранять изображения, чтобы они были доступны из backend и frontend?

    ppokrovsky
    @ppokrovsky
    Симлинки не самое удачное решение имхо, тк привязка к операционной системе. Т.е. в других условиях (другая ОС) такой код не взлетит. И на уровне yii лучше тоже этого не делать, так как концепция шаблона advanced - три приложения с общим codebase, но различным контентом.

    Оптимально настраивать конфигурацией веб-сервера. Сохраняйте все в frontend или в backend, затем на уровне конфига веб-сервера прописывайте пути и алиасы.

    Вот здесь я приложил пример конфига nginx для похожей задачки
    stackoverflow.com/a/30999482/472203
    Ответ написан
  • Как сделать что бы некоторые таблицы перед стартом тестов очищались в Codecption (yii)?

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

    Для меня юнит-тесты, в которых много операций с БД, это запашок.

    Но если так уж хочется - то можно либо в tearDown вызывать очистку всех созданных данных через deleteAll(), либо пользоваться фикстурами (см ActiveFixture), либо каждый раз загружать дамп базы (см unit.suite.yml)
    Ответ написан
    Комментировать
  • Почему codeception не видит temporary table?

    ppokrovsky
    @ppokrovsky
    Если речь про Yii2, Codeception для подключения БД наследует конфиг Yii, переопределяя только dsn (имя тестовой базы, см tests/codeception/config/config.php). В таком случае самое простое - воткнуться дебаггером после CREATE TEMPORARY TABLE и посмотреть, где создается таблица.
    Ответ написан
    Комментировать