Задать вопрос
  • Как лучше спроектировать диапазон дат с даты А до даты Б, при условии что дата Б может ещё не начаться?

    Astatroth
    @Astatroth
    Я тут случайно
    Два поля, поле Б по-умолчанию NULL.
    Ответ написан
    Комментировать
  • Как лучше поступать при ошибке mysql?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Зависит от типа ошибки и логики приложения.
    Главное - не "глушить" ошибку совсем.
    Если её можно обработать (например, нет искомой строки, но есть дефолтное значение), то нужно это сделать и залогировать исключительную ситуацию.
    Если обработать ошибку нельзя, то лучше упасть. Чем раньше приложение упадёт, тем проще будет отловить и исправить проблему (в идеале, все подобные падения произойдут на стадии тестирования и приёмки и эти баги не доедут до пользователя).
    Ответ написан
    3 комментария
  • Как узнать время последнего обновления данных в строке MYSQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Добавить поле `dataChangeTime` и менять его триггером BEFORE UPDATE только если NEW.`data` не совпадает с OLD.`data`
    Ответ написан
    8 комментариев
  • Как подключить mysql и mongodb базы данных в yii2 одновремено?

    Steein
    @Steein
    Программист
    'components' => [
        'dbMySQL' => [
            'class' => '\yii\db\Connection',
            'dsn' => 'mysql:...',
            'username' => '...',
            'password' => '...',
            'charset' => 'utf8',
        ],
        'dbMongo' => [
            'class' => '\yii\mongodb\Connection',
            'dsn' => 'mongodb://...',
        ],
    ],


    Yii::$app->dbMySQL->...
    Yii::$app->dbMongo->...


    Не забудьте переопределить getDb() в \yii\db\ActiveRecord и \yii\mongodb\ActiveRecord классов, чтобы указать на эти компоненты, если вы используете ActiveRecords.
    Ответ написан
    9 комментариев
  • Есть ли примеры пополярных систем грамотных по архитектуре на php?

    Stalker_RED
    @Stalker_RED
    Грамотная архитектура, это не то-же самое, что затолкать в проект все модные аббревиатуры не глядя на то, нужны ли они.
    В symfony еще с первых версий есть модульность, и, местами di. Они обсуждают SOLID на конференциях и постепенно движутся в этом направлении, хотя еще не полностью "пришли".
    А хайп по микросервисам разве еще не поутих? На практике, далеко не всё подряд стоит выносить в сервисы.

    В целом да, стоит покопаться внутри symfony или laravel, потому что они одни из лучших опенсорцных фреймворков. Но не стоит ожидать, что они будут использовать все подряд баззворды раскрученные за последние надцать лет.
    Ответ написан
    Комментировать
  • Как можно использовать свойство data класса yii\rbac\Item?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Я не юзал данное чудо свойство, но Вы меня заинтересовали, полез в ядро и накопал следующее:
    В yii\rbac\DbManager есть метод addItem
    /**
         * @inheritdoc
         */
        protected function addItem($item)
        {
            $time = time();
            if ($item->createdAt === null) {
                $item->createdAt = $time;
            }
            if ($item->updatedAt === null) {
                $item->updatedAt = $time;
            }
            $this->db->createCommand()
                ->insert($this->itemTable, [
                    'name' => $item->name,
                    'type' => $item->type,
                    'description' => $item->description,
                    'rule_name' => $item->ruleName,
                    'data' => $item->data === null ? null : serialize($item->data),
                    'created_at' => $item->createdAt,
                    'updated_at' => $item->updatedAt,
                ])->execute();
    
            $this->invalidateCache();
    
            return true;
        }

    А значит при создании любой item, а это может быть роли или правило, можно к ней прикрепить произвольные данные. Например:
    $role = Yii::$app->authManager->createRole('admin');
    $role->description = 'Администратор';
    $role->data = ['roleColor'=>'#fff', 'razmer_sisek'=>5];
    Yii::$app->authManager->add($role);

    Что бы потом юзать, например для смены фона или более полезных вещей. Пока не пробовал, но должно работать. Как-то так:
    <?php
    $role = Yii::$app->authManager->get('admin');
    $bgcolor = $role->data['roleColor'];
    ?>
    <body style="background-color:<?=$bgcolor?>;">
    Ответ написан
    3 комментария
  • Как сделать скрытым список, когда выбирают 0 value?

    @masterfreelance
    программист со стажем
    При выборе "пустого" значения наверное возвращается 0 options.
    Сделайте проверку $("select[id=signupform-city] option").size(); Если 0 оставляйте disabled
    $('#signupform-region').change(function(){
      if ($("select[id=signupform-city] option").size() != 0) {
        $('#signupform-city').prop('disabled',false);
      } else {
        $('#signupform-city').prop('disabled','disabled');
      } 
    });
    Ответ написан
    Комментировать
  • Почему не работает авторизации на yii2?

    @miserenkov
    Middle PHP Developer
    Yii2 по умолчанию не использует алгоритмы md5 и sha1.
    Сгененируйте пароль используя метод фреймворка
    Yii::$app->security->generatePasswordHash('you password');
    Ответ написан
    Комментировать
  • Почему Yii возвращает string вместо integer?

    shakatakas
    @shakatakas
    So so developer
    Ответ написан
    Комментировать
  • Почему не вызывается метод поведения?

    mitaichik
    @mitaichik
    Потому что строка $model=Firmcat::find()->with('image')->all(); Выбирает вам массив моделей, а не конкретную модель, у которой можно вызвать метод.
    Ответ написан
    Комментировать
  • Как сохранить в mysql таким образом и сделать выборку?

    Как вариант: завести каждому товару уникальный идентификатор, завести таблицу product_categories в которой хранить id товара и id категории и выборку делать как-то так
    select * from "product_categories" where "category_id"=100500;
    Ответ написан
    Комментировать
  • Паттерны проектирования?

    @vkdv
    Паттерны - это реальные инструменты, позволяющие добиться реализации концепции объектно-ориентированного проектирования и принципов SOLID

    Ссылка на SOLID

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

    Один из наиболее часто встречающихся мне примеров, это пример принципа "Принцип открытости/закрытости" , когда класс - описывающий некую сущность(например модель комментария) , описывает только свои базовые назначения( создание, удаление, редактирование), при этом такие механизмы, как модерация, прикрепление файлов, лайки , реализуется другими классами и "прикручиваются" к классу моделей через интерфейсы и наследование/ трейты / примеси

    При этом :
    1) Никак не изменяется код класса "Комментарий" (кроме подключения интерфейса) и в будущем мы добавляем поведения без изменения класса + стабильность системы, гибкость
    2) Каждый класс имеет свое четкое назначение + легкость модификации, порядок
    3) Комментарии наследуют некоторое поведение, путем подключения поведения, но также могут поступать любые другие классы - сущности (посты, блоги итп) , то есть интерфейс и реализация лайков универсальна, и весь функционал работы лайков находится только (строго!!!) в одном месте + легкость модификации, Универсальность, стабильность, интуитивная понятность

    Из википедии :

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

    Оттуда же про SOLID

    Избавиться от "признаков плохого проекта"[4] помогают следующие пять принципов SOLID:

    Принцип единственной ответственности (The Single Responsibility Principle)
    Существует лишь одна причина, приводящая к появлению класса.

    Принцип открытости/закрытости (The Open Closed Principle)
    «программные сущности … должны быть открыты для расширения, но закрыты для модификации.»

    Принцип подстановки Барбары Лисков (The Liskov Substitution Principle)
    «объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.»

    Принцип разделения интерфейса (The Interface Segregation Principle)
    «много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»

    Принцип инверсии зависимостей (The Dependency Inversion Principle)
    «Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»
    Ответ написан
    2 комментария
  • В чем преимущество триггеров в такой ситуации?

    Caravus
    @Caravus
    DevOps
    Причём тут триггеры? Почему не ключи?
    Ответ написан
    Комментировать
  • Когда Вы пишете документацию к проекту?

    webinar
    @webinar Куратор тега Веб-разработка
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Документация не только для галочки, но и Вам в помощь, а значит второй вариант просто идиотизм. Если проект большой, к моменту его окончания Вы просто хрен вспомните что тот или иной метод делает. Так что только первый вариант. Второй допустим, если это очень маленький проект и документация тупо для галки.
    Я уже молчу, что правильная документация и современная IDE помогают в процессе тупо автокомплитами и быстрой навигацией.
    Ответ написан
    Комментировать
  • Сколько может быть значений во WHERE IN()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В MySQL есть ограничение на максимальную длину запроса, определяется переменной max_allowed_packet.
    А зачем в этом запросе IN, не проще сразу сделать JOIN с таблицей подписок?
    Ответ написан
    1 комментарий
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    AnisimovAM
    @AnisimovAM
    Программист
    Doctrine 2 очень даже хороший инструмент.

    Я бы вам порекомендовал использовать фреймворк Symfony 3. На PhpStorm поставить плагин Symfony plugin и PHP annotations.
    Ответ написан
    7 комментариев
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    @xfg
    Любой фреймворк с инверсией зависимостей подойдет. На Symfony и Yii2 точно можно сделать. На русскоязычном форуме Yii по теме DDD очень много обсуждений. Но если не увидели единого согласия по DDD, то скорее всего не читали книгу Эванса или Вернона. Если так, то лучше начать с кого-нибудь из них.

    Многоуровневая архитектура рассказывает нам о слоях presentation, application, domain и infrastructure. С однонаправленным потоком данных. Нижестоящий слой, никогда не должен вызывать вышестоящий. Это значит, что к примеру можно выбросить presentation слой и не придется ничего изменять в оставшихся 3.

    Фактически выходит, что в любой момент можно выбросить фреймворк и заменить другим, так как это presentation layer в многоуровневой архитектуре. Можно даже сначала написать application/domain, проверить их юнит-тестами, а только потом уже задуматься о фреймворке. Application/domain слои никогда ни при каких обстоятельствах не должны вызывать методы фреймворка. Контроллеры фреймворка работают с доменной моделью, через вызовы методов application layer.

    Соответственно, при миграции на другой фреймворк, всё что потребуется, это переписать контроллеры (методы очень простые 1-5 строк) и реализации классов в infrastructure layer если вы завязывали их на фреймворк. Хотя лично я бы, не советовал этого делать. Лучше найти/написать отдельные библиотеки/компоненты под инфраструктурный слой, тем самым облегчив себе жизнь в будущем, когда фреймворк умрет или при очередном релизе мажорной версии.

    Symfony под DDD наилучший выбор, он компонентный, можно подтянуть только то, что нужно. С другой стороны Yii2, он монолитный и вы затяните Active Record и кучу всего еще, чем не будете пользоваться, но джуниор придет и обязательно понавызывает AR или чего-нибудь еще в application/domain слоях, чего вы явно не ожидаете. Поэтому в случае с Yii2 нужен будет тотальный контроль. :)

    Про Laravel не пишу ничего, так как не работал с ним. Но судя по беглому просмотру документации, никаких проблем сделать на нем DDD также нет.
    Ответ написан
    4 комментария
  • PHP: mkdir, почему permission denied при 0777?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    В этой ошибке указано, что php скрипт, расположенный тут:
    /var/www/www-root/data/www/xndaasdqfjqwm7b.xn--p1ai/vendor/yiisoft/yii2/helpers/BaseFileHelper.php
    видимо пытается создать папку ( mkdir() line 488)

    Так какой именно папке вы права задаете?
    Посмотрите в коде/логах, какую папку он пытается создать и где и вот там уже и назначайте права.
    Ответ написан
    Комментировать
  • Какие данные хранит в себе $app->user->identity?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Например так, поле money
    echo Yii::$app->user->identity->money;
    Но лучше в таблице оставить данные для авторизации, токенов и прочей служебной информации, а подробную информацию о пользователе вынести в другую таблицу, назвать её, например, profile и связать с первой таблицей по id пользователя.
    В модели Profile
    public function getUser()
    {
      return $this->hasOne(User::className(), ['id' => 'id_user']);
    }

    В модели User
    public function getProfile()
    {
      return $this->hasOne(Profile::className(), ['id_user' => 'id']);
    }

    Подробней о связях между моделями здесь
    Ответ написан
    Комментировать
  • Что я делаю не так?

    DevMan
    @DevMan
    пропиши 127.0.0.1 вместо localhost.
    Ответ написан
    9 комментариев