• Как правильно с точки зрения PSR писать "&"?

    @EvgeniiR
    https://github.com/EvgeniiR
    Вот psr https://github.com/php-fig/fig-standards/blob/mast...

    Пункт 4.4

    A method declaration looks like the following. Note the placement of parentheses, commas, spaces, and braces:
    <?php
    
    namespace Vendor\Package;
    
    class ClassName
    {
        public function fooBarBaz($arg1, &$arg2, $arg3 = [])
        {
            // method body
        }
    }
    Ответ написан
    2 комментария
  • Какую лучше использовать структуру vuejs с моделями?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Официальный путь управления состоянием во vue.js это vuex.
    А без хорошего понимания механизмов реактивности во vue.js самодельные решения доставят только боль.
    Ответ написан
    Комментировать
  • Что обязательно нужно знать в PHP и что посоветуете выучить?

    toxicmt
    @toxicmt
    CTO at hexlet.io
    > С какими общими понятиями нужно ознакомится?

    То что вы описываете конечно хорошо и полезно, но недостаточно для того чтобы начать писать софт качественно. Причем речь не про "выучить еще немного функий", а про фундаментальные вещи. Понятия которые нужно знать в обязательном порядке (очень выборочно):

    1. Автоматизированное тестирование.
    1. Автоматное программирование.
    1. DDD.
    1. Функциональное программирование (функции высшего порядка, библиотеки типа https://github.com/tightenco/collect)

    Мастхев книги: https://ru.hexlet.io/pages/recommended-books
    Немного умных слов: https://docs.google.com/spreadsheets/d/e/2PACX-1vS...
    Ответ написан
    6 комментариев
  • Что обязательно нужно знать в PHP и что посоветуете выучить?

    voronkovich
    @voronkovich
    Я бы порекомендовал посмотреть плейлист PRS-7 фреймворк на канале Дмитрия Елисеева.
    Там обсуждается создание современного фреймворка на PHP и рассматриваются такие темы как: PSR, Dependency Injection, шаблонизаторы и т.д. Крайне рекомендую!

    Также советую почитать книгу Джоша Локхарта (создатель фреймворка Slim) Современный PHP.
    Slim-фреймворк тоже можете посмотреть, он достаточно добротно написан :).

    TDD. Есть хорошая книга Кента Бека Экстремальное программирование. Разработка через т.... Примеры там даны на Java, но будут понятны любому кто знает хотя бы один Си-подобный язык (PHP к таковым относится!).

    UPD: Вы просили указать: можно ли с вашими знаниями устроится джуном. Я думаю, что да, можно.
    Ответ написан
    Комментировать
  • Во сколько обходится валютный контроль?

    @Stalinko
    PHP'шник и фрилансер до мозга костей
    Если зарабатываем $1000 по новому контракту:

    1. 20% от $500 + 10% от $500 = $150
    2. $30 - wire transfer
    3. ~$15 комиссия банка посредника. . Везде по-разному: в Модульбанке 15 евро, Тиньков банке ноль.
    4. Для тех, кто работает по УСН: 6% от оставшихся денег т.е. 805 * 6% = $48,3
    Я работаю по ПСН, поэтому для меня в этом пункте ноль :)
    5. Комиссия за валютный контроль: 300р ($5) в моём случае.

    Остаётся ~$751,70
    Я бы сюда ещё заложил стоимость обналичивания/обмена этих денег на рубли. Это сильно зависит от банка и тут много вариантов.

    Выводы:
    - выводить реже и большими суммами сразу
    - работать дольше по одному контракту
    - использовать ПСН, если доступен патент по адекватной цене и стабильный доход
    - комбинировать способы обналички/обмена на рубли

    Бонус: не забываем, что есть ещё куча фиксированных платежей: тарифный план банка, патент если работаешь по ПСН, фиксированые платежи для ИП (~31т.р. в 2018г), оформление паспорта сделки для тех, кто работает давно и стабильно.
    Ответ написан
    43 комментария
  • Как отделить бизнес-логику?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    1. я бы реализовал работу с PayPal в виде фраймворко независимой библиотеки (хотябы минимум зависимостей) для начала в src/paypal после реализации подключил бы через composer
    2. Уровень сервиса это не работа с PayPal конкретно а работа с платежной системой, то есть Paypal бы шел как драйвер
    use App\Services;
    
    class Payment {
    
    	protected $payment;
    
    	public function __construct(\App\Contracts\PaymentDriverInterface $payment) {
    		$this->payment = $payment;
    	}
    
    	public function createPaymentUrl() {
    		return $this->payment->getUrl();
    	}
    
    }
    
    namespace PayPal;
    
    class PayPalDriver implements \App\Contracts\PaymentDriverInterface {
    
    	public function getUrl() {
    		//реализация
    	}
    
    }
    Ответ написан
    Комментировать
  • Как правильно работать с исключениями?

    @cicatrix
    было бы большой ошибкой думать
    Если б однозначный ответ на ваш вопрос существовал, он бы был включён в гайды по программированию.
    Существует очень много факторов, влияющих на то, как вы должны поступать с исключениями:
    1) Вообще их не ловить, пусть об этом заботится вызывающий
    2) Ловить и обрабатывать определённые исключения, остальные пробрасывать
    3) Ловить, генерить своё, обёртывать в него внутреннее и бросать своё
    4) Ловить всё, обрабатывать самостоятельно
    5) Душить всё

    (и это далеко не полный список).

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

    В крупном проекте есть руководитель/архитектор, который должен задать либо общие правила, либо правила конкретно для вас. Для open source вопрос сложный - в библиотеках обычно исключения не обрабатываются, иногда пробрасываются.
    Если вы контролируете код от метода MyMethod и дальше вниз по иерархии вызовов, то решать вообще-то вам. Как вам удобнее, так и поступайте. Если внизу по иерархии другой код, то обычно, пока явно не оговорено обратное, поступать надо так же, как поступает код "снизу" - если бросает/пробрасывает, то и вы делайте так же, если нет - соответственно, и вы обрабатываете.
    Ответ написан
    Комментировать
  • Как правильно работать с исключениями?

    Stalker_RED
    @Stalker_RED
    На самом верхнем уровне вашего приложения должен быть какой-то Глобальный И Великий Обработчик Исключений Общего Назначения. Задачи у него очень простые - записать в лог что и где сломалось, показать пользователю табличку "ой, все пропало", и опционально пнуть мониторинг, отправить смс админу или письмо деду морозу.

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

    Рассмотрим пару примеров:
    1. Представим, что модуль "генератор превьюшек для фоточек", который верой и правдой трудился многие месяцы, однажды наталкивается на непреодолимую для него преграду и бросает исключение - "капец, место на диске кончилось, я так больше не работаю!"

    Если ваш код не может ничего с этим поделать - вы пропускаете это исключение выше, пускай Глобальный И Великий Обработчик показывает юзеру красивую табличку "извините, у нас перерыв обед", и шлет письма админу в три часа ночи. А если у вас облачный хостинг, например, и вы можете на лету подключить больше дискового пространства, или может снести какой-то ненужный кэш освободив место, то можно перехватить это исключение, показать юзеру "извините, за задержку, ваши фоточки будут обработаны через пару минут", а админу прислать не красный алерт, а желтый.

    2. Виджет, который показывает самых рейтинговых котиков с ютуба не смог подгрузить очередную порцию котиков, т.к. ютуб забанен роскомнадзором. Если ваш код ничего не может с этим поделать - Глобальный И Великий Обработчик Исключений покажет пользователю "ой все". Или вы перехватите это событие на более низком уровне и покажете табличку "свежих котиков нет, но вот есть рейтинг за прошлую пятницу". Или, если котики должны быть обязательно свежие, то можете предусмотреть экстренное подключение через vpn или tor, или может возьмете котиков с vimeo вместо ютуба, например.

    В итоге, общие правила такие:
    1. пропускаете наверх все исключения, которые не можете обработать.
    2. обрабатываете те, которые вот прям обязательно нужно и важно обработать, и у вас действительно есть для этого возможность.

    Важно в этом не переусердствовать, и не основывать бизнес-логику на исключениях. Этот механизм для редких, исключительных ситуаций, которые не получается обработать другим способом. Если модуль ресайза фоточек написан индусами, и его, внезапно, нечем заменить. Но если есть возможность (и необходимость) перевести эту проблему из разряда исключительной в обычную рабочую ситуацию - лучше так и сделать. Если у вас место кончается два раза в неделю - лучше настроить какой-то мониторинг, который будет следить за этим показателем и заранее разруливать такие ситуации. В случае с недоступностью сервера можно на уровне бизнес логики проверять доступность и подключать резервные каналы или источники данных, вместо того, чтобы падать с ошибкой "ой 500!".
    Ответ написан
    3 комментария
  • Какие процессы происходят на низком уровне?

    @asd111
    Консоль браузера Хром это консоль javascript движка V8.
    Соответственно когда пишешь var a = 8 виртуальная машина javascript выделяет через ОС блок памяти для переменной.
    У ОС есть системные вызовы для выделения памяти, для работы с процессором и т.п.
    На уровне железа оперативная память представляет собой набор сигналов 1-0 и этот поток постоянно проходит через процессор, меняется и отправляется обратно в память.
    Ответ написан
    Комментировать
  • Yii2 как сделать множественные вставки/удаления/обновления?

    ivankomolin
    @ivankomolin
    В yii2 есть batch insert: www.yiiframework.com/doc-2.0/yii-db-command.html#b...

    Его можно использовать для множественной вставки
    Для множественного обновления можно использовать его же, с небольшими доработками(добавлением ON DUPLICATE KEY UPDATE)
    А вот насчет массового удаления наверное просто IN, например так: ->where(['IN', 'id', $ids])
    Ответ написан
    Комментировать
  • Каков сценарий использования git для одного разработчика?

    Есть очень простое правило - правильно так, как проще.

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

    Как только понадобится делать релизы, там уже можно заморочиться с master, staging, feature-бранчами и тп, но только по мере необходимости.

    PS. Раз уж мы действуем по принципу KISS, вместо утилиты командной строки лучше использовать удобный GUI, например на Mac это Source Tree (по-моему самая классная программа на моем ноуте).
    Это также поможет работать с гитом правильнее - вручную просматривать и стейджить каждый измененный файл, а не через git add -A.
    Ответ написан
    Комментировать
  • Каков сценарий использования git для одного разработчика?

    @InoMono
    Если вы не фиксите баги в старой версии, одновременно делая и новую версию - то отдельные ветки вам не нужны.
    Для начала освоение научитесь делать четкие коммиты. Чтобы изменения (файлы включенные в коммит) и цель этих изменений (комментарий коммита) совпадали
    Ответ написан
    Комментировать
  • Каков сценарий использования git для одного разработчика?

    @iMaximus
    Все просто, работаете на компьютере. Перед тем как закончить, все коммитите и делаете push. Сели за ноут делаете pull.
    Если пилите новую фичу, или что то глобальное, лучше создать отдельную ветку, и пока все не закончите делать на ней. На само деле это не обязательно, так как в любом случае все commits и history будут и так видны, а накосячить одному, мало реально, даже если делать все на мастере.
    Главное, не забывать простое правило, сел за комп pull перед уходом от компа push.
    Ответ написан
    Комментировать
  • Каков сценарий использования git для одного разработчика?

    gobananas
    @gobananas
    finishhim.ru
    Делаете ветку master, ветку dev и отдельные ветки под отдельные фичи.
    Делаете 2 сайта - один сам проект (основной) - на него выкатываете master, второй сайт тестовый - на него выкатываете ветку dev. Остальные ветки разрабатываете, сливаете с dev выкатываете на тест, если там всё нормально то dev сливаете с мастером. За ноут просто когда садитесь если мастер новый есть делаете git pull и стягиваете новую версию
    Ответ написан
    11 комментариев
  • Каков сценарий использования git для одного разработчика?

    KazeZlat
    @KazeZlat
    Погромист-затейник
    Работаете в ветке dev, периодически вливая ее в master. Для крупных задач (не входящих в один коммит) делаете отдельные ветви из dev.

    Вливая dev в master, делаете это с ключом --squash как то так:
    git checkout master
    git merge --squash dev

    Тут теоретически могут быть конфликты, если вы делали коммиты в masterпараллельно с dev, которые вам надо разрешить, а после уже добавляете и делаете один большой коммит:
    git add -A
    git commit -m "Merged dev: %кратко (или нет) основные изменения%"
    git push


    А чтобы не мозолили глаз висящие коммиты с логической незавершенностью, их можно сливать их перед merge с помощью интерактивного rebase:
    git checkout dev
    git rebase -i master

    Откроется редактор, в котором будет список коммитов ветки dev. Здесь можете слепить ненавистные коммиты с помощью команды squash (и тогда вам предложат отредактировать сообщение) или fixup (тут не предложат) и потом сделать git push --force (для одного не критично, в толпе лучше использовать --force-with-lease.

    Или есть еще вариант - лепить к предыдущему коммиту сразу с помощью git commit --amend

    Ну и после merge уже можете на master лейбл версии повесить.
    Ответ написан
    Комментировать
  • Как начать использовать шаблон спецификация?

    @AlexHell
    дам ответ на вопрос более общий по "шаблону <спецификация>" - это как раз-таки класс с методом инкапсулирующие знания о чем либо, зачастую создание или алгоритм работы, с подробностями аргументов (которых может быть много и они не обязательные)

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

    более конкретно по вашему вопросу не ясно вот это
    "Проще говоря, мне нужно указывать условия для метода findBy($criteria) которая внутри в зависимости от типа ресурса будет конвертироваться в формат условия который понимает ресурс."
    что есть "в зависимости от типа ресурса" - какие виды ресурсов?
    вообще у вас должна быть начинка "реальной работы", для случая спецификации: когда в вашем findBy вызываются специфичные методы которые в спецификации есть, возможно надо и с другими шаблонами/сущностями сгруппировать, например из спецификации вызывать конкретный метод одного из полиморфных преобразователей (IImplementer, Implementer1, Implementer2) или полиморфный билдер, допустим в методе Invoke(IImplementer) вашей спецификации будет дергаться кокнертные методы IImplementer которые для случая с API будут готовить одну строку по http а для случая с sql бд будут генерить sql строку, аппендить ее к результату или аналогичное
    Ответ написан
    3 комментария
  • Как исправить ошибку unserialize?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    1 комментарий
  • Как настроить Nginx config на Open server?

    SimBioT19
    @SimBioT19
    {{ user.about }}
    Конфиги Nginx в OSpanel (OpenServer) настраиваются для каждого домена отдельно.
    В папку с доменом поместите файл с конфигами, имеющий название версии Nginx, например, Nginx-1.8_vhost.conf или Nginx-1.10_vhost.

    Внутренности моего конфига для root в /public:
    server {
        listen         %ip%:%httpport%;
        listen         %ip%:%httpsport% ssl;
        server_name    %host% %aliases%;
        
        ssl_certificate               "%sprogdir%/userdata/config/server.crt";
        ssl_certificate_key           "%sprogdir%/userdata/config/server.key";
        
        #add_header Strict-Transport-Security "max-age=94608000; includeSubDomains; preload";
        
        # if ($request_method !~* ^(GET|HEAD|POST)$ ){return 403;}
        location ~ /\. {deny all;}
    
        location / {
            root       "%hostdir%/public";
            index      index.php index.html index.htm;
            try_files $uri $uri/ /index.php?_url=$uri&$args;
        }
    
        location ~ \.php$ {
            root                               "%hostdir%/public";
            try_files $uri $uri/ /index.php?_url=$uri&$args;
            # if (!-e $document_root$document_uri){return 404;}
            fastcgi_pass                       backend;
            fastcgi_index                      index.php;
            fastcgi_buffers                    4 64k;
            fastcgi_connect_timeout            1s;
            fastcgi_ignore_client_abort        off;
            fastcgi_next_upstream              timeout;
            fastcgi_read_timeout               5m;
            fastcgi_send_timeout               5m;
            fastcgi_param    CONTENT_TYPE      $content_type;
            fastcgi_param    CONTENT_LENGTH    $content_length;
            fastcgi_param    DOCUMENT_URI      $document_uri;
            fastcgi_param    DOCUMENT_ROOT     $document_root;
            fastcgi_param    GATEWAY_INTERFACE CGI/1.1;
            fastcgi_param    HTTPS             $https;
            fastcgi_param    QUERY_STRING      $query_string;
            fastcgi_param    REQUEST_METHOD    $request_method;
            fastcgi_param    REQUEST_URI       $request_uri;
            fastcgi_param    REMOTE_ADDR       $remote_addr;
            fastcgi_param    REMOTE_PORT       $remote_port;
            fastcgi_param    SERVER_ADDR       $server_addr;
            fastcgi_param    SERVER_PORT       $server_port;
            fastcgi_param    SERVER_NAME       $host;
            fastcgi_param    SERVER_PROTOCOL   $server_protocol;
            fastcgi_param    SERVER_SOFTWARE   nginx;
            fastcgi_param    SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            fastcgi_param    SCRIPT_NAME       $fastcgi_script_name;
            fastcgi_param    TMP               "%sprogdir%/userdata/temp";
            fastcgi_param    TMPDIR            "%sprogdir%/userdata/temp";
            fastcgi_param    TEMP              "%sprogdir%/userdata/temp";
        }
    
    
        location /openserver/ {
            root     "%sprogdir%/modules/system/html";
            index    index.php;
            %allow%allow    all;
            allow    127.0.0.0/8;
            allow    ::1/128;
            allow    %ips%;
            deny     all;
            location /openserver/server-status {
                stub_status on;
            }
            location ~ ^/openserver/.*\.php$ {
                root                               "%sprogdir%/modules/system/html";
                fastcgi_pass                       backend;
                fastcgi_index                      index.php;
                fastcgi_buffers                    4 64k;
                fastcgi_connect_timeout            1s;
                fastcgi_ignore_client_abort        off;
                fastcgi_next_upstream              timeout;
                fastcgi_read_timeout               5m;
                fastcgi_send_timeout               5m;
                fastcgi_param    CONTENT_TYPE      $content_type;
                fastcgi_param    CONTENT_LENGTH    $content_length;
                fastcgi_param    DOCUMENT_URI      $document_uri;
                fastcgi_param    DOCUMENT_ROOT     $document_root;
                fastcgi_param    GATEWAY_INTERFACE CGI/1.1;
                fastcgi_param    HTTPS             $https;
                fastcgi_param    QUERY_STRING      $query_string;
                fastcgi_param    REQUEST_METHOD    $request_method;
                fastcgi_param    REQUEST_URI       $request_uri;
                fastcgi_param    REMOTE_ADDR       $remote_addr;
                fastcgi_param    REMOTE_PORT       $remote_port;
                fastcgi_param    SERVER_ADDR       $server_addr;
                fastcgi_param    SERVER_PORT       $server_port;
                fastcgi_param    SERVER_NAME       $host;
                fastcgi_param    SERVER_PROTOCOL   $server_protocol;
                fastcgi_param    SERVER_SOFTWARE   nginx;
                fastcgi_param    SCRIPT_FILENAME   $document_root$fastcgi_script_name;
                fastcgi_param    SCRIPT_NAME       $fastcgi_script_name;
                fastcgi_param    TMP               "%sprogdir%/userdata/temp";
                fastcgi_param    TMPDIR            "%sprogdir%/userdata/temp";
                fastcgi_param    TEMP              "%sprogdir%/userdata/temp";
            }
        }
    
    }


    Не забудьте перезагрузить openserver
    Ответ написан
    1 комментарий
  • Стоит ли разделять сайт на backend и frontend?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это называется Singe Page Application.

    Если вас не смущает геморой с индексацией сайта в поисковике - подход весьма оправдан.

    Плюсы:
    - ослабление связей внутри системы, упрощается серверная часть (по сути у вас там красивая REST Api должна быть)
    - общее увеличение отзывчивости системы (если грамотно спроектировать фронтэнд)
    Минусы:
    - общее время разработки может увеличиться в зависимости от проекта.
    - необходимость добавлять на сервере генерацию page fragments для поддержки поисковиками. Есть конечно варианты использовать на сервере phantomjs для создания этих самых фрагментов.
    Ответ написан
    1 комментарий
  • Самый быстрый веб-сервер php для windows?

    @Mishko_kun
    Секрет есть) Скорее всего проблемы с производительностью есть в тех частях сайта где вы делаете SQL запросы.
    Решение: поменяйте в конфиге подключения к бд
    с localhost на 127.0.0.1
    и будет вам счастье.
    Ответ написан
    2 комментария