• Как записать emoji в mysql?

    sggr
    @sggr
    PHP, Ruby, GO
    Используйте кодировку utf8mb4 для полей в которых могут быть emoji
    Ответ написан
    Комментировать
  • Где в Symfony 3 объявлять глобальные функции(heplers)?

    sggr
    @sggr
    PHP, Ruby, GO
    Пишу полноценный ответ, как это должно быть в Symfony. Не пытайтесь переносить практики других фрейморков типо Yii и Laravel на Symfony, это разные продукты для разных целей.
    В идеологии Symfony нет понятия хелпер как в Yii, ROR, Laravel. Вам необходимо объединить часто используемые функции в Service(называть это можно как угодно) по характеру функционала, поместить это в DI контейнер и инжектить в те классы в котором нужен этот сгруппированный функционал.
    И задумайтесь, если у вас есть такие классы хелперы, которые используются направо и налево - значит вы промахнулись с архитектурным решением. Один класс одна обязанность. Понимание SOLID и практика поможет вам выйти на другой уровень объектного проектирования и разработки в целом.
    Ответ написан
    7 комментариев
  • Как закоммитить часть файлов в master бранч, а часть в отдельный бранч?

    sggr
    @sggr
    PHP, Ruby, GO
    git stash - для вас
    Ответ написан
    Комментировать
  • Как правильно использовать Guzzle?

    sggr
    @sggr
    PHP, Ruby, GO
    $this->client = new GuzzleHttp\Client(['base_uri' => AC_URL]);
    ...
    public function send($data) {
      $response = $this->client->request('POST', AC_URL, ['json' => $data]);
      return (array)json_decode($response->getBody()->getContents());
    }
    Ответ написан
    Комментировать
  • Как правильно сделать связь 1:M в агрегате при использовании DDD?

    sggr
    @sggr
    PHP, Ruby, GO
    Зачем вам interger? Зачем вам в конструктор передовать ID? Это DDD, вы работаете с объектами и их поведением, а не со свойствами объектов.
    То есть
    <?php
    class Violation
    {
        private $id;
        private $rules;
        public function __construct(ViolationID $vid, array $rules = []) {
            $this->id = $vid;
            $rules = $rules;
        }
        
        public function addRule(Rule $rule) {
            $this->rules[] = $rule;
            return $this;
        }
    
        public function deleteRule(Rule $rile)...
        public function getRules()...
        ...
    }
    
    class Rule
    {
        private $id;
        private $violation;
        public function __construct(RuleID $rid, Violation $violation) {
            $this->id = $rid;
            $this->violation = $violation;
        }
        ...
    }


    Проблем с маппингом никаких быть не должно, приведу пример в yaml и рекомендую при использовании DDD и доктрины использовать external mapping.

    Core\Violation:
      type: entity
      table: violation
      repositoryClass: InfrastructureBundle\Repository\PersistViolationRepository
      oneToMany:
        rules:
          cascade: [ "persist", "remove" ]
          targetEntity: Core\Rule
          mappedBy: violation
          orphanRemoval: true
    
    Core\Rule:
      type: entity
      table: rule
      repositoryClass: InfrastructureBundle\Repository\PersistRuleRepository
      manyToOne:
        violation:
          targetEntity: Core\Violation
          inversedBy: rules
          joinColumn:
            name: violation_id
            referencedColumnName: id


    UPD: Я плясал от того что одно нарушение содержит в себе несколько правил. Как я понял у вас наоборот, но сути это не меняет.
    Ответ написан
  • Как использовать интерфейс в DI Symfony 3?

    sggr
    @sggr
    PHP, Ruby, GO
    Очевидно AppBundle\Infrastructure\Persistence\ShipRepository не имплементит IShipRepository.
    Ответ написан
  • Как правильно вести разразработку в PhpStorm?

    sggr
    @sggr
    PHP, Ruby, GO
    Tools->Deployment->Options
    Выставляете галочку на Prompt when overr.....
    Выставляете Automatic Upload в Tools->Deployment
    В итоге после смены ветки/генерации кода/тдтп - изменения отправляются на сервер.

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

    В остальных случаях:
    Никогда не загрязняйте свою хост машину. Используйте vagrant + любой devops софт. Самое простое использовать puphpet. Используйте vcs(git/svn/mercurial), для контроля версий приложения.
    Деплоить можно по разному, тут кто на что горазд, от сборки на локальной тачке и заливке через scp до CI(gitlab, capistrano, jenkins), это тема другого вопроса.

    PS: также, если вы разрабатываете не на винде(лучше сразу отвыкайте), то можно смонтировать nfs директорию, которая будет автоматом подгружать ваши изменения, но уже на уровне операционной системы, а не IDE.

    UPD: d3e6b0993ce2438a8e419ecb9c22b161.png

    UPD2: Под разработкой на сервере я подразумевал девелоперский сервер\контейнер.
    UPD3: Upload External Changes должен выгружать изменения с сервера, но помоему он у меня не заработал по ssh, точно не помню, можете попробовать =)
    Ответ написан
    7 комментариев
  • Как связать 2 сущности?

    sggr
    @sggr
    PHP, Ruby, GO
    PS: Я не хочу как-то закидать Yii какахами, поэтому подчеркиваю - нужно выбирать инструмент реализации исходя из потребностей.

    Вы не сможете полноценно применять DDD в Yii. Потому что Yii не способен на это =) (способен, но нужно допиливать).

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

    При использовании DDD вам просто необходимы конструкторы, объект не может быть создан если не указаны все его параметры. И за это должен отвечать не какой-то там валидатор или база или сеттеры, за это должен отвечать конструктор!

    Объект предметной области не может маппиться на базу внутри этого объекта - это уже часть реализации. Это нарушает букву S в такой штуке как SOLID =)

    В Yii по факту не получится разбить приложение на слои Domain layer, Persistance Layer, Application (Service) Layer, View Layer. Из за модульной архитектуры. Можно допилить, но зачем?

    Нужно отказываться от Active Record полностью, ставить доктрину или писать свои мапперы в Persistance Layer, что геморойно.

    Ну и вывод:
    Вообще Yii сам по себе очень простой фреймворк для простых задач, для прототипирования, для приложений с коротким циклом поддержки, в котором использование ERP практик из коробки невозможно. При этом я не отрицаю, что на нем можно написать большое приложение и может быть (здесь я не уверен), вы сможете его поддерживать долгое время. Сильная связанность всех компонентов, ActiveRecord, убогий DI контейнер (может что-то поменялось, но в 1ых версиях Yii2 он был реально убогий) и тдтп. Почитайте про объектно-ориентированный дизайн, про SOLID, вникните и еще раз взгляните на свой код на Yii. И если вам реально необходим DDD, посмотрите на более подходящие решения - Symfony, Zend.

    По конкретно вашей задаче нужно больше информации. Что за манипуляции вы хотите с ними производить, насколько пользователи отличаются друг от друга, сами объекты, являются ли они наследниками по принципу Liskov. Что за код, который может работать и с тем и с другим. Зависит ли этот код от реализации или он использует только объекты предметной области.
    Ответ написан
  • Какие есть нюансы выбора хостинга для фото-проекта?

    sggr
    @sggr
    PHP, Ruby, GO
    CDN закроет все ваши потребности в будущем. Обеспечат вам и кеширование и скорость канала. Но нужен он только если вы генерируете реально много статичного контента и быстрый доступ к нему нужен из всех мест галактики.
    Для старта обычно хватает VPS с железом под вашу нагрузку и нормально настроенного nginx на фронте с кешированием статики.
    Решайте проблемы по их появлению, используйте мониторинг, делайте вашу систему горизонтально расширяемой и будет вам счастье =)
    Ответ написан
    5 комментариев
  • Вывод php в HTML файлах?

    sggr
    @sggr
    PHP, Ruby, GO
    Теги указывают интерпретатору где собственно находится php код. Остальной код пропускается.
    То есть, интерпретатор идет по коду находит один из открывающих тегов и обрабатывает его пока не встретит закрывающий, потом повторяет.
    Пояснения SharuPoNemnogu не буду повторять =)
    Ответ написан
    Комментировать
  • Phpmyadmin не хватает mbstring, что делать?

    sggr
    @sggr
    PHP, Ruby, GO
    Для консоли и для nginx(apache) используются разные конфиги php. Проверь конфиг в /etc/php/fpm/conf.d(если стоит fpm).
    mods-available это директория где хранятся конфиги для доступных экстеншенов, но не факт что они включены, смотреть нужно также в conf.d директориях php. Если его там нет, то делай в conf.d симлинку, ln -s /etc/php/mods-available/mbstring.ini /etc/php/fpm/conf.d/20-mbstring.ini и ребутай fpm.
    Ответ написан
    Комментировать
  • Как сделать добавление записи и её обновление в одной форме?

    sggr
    @sggr
    PHP, Ruby, GO
    Создаете\находите модель в контроллере
    Передаете модель во create\update view, в зависимости от action
    В create\update view, используете echo $this->renderPartial('_form', array('model'=>$model)), передавая модель во вьюшку формы
    Во вьюшке формы должен находится сам код формы, работающий с моделью + определенная простая логика отображения, в зависимости от того новая это сущность или уже существующая. Например, название кнопки $model->isNewRecord ? 'Create' : 'Save'
    Ответ написан
  • Куда делегировать функции, которые являются частью контроллера, но слишком велики, чтоб оставлять их там?

    sggr
    @sggr
    PHP, Ruby, GO
    Контроллер не должен в себе содержать логики, кроме извлечения вводимых пользователем данных, его обработки с помощью сервисов или моделей (на самом деле тут может быть какой угодно слой, вариантов масса) и ответа. В вашем случае есть два популярных подхода к решению задачи:
    • MVC - логика здесь будет находится в основном в модели. Достаточно простой и очевидный способ для новичков в ООП.
    • SOA (ссылка не очень удачная, но думаю смысл должен быть понятен) - способ для более опытных разработчиков, но и более гибкий и востребованный в больших приложениях со значительным сроком разработки и поддержки.

    Для SOA вам действительно необходим будет DependencyInjection Container (или ServiceLocator), который новичкам достаточно сложно освоить. В MVC подходе все намного проще и очевиднее, поэтому рекомендую сначала попробовать его, а потом, когда упретесь в толстые модели, переходить к SOA и использовать сервисный слой.
    Ответ написан
    6 комментариев
  • Объеденить массивы в строку, как?

    sggr
    @sggr
    PHP, Ruby, GO
    Ответ написан
    Комментировать
  • Как организовать передачу данных между двумя представлениями Angular?

    sggr
    @sggr
    PHP, Ruby, GO
    Все что имеет отношение в общем к приложению или больше, чем к одному контроллеру выносите в сервисы.

    Думаю, ответ как это сделать Вы найдете вот здесь jsfiddle.net/b2fCE/1
    Ответ написан
    Комментировать