• Как сбросить ключ массива?

    @Nc_Soft
    array_values()
    Ответ написан
    Комментировать
  • Как рядовому веб-разработчику можно использовать в повседневной жизни Amazon EC2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вся мощь амазона заключается в возможности скейлиться. То есть никакой магии, мы можем по API трекать нагрузки и по API добавлять сервера когда надо. Автоматически. Или там у вас планируется новогодняя акция и поток пользователей будет в 10 раз больше - добавили сервачков на месяц. Так же у AWS миллион сервисов, которые сойдут для начала (например если надо быстро запилить транскод видео - без проблем. Нормально на EC2 уже можно сделать когда по стоимости будет сильно дорого (или вообще взять ноду с GPU).

    А просто так - AWS слишком дорогой, проще взять на диджитал океан дроплетов и не париться. Возможности "скейлиться" у них больше.
    Ответ написан
    3 комментария
  • Как узнать когда был запущен Apache?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Почитать логи?
    Посмотреть время создания pid файла?
    Ответ написан
    Комментировать
  • Как лучше построить модуль Транзакции в 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 комментариев
  • Правильно ли я использую PHP-DI?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет, вы не правильно уловили идею. Передавать весь контейнер в качестве зависимости это нарушение этого самого паттерна и принципа инверсии зависимостей. Так можно делать только в случае циклических зависимостей либо же просто как альтернатива ленивой инициализации сервисов (хотя альтернатива так себе, а циклических зависимостей надо избегать).

    1) читаем про принцип инверсии зависимостей
    2) читаем про внедрение зависимостей
    3) если уж используете безымянные классы то они должны имплементить какой-то интерфейс или же экстендиться от какого-то класса.

    Вместо того что вы хотите должно быть:

    class Foo {
         private $db;
    
         public function __construct(Connection $connection) {
               $this->db = $connection;
         }
    
         public function makeFoo() {
              return $this->db->getRows(); // как вы и хотели
         }
    }
    
    // а это уже дергаем в конструкторе
    $foo = $di->get(Foo::class);
    $foo->makeFoo();


    то есть в контроллерах мы дожны дернуть сервис который вернет нам готовые данные.
    Ответ написан
    6 комментариев
  • Почему нельзя сделать так?

    @balamyt92
    ; select * from users; --
    потому что:
    SELECT список полей FROM список таблиц WHERE условия…
    Ответ написан
    7 комментариев
  • Переустановка предустановленной Win 8.1 без потери лицензии. Возможно?

    @LiguidCool
    Ваш лицензионный ключ защит в BIOS. При установке системы нужной версии она сама активируется.
    Кроме того ключ можно и достать.
    Ответ написан
    3 комментария
  • Как назвать переменную?

    @Mercury13
    Программист на «си с крестами» и не только
    pluralDays
    Ответ написан
    Комментировать
  • Как в Doctrine2 DQL сделать SELECT COUNT(DISTINCT(field1, field2))?

    Во-первых, для выражения DISTINCT скобки не нужны.
    Во-вторных, DISTINCT в Doctrine не поддерживает несколько аргуементов

    В-третьих, для решения предыдущих двух есть хак:
    SELECT COUNT(DISTINCT CONCAT(t.field1, t.field2)) FROM table t;
    Ответ написан
    5 комментариев
  • Почему cookie можно создавать только в начале?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    для начала вам надо разобраться что такое куки. Как куки передаются на клиент. Что такое заголовки и тело HTTP запросов и ответов. И тогда все встанет на свои места. Ну а что бы небыло проблем - почитать про управление буферизацией вывода в PHP.

    Чем куки отличаются от сессии в PHP?
    Ответ написан
    Комментировать
  • Сайт php + AJAX, приехали?

    MaEcTPo
    @MaEcTPo
    Конкретно с этим кодом, с минимальными затратами времени я бы сделал следующее:

    1. В функциях я оставил бы только формирование массивов данных. Переименовал бы их в `get_news()`, `get_news_menu()`. Они бы возвращали только массивы данных, например:
    $news = [
        0 => [
            'photo' => 'photoValue',
            'title'    => 'Title Value',
            'description' => 'Some long Description',
        ],
        1 => [
            'photo' => 'photoValue',
            'title'    => 'Title Value',
            'description' => 'Some long Description',
        ],
    ];


    С меню так же - возвращаете массив, только вместо photo, title, description уже будут url, title, что-то ещё.

    2. Всю HTML-разметку можно вынести в отдельный файл, например, который в данном случае подключить при помощи include(). Но это особо не повлияет на качество кода :)
    Саму разметку уже делать подобным способом, на примере с меню:

    <div class="card" style="height: 30px;">
        <?php foreach (get_menu_items() as $menuItem) : ?>
            <a href="<?= $menuItem['url'] ?>"><?= $menuItem['title'] ?></a>
        <?php endforeach; ?>
    </div>


    Потом, с опытом, придёт понимание того, что некоторые части повторяются и их можно и нужно выносить в отдельные блоки (Twig), паршалы (symfony1, zend1).

    3. Относительно аякса, то ничто вам не мешает, если это аякс возвращать на клиент json структуры ваших новостей, который клиент уже будет рендерить так, как пожелает. А на сервере это всего лишь `json_encode(get_news());` отправить в браузер.

    P.S. мог допустить синтаксических ошибок, так как в IDE не проверял. Надеюсь, что помог.
    Ответ написан
    5 комментариев
  • Нужно ли периодически перезагружать по питанию сервера?

    martin74ua
    @martin74ua Куратор тега Системное администрирование
    Linux administrator
    Перезагрузка в линуксах нужна для обновления ядра. Единственная уважительная причина ;)
    Перезагрузка по питанию - такого требования вообще нет. Единственно для чего это можно придумать - для контроля состояния конденсаторов блока питания ;)
    Ответ написан
    1 комментарий
  • Почему так сильно подорожали аккаунты pro на российских биржах фриланса? С чем это связано?

    @protven
    Замечательные владельцы фриланс-бирж подмигивают и намекают нам как могут. "Бегите, бегите вы из этой страны". xD
    Ответ написан
    Комментировать
  • Знаете примеры красивого php-кода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Что такое agile разработка?

    saboteur_kiev
    @saboteur_kiev Куратор тега Организация работы
    software engineer
    Методика разработки.

    Waterfall: все тщательно планируем, назначаем сроки, разрабатываем, сдаем.

    Agile: Примерно планируем, анализируем, назначаем конечный срок, планируем на текущую итерацию, разрабатываем, планируем на текущую итерацию, разрабатываем... , сдаем

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

    Проблемы Agile:
    Люди должны быть достаточно зрелые, чтобы нормально загружать себя работой - Agile в бюрократической среде просто провалится.

    Плюсы Agile:
    Практически нет простоя ни у кого - все всегда могут занять себя задачами.
    В случае появления новых требований, их можно без особого вреда ввести в проект почти на любой стадии. Главное чтобы технически это было возможно (в случае waterfall проблема именно на уровне утверждений и плана, то есть бюрократии)
    Адекватное использование рабочей силы - если у кого-то нет текущих задач, его официально можно занять под другие проекты.

    Agile это не сверхфича, это инструмент, точнее подход к планированию работы, но им нужно уметь пользоваться.
    Ответ написан
    Комментировать
  • Где нужно начинать шифровать пароль?

    Ivanq
    @Ivanq
    Знаю php, js, html, css
    Как Вам уже сказал Владимир Мартьянов , лучше https. Если уж совсем никак, объясню, почему нельзя ни так, ни так.

    Предположим, шифруем на сервере:
    _______                 ______             _________
      |     |                /      \            |       |
      |     |               /  #  #  \           | # # # |
      |_____|     ------->  |  ____  |  -------> | # # # |
      /     \    password:  \ /    \ /           | # # # |
     /_______\ "mypassword"  \______/            |_______|
       Client               Ugly hacker           Server


    Если на клиенте:
    ______                _________            ______
     /      \               |       |           /      \
    /  #  #  \              | # # # |          /  #  #  \
    |  ____  |   ------->   | # # # | -------> |        |
    \ /    \ /   password:  | # # # |  login   \ \____/ /
     \______/    "hismd5"   |_______| success!  \______/
    Ugly hacker              Server          Smiling hacker
    Ответ написан
    Комментировать
  • Где нужно начинать шифровать пароль?

    @vilgeforce
    Раздолбай и программист
    Разумнее https.
    Ответ написан
    Комментировать