• Пошаговое создание бандла для Symfony 4
    0
    тем более, что они автоматом ставятся в любой проект, который использует Symfony 4

    Речь идет о новых проектах, использующих flex. Если кто-то обновил свое приложение с 3.4 до 4 и захочет поставить ваш бандл, он очень не обрадуется появившемуся flex, который внезапно переопределит все конфиги :)


    а вот sensio/framework-extra-bundle тут действительно нужен. Он необходим для роутинга через аннотации.

    Не рекомендуется использовать такого рода "магию" в бандлах. Равно как и использование автовайринга и автоконфигрирования: Best Practices for Reusable Bundles


    Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly.
  • Пошаговое создание бандла для Symfony 4
    +3

    Раздел с созданием скелета бандла — спорный. Гораздо проще использовать стандартный composer init, т.к. в вашем случае удалить придется гораздо больше, чем создать. К тому же вы добавляете лишние зависимости (по сути бандл должен зависеть только от symfony/framework-bundle, как минимум symfony/flex, sensio/framework-extra-bundle и symfony/lts — лишние)


    Ну а в остальном создание ничем не отличается от других версий Symfony

  • Пошаговое создание бандла для Symfony 4
    +2
    Вместо `CompiledPass` проще использовать `!tagged`: symfony.com/blog/new-in-symfony-3-4-simpler-injection-of-tagged-services
  • PHP 8: чего ждать. Письмо Зеева Сураски
    0
    Мне кажется они там придумывают новые слои абстракции совершенно не задумываясь нужно ли это комуто вообще.

    А можете пример привести? По-моему конечного пользователя все эти абстракции не касаются

  • Shopkeeper 4.0 — Интернет-магазин на Symfony + Angular + MongoDB
    +1

    От autoescape можно избавиться


    {% autoescape false %}
        {{ renderOutputTypeChunk(currentPage, fields, 'header', 'page_') }}
    {% endautoescape %}

    https://twig.symfony.com/doc/2.x/advanced.html#automatic-escaping


    new TwigFunction('renderOutputTypeChunk', [$this, 'renderOutputTypeChunkFunction'], [
        'is_safe' => ['html'],
    ]),

    Чтобы получать инстанс twig вместо передачи контейнера лучше


    new TwigFunction('renderOutputTypeChunk', [$this, 'renderOutputTypeChunkFunction'], [
        'needs_environment' => true,
    ]),

    Тогда он будет передаваться первым параметром:


    public function renderOutputTypeChunkFunction(\Twig_Environment $environment, $itemData, $fieldsData, $chunkName, $chunkNamePrefix = '')
    {
  • Роскомнадзор, кажется, разделил выгрузку на две части для конспирации
    0
    Не обязательно иметь ключи шифрования, чтобы получить доступ к переписке
  • Простое объяснение принципов SOLID
    0
    Забавно вы выбираете цитаты :)
    > Во-вторых, если сервису нужно что-то декодировать или интерпретировать, то это тоже дополнительная отвественность

    Но сервис _в любом случае_ эту ответственность несет. Не может не нести.

    А ответ на самую интересную часть так и не дали:
    не говоря о возможных дополнительных зависмостях типа json-декодера.

    Как передавать зависимости, которые необходимы для обработки зависимостей, которые, в случае передачи уже сконфигурированных данных не нужны?
  • PHP-Дайджест № 131 (13 – 27 мая 2018)
    0

    Основная проблема — dev-зависимости на проде. В случае, если используется assetic, придется ставить java, для webpacknode.js.


    Мы эту проблему решили в рамках `Capistrano`
        task :webpack_build do
          run_locally do
            execute "./node_modules/.bin/encore production"
          end
        end

    и


      task :upload do
        release_path = fetch(:release_path)
        web_path = fetch(:web_path)
    
        on roles(:web) do
            execute :mkdir, "-pv", "#{release_path}/#{web_path}/build"
            upload! "#{web_path}/build", "#{release_path}/#{web_path}", :recursive => true
        end
      end
  • Внедрение предметно-ориентированного проектирования в PHP
    0

    Судя по источнику перевода, это у автора стиль такой, а не у переводчика

  • Выбираем Yii2 или laravel
    0
    Помельче: хелперы для работы с конфигами, или какими-то данными.

    Что вы под этим имеете в виду?

  • Выбираем Yii2 или laravel
    +1
    Это совсем не то, что делает Yii.
    Laravel тоже так не умеет, на сколько я помню, но его вы почему-то включили в обзор
  • Выбираем Yii2 или laravel
    0

    https://github.com/symfony/website-skeleton/blob/4.0/composer.json


     "require": {
            // ...
            "symfony/webpack-encore-pack": "*",
            // ...
        },
        "require-dev": {
            // ...
            "symfony/maker-bundle": "^1.0",
            // ...
        },
  • Выбираем Yii2 или laravel
    0
    В Симфони есть генератор готовых интерфейсов?

    https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html


    Встроенный удобный сборщик фронтенда как у Ларавел?

    https://symfony.com/doc/current/frontend.html

  • Выбираем Yii2 или laravel
    –1
    Зарегистрировать UserInterface из секьюрити в контейнере, чтобы потом он мог резолвиться через автовайринг или парам резолвинг. Можно сделать, но это оверинжинеринг

    А в чем именно оверинженеринг? Простенькая фэктори + строчка в конфиге


    Symfony\Component\Security\Core\User\UserInterface:
        factory: ['@App\UserProvider', 'get']
  • Используем PHP по назначению
    +4

    <?= — это не short-tag, а алиас на <?php echo, <? — вот short-tag
    http://php.net/manual/ru/language.basic-syntax.phptags.php


    Тег <?= доступен всегда, вне зависимости от настройки short_open_tag.
  • Yii 2.0.14
    +1

    Не рассматриваете вариант выпустить хотфикс, где отключите эту возможность? Все-таки минорный релиз не должен ломать BC

  • Операция «Ы» и новая библиотека ABI
    0

    Попытался поставить, но не заработало. Полагаю, потому что APIURL захардкожен (http://grigorov.com/abi/index.php)

  • Диалоговый телеграм бот на PHP
    0

    У меня в свое время получилось что-то вроде этого: https://github.com/BoShurik/telegram-bot-example. Отличие в том что я запоминаю не только команду, но и данные которые ввел пользователь, т.о. можно, например, заполнить заявку пошагово

  • Диалоговый телеграм бот на PHP
    +1

    Не скажу за автора, но я отказался из-за странной системы команд: невозможно пробросить свои зависимости в конструктор, как следствие — сложно интегрировать с существующим сайтом/приложением. Это больше похоже на фреймворк для создания бота, чем на библиотеку :)

  • Управление зависимостями в PHP
    0

    При вашем подходе все равно придется следить за обновлением безопасности и фиксами ошибок (никто ведь не может быть уверен, что вы выкинули именно ту часть, которая эти ошибки содержит)


    Ну и при подходе с композером никто не заставляет ждать цепочку "issue — fix — tag", всегда можете форкнуть и использовать форк до исправления ошибки.

  • PHP-Дайджест № 119 (10 – 29 октября 2017)
    0

    Зачем хранить пароли в одном файле/файлах, а не в конкретных переменных окружения?
    Хотя бы поэтому: https://twitter.com/o_cee/status/892306836199800836

  • PHP-Дайджест № 119 (10 – 29 октября 2017)
    0
    Всё, что вы должны знать о переменных окружения в PHP:
    Тенденция иметь только одну переменную, как APP_CONFIG_PATH, и читать её через '%env(json:file:APP_CONFIG_PATH)%' для меня выглядит как заново изобретать старый добрый parameters.yml

    Увы но так нельзя. Точнее в этом мало смысла, т.к. у нас будет доступ ко всему конфигу сразу, а не к конкретному ключу
    https://github.com/symfony/symfony/issues/24674#issuecomment-340267955

  • Использование событийной модели в Doctrine 2 + Symfony 3
    0

    kernel.terminate не вызывается в консоле. Конкретно в этом случае это не важно, но если, к примеру, данные будут обновляться по крону из какой-нибудь API, то как тогда?

  • Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx
    +1

    LuaJit на 7 месте с 8 секундами

  • Синглтоны и общие экземпляры
    0
    AwesomeAbility в моем примере далека до God-object, хотя она и правда имеет многовато обязаностей. Но слишком много обязаностей не всегда означатает God-object.

    Если сейчас он таким не является, то в будущем — весьма вероятно, "если вдруг еще понадобится влиять на животных"


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

    DI контейнер. Если говорить о PHP и Symfony в частности, то даже конфигурировать почти не придется. Думаю в других языках есть аналоги.


    Стейт и отображение решил бы так:


    Код
    class Unit
    {
        private $abilites;
    
        public function activateStimPack(EventDispatcher $dispatcher)
        {
            $ability = new StimPackAbility($this, 10 /* seconds */);
            $dispatcher->dispatch(Abilities::STIM_PACK_ACTIVATE, $ability);
        }
    
        public function deactivateStimPacks(EventDispatcher $dispatcher)
        {
            $abilities = $this->getAbilities();
            foreach ($abilities as $ability) {
                $dispatcher->dispatch(Abilities::STIM_PACK_DEACTIVATE, $ability);
            }
        }
    }
    
    class StimPackListener
    {
        public function __construct(EventDispatcher $dispatcher, GameTimer $timer)
        {
    
        }
    
        public function onActivate(StimPackAbility $ability)
        {
            $ability->getUnit()->addAbility($ability);
            // Add other effects
            $timer = $this->timer->tick(function() use ($ability){
                $ability->decSeconds();
    
                if ($ability->getSeconds() == 0) {
                    $this->dispatcher->dispatch(Abilities::STIM_PACK_DEACTIVATE, $ability);
                }
            });
    
            $ability->setTimer($timer);
        }
    
        public function onDeactivate(StimPackAbility $ability)
        {
            $ability->getUnit()->removeAbility($ability);
            // Remove other effects
            $ability->getTimer()->destroy();
        }
    }

    У вас вместо одной супер-абилити будет множество эвентов, которые просто влияют на юнит

    В моем подходе эвент = абилке. Я ее рассматриваю не как объект, а как процесс. В текущем варианте вполне можно их сохранять и выводить.


    Кто отвечает за применение эффектов в вашем подходе? Сама абилка или юнит к которому она добавлена?
    И как активируются AwesomeAbility из вашего предыдущего примера? Ведь по условию ее эффекты распространяются не только на того, кто ее использовал


    На самом деле не претендую на правильность моего подхода. Просто решил посмотреть как он ляжет на вашу задачу. И вроде пока узких мест не вижу.

  • Синглтоны и общие экземпляры
    +1
    Я не совсем понял, как вы предлагаете создавать эту комплексную абилку?

    $this->getEventDispatcher()->dispatch(Ability::AWESOME, new AwesomeAbilityEvent($subject, $target));

    Вместо того, чтобы создать одну AwesomeAbility — создать 5 подабилок? А что это даст?

    Это не пять абилок, это пять обработчиков одной абилки. Таким образом решаем проблему Single Responsibility. В вашем варианте у вас получается God-object

  • Синглтоны и общие экземпляры
    0

    Я бы через Event Dispatcher сделал:


    Как-то так
    <?php
    
    abstract class AbstractAwesomeAbilityListener
    {
        public function __construct(
            GameTime $time, 
            PlayerStorage $storage, 
            GameConfig $config
        )
        {
            // ...
        }
    
        abstract protected function doActivate();
    
        public function onActivate()
        {
            if (!$this->isAllowed()) {
                return;
            }
    
            $this->doActivate();
        }
    
        /**
         * @return bool
         */
        protected function isAllowed()
        {
            // ...
        }
    }
    
    class CrewListener extends AbstractAwesomeAbilityListener
    {
        public function __construct(
            CrewContainer $container, 
            GameTime $time, 
            PlayerStorage $storage, 
            GameConfig $config
        )
        {
            parent::__construct($time, $storage, $config);
    
            // ...
        }
    
        protected function doActivate()
        {
            // ...
        }
    }
    
    class PlantsListener extends AbstractAwesomeAbilityListener
    {
        public function __construct(
            CrewContainer $container, 
            GameTime $time, 
            PlayerStorage $storage, 
            GameConfig $config
        )
        {
            parent::__construct($time, $storage, $config);
    
            // ...
        }
    
        protected function doActivate()
        {
            // ...
        }
    }
    
    class EnemyListener extends AbstractAwesomeAbilityListener
    {
        public function __construct(
            CrewContainer $container, 
            GameTime $time, 
            PlayerStorage $storage, 
            GameConfig $config
        )
        {
            parent::__construct($time, $storage, $config);
    
            // ...
        }
    
        protected function doActivate()
        {
            // ...
        }
    }
  • Вебсокеты на php. Выбираем вебсокет-сервер
    +1

    И тут мы пришли к тому, что вам писал mayorovp. На один слой больше за счет такой вот обертки.
    Либо имеем нарушение принципа единственной ответственности, когда вебсокет сервер у нас еще занимается парсингом вывода и перезапуском упавших процессов.

  • Вебсокеты на php. Выбираем вебсокет-сервер
    0
    Мне кажется или мы про Яблоки vs. Апельсины? :)

    Весьма вероятно :)


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

  • Вебсокеты на php. Выбираем вебсокет-сервер
    +1

    Надо сказать, что минусы применимы и к вашему методу :)


    • Дополнительная теория (реализация очень близка к моей)
    • Надо знать как пользоваться React\ChildProcess\Process
  • Вебсокеты на php. Выбираем вебсокет-сервер
  • «Runn Me!» — говорит нам очередной фреймворк* на PHP. А слышится «Throw Me!». Часть 2
    0
    в данном конкретном случае не нужна, поскольку конструктор стандартного класса все без исключения Throwable заворачивает в Exceptions: https://github.com/RunnMe/Core/blob/master/src/Core/Std.php#L53

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

  • «Runn Me!» — говорит нам очередной фреймворк* на PHP. А слышится «Throw Me!». Часть 2
    +1

    Судя по коду, правильнее так


    try {
    // ...
    } catch (Exceptions $errors) {
      foreach ($errors as $error) {
        echo $error->getMessage();
      }
    } catch (Exception $error) {
       echo $error->getMessage();
    }

    Т.к. Exceptions не наследуется от Exception


    И все-таки не понятно, зачем ошибки валидации делать исключениями, вы ведь их не выбрасываете (только во втором случае). В итоге возникает желание их поймать, а не получится.

  • Логирование в Yii 2.0 и PSR-3
    0

    Что ж, простите за потраченное время (что аж значок "Отхабренный" заработал)

  • Логирование в Yii 2.0 и PSR-3
    0
    Но вы же писали, что большинство так писало

    Речь шла о "значимых" проектах, чьи участники принимали участие в формировании стандарта.


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

    И что тогда вы хотели этим сказать? :)

  • Логирование в Yii 2.0 и PSR-3
    0

    Ну тут я солидарен с Mendel, не всех нужно спрашивать. К примеру, мало интересует стили кода у тех, кто пишет на Bitrix или WordPress, т.к. они эти стандарты не поддерживают, и сомневаюсь, что будут когда-то.

  • Логирование в Yii 2.0 и PSR-3
    0

    http://www.php-fig.org/psr/psr-2/#overview


    Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.
    Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.

    На лицо дублирование, но почему-то никто не объединил эти два пункта ;)
    Один пункт — одно утверждение

  • Логирование в Yii 2.0 и PSR-3
    0

    Это описание стандарта. Важно чтобы при его прочтении не возникло недопонимания, поэтому текст бы никуда не делся, а просто заменили бы фразы "на следующей строке" \ "на этой же строке" на противоположные и все :)

  • Логирование в Yii 2.0 и PSR-3
    0

    Вот кстати статистика за 2013-2014 года. Думаю она актуальная в контексте нашей дискуссии. За это время PSR-2 не успел сильно распространиться


    http://sideeffect.kr/popularconvention#php

  • Логирование в Yii 2.0 и PSR-3
    +1
    Будет выглядеть некрасиво из-за контекста, в котором они обычно используются, но всё равно люди будут подтягиваться к стандарту.

    Вы путаете с единообразием


    PSR-12 не упрощает вещи, хотя мог бы.

    Сделать стандартным правило расстановки скобок ≠ упростить. Текущая реализация вполне логична и делает проще чтение и изменение кода.


    Логические конструкции и анонимные функции — на одной строке, чтобы код не разрастался по вертикали и его было удобнее читать.
    Функции и классы — на новой строке, чтобы их описание не сливалось с кодом, что, опять же, упрощает чтение.
    В случае с классами на одной строке с названием могут быть extends и implements, которые удобнее добавлять в конце строке, а не кликать перед символом фигурной скобки.


    И все-таки это ну никак не "архитектурная" проблема и, судя по приведенным вами примерам — единственная. Поэтому утверждение, что "через какое-то время PSR начинает тормозить всё, а не помогать строить светлое будущее" немного преувеличено :)