• Какой стек технологий нужен чтобы сделать что-то подобное?

    @PyTiMa
    Учусь, кручусь, верчусь.
    wappalyzer.com
    А вот некоторые вещи, из тех которые юзает данный сайт
    b6936af5a9574ca48a975a58f56cfc69.JPG
    Ответ написан
    2 комментария
  • WordPress для Junior - ов?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Да никому толком не нужны всякие хипстерские приблуды в виде YII , Laravel и прочих модных фреймворков.
    Есть WP, есть Joomla. Мужики клепают сайты и рубят бабосики, и всем плевать, что там внутри.
    Недавно плагин лепил для одного такого сайта. Внутри полный треш (хотя внешне выглядит вполне достойно). У меня прям челюсть упала, когда узнал что за такое пол ляма заплатили.
    Ответ написан
    1 комментарий
  • Как повысить квалификацию php-программисту?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сделаны даже не по MVC.

    Могу открыть страшную тайну - большинство людей так делают, даже если называют это MVC.

    думая только о логике приложения, а не вспоминая какие именно функции мне нужны.

    Ну так IDE за тем и нужны. Что бы не вспоминать какой порядок аргументов у той или иной функции, автокомплиты всякие и т.д. Даже люди, которые пользуются VIM и т.д. ставят себе сервера автокомплита и пользуются всем этим не потому что PhpStorm развращает, а потому что для них PhpStorm уже жмет (слишком умный, делает слишком много и от того медленно).

    Уверенные знания заключаются в понимании того, что вы делаете. Заучивать API глупо, сегодня оно одно - завра другое. Вам нужно только помнить что что-то такое есть и уметь составлять поисковые запросы. То чем вы пользуетесь каждый день и так в памяти отложится.
    Ответ написан
    Комментировать
  • Как лучше построить модуль Транзакции в symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    0) Никаких TransactionBundle. Вы эту логику не сможете реюзать, а значит нет смысла делать бандл. Почитайте symfony best practice. У вас должен быть один AppBundle и все, больше ничего. Вы можете пытаться выносить какие-то части инфраструктуры, которая не привязана к бизнес логике в отдельные бандлы для последующего реюза, но бизнес логику приложения реюзать не выйдет.

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

    2) уберите flush их сервиса и вынесите его в контроллер. flush коммитит транзакцию в базу, и нам надо это делать когда мы завершили работу с оными а не "где-то посередине".

    3) оборачивать это добро в еще одну транзакцию глупо, потому что... доктрина и так сделает транзакцию. В любом случае по хорошему это надо делать в декораторе.

    4) call_user_func_array в вашем случае - пример плохого решения.

    5) по умолчанию persist использовать нужно только для тех сущностей, которые мы только что создали (в нашем случае - транзакция), либо тех которые мы явно вынули из unit of work (а у нас нет вызова $em->detach).

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

    7) сервисы менеджеры - отстой. Называйте сервисы нормально.

    8) вместо кучи сервисов можно ввести разные объекты транзакций. Например FundTransaction, IncomTransaction и т.д. У вас же в сервисах почти весь код дублируется. А так можно было бы всю логику с этими операциями сложить прямо в сущности.

    9) НИКАКИХ DIE! даже для дебага.

    public function transactionAction(Request $request)
    {
        $data = $request->request;
        $transactionDTO = new TransactionDTO(
             // вообще я бы тут просто ID пользователя возвращал... но я упорот по изоляции приложения от UI
             $this->get('security.token_storage')->getToken()->getUser(), 
             $data->get('sender_account_type'),
             $data->get('recipient_account_type'),
             $data->get('amount')
        );
        // с исключениями разберется фронт контроллер
        $this->get('app.transaction_processor')->process($transactionDTO);
        // вот теперь сохраняем изменения
        $this->get('doctrine.orm.entity_manager')->flush();
    
        return new Response(null, 201); // создали новую запись в журнале транзакций
    }


    class TransactionProcessor
    {
          private $transactionsRepository;      
    
          public function __construct(TransactionRepository $repository)
          {
               $this->transactionsRepository = $repository;
          }
    
          public function process(TransactionDTO $dto)
          {
                // create это статический метод фабрика у абстрактного класса Transaction
                // читать шаблон проектирования "абстрактная фабрика".
                $transaction = Transaction::create($dto->getSender(), $dto->getRecipient(), $dto->getAmount());
                
                $this->transactionsRepository->add($transaction);
          }
    }


    дальше мне по логике не понятно, почему у вас одна транзакция на двух человек, полюбому у sender-а будет один тип транзакции а у ресивера другой. Можно запомнить кому мы чего передавали и только.
    Ответ написан
    7 комментариев
  • Как в YII2 конвертировать string в html при передаче кода виджета во view?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    О боги! А поддерживать потом как, с гадалкой?

    Да вынесите вы все это в отдельный специально созданный виджет. Логику разместите в методах класса виджета и формируйте вывод непосредственно во вьюхе виджета. Это же в разы проще и понятнее...

    Используем созданный виджет в нужной вьюхе:
    <?= \path\to\widget\MyWidget::widget( [ 'list' => $treeList ] ); ?>


    Виджет в себе содержит все необходимые методы:
    class MyWidget extends \yii\bootstrap\Widget
    {
        public $list = [];
    
        public function someMethod () {}
    
        public function run () {
            return $this->renderFile( '...' );
        }
    }


    И собственно вьюха виджета:
    <?php
    use path\to\widget\MyWidget;
    use yii\web\View;
    
    /**
     * @var View     $this
     * @var MyWidget $widget
     */
    
    $widget = $this->context;
    ?>
    
    <!-- Тут мы используя циклы и методы виджета формируем отображение -->
    
    <?php foreach( $widget->... as $value ) { ?>
    
        <!-- Делаем что нужно и как нужно -->
    
    <?php } ?>
    Ответ написан
    4 комментария
  • Как правильно сделать поиск по сайту в Angular?

    R0dger
    @R0dger
    Laravel/Yii/2 AngularJs PHP RESTful API
    Ну если это полнотекстный поиск то Важно, вы же будете использовать Вашу БД и в ней искать, поэтому пользуйтесь решениями для этого... sphinx, elasticSearch
    если просто поиск то mysql и т.д.
    Ответ написан
    5 комментариев
  • Yii2 как правильно выполнять выборку данных из БД и отображать её?

    @Bojczuk
    all/one после where забыли:
    $answers = Answers::find()->where(['ticket_id'=> '47'])->one();
    Ответ написан
    1 комментарий
  • Как сделать Pixel Art в высоком качестве?

    @hero564
    При масштабировании необходимо выбрать алгоритм "Ближайший сосед"(Nearest Neighbor) вот статья: клик
    Если пользуетесь Paint.NET то при масштабировании просто необходимо выбрать "Качество"-"Пикселизация"
    Ответ написан
    Комментировать