Ответы пользователя по тегу PHP
  • Стоит ли работать с Drupal в 2022?

    @HellWalk
    PHP - это плохой выбор среди языков программирования - самое дно по средним зарплатам, все меньше новых проектов, на больших проектах пхп вытесняет го
    CMS - это худший выбор направления в PHP. Захотите нормальных (хотя бы по меркам пхп) зарплат - все будут спрашивать опыт работы с фреймворками

    Если вы только в поисках первой работы, я бы рекомендовал вообще сменить язык, и не тратить на пхп время.

    P.S. Если вам кто-то сказал, что пхп простой язык для входа - плюньте ему в лицо. Я не знаю другого языка, в котором было бы столько фреймворков и библиотек на решение одной и той же задачи. И в одной компании от вас будут требовать знание Symfony, в другой Laravel, в третьей Yii2. А в каком-нибудь Ruby разобрался в одном Ruby on Rails и все.
    Ответ написан
  • PHP устарел? Стоит ли переходить на JS фреймворки?

    @HellWalk
    Не знаю откуда информация про "Headless, JS фреймворки", в моем окружении много программистов переходят с php на go. А вот чтобы с других языков переходили на php - нет ни одного. Что собственно говорит о перспективах php.
    Ответ написан
    Комментировать
  • Две версии php на одном сайте без домена на одном ip на одном порту в разных папках?

    @HellWalk
    1. Устанавливаете 2 версии php
    2. Выкидываете апач, ставите и настраиваете nginx-конфиг для каждого домена/порта нужным образом

    Пример моего тестового конфига:

    server {
        listen 80;
    
        server_name test.loc;
    
        root /var/www/test.loc;
    
        index index.php index.html index.html;
    
        access_log /var/log/nginx/test.loc.log;
        error_log /var/log/nginx/test.loc.error;
    
        gzip   on;
        gzip_vary on;
        gzip_min_length 1000;
        gzip_proxied    expired no-cache no-store private auth;
        gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
        charset utf-8;
        client_max_body_size 32m;
    
        location / { 
            try_files $uri $uri/ /index.php$is_args$args; 
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            #fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param  QUERY_STRING     $query_string;
            fastcgi_param  REQUEST_METHOD   $request_method;
            fastcgi_param  CONTENT_TYPE     $content_type;
            fastcgi_param  CONTENT_LENGTH   $content_length;
            fastcgi_intercept_errors        on;
            fastcgi_ignore_client_abort     off;
            fastcgi_connect_timeout 60;
            fastcgi_send_timeout 180;
            fastcgi_read_timeout 180;
            fastcgi_buffer_size 128k;
            fastcgi_buffers 4 256k;
            fastcgi_busy_buffers_size 256k;
            fastcgi_temp_file_write_size 256k;
    
        }
    
        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
    
        location ~ /\.ht { deny  all; }
    }


    Строка fastcgi_pass unix:/run/php/php7.4-fpm.sock; отвечает за подгрузку нужной версии php
    Ответ написан
    Комментировать
  • Не работает vendor/autoload.php как исправить?

    @HellWalk
    На хостинге компосер не установлен.

    Если папка vendor внесена в gitignore (как и должно быть) - то на хостинге её и не будет, а файлы отвечающую за автозагрузку находятся там.

    Соответственно или устанавливать composer на хостинге и делать composer install, или, если это невозможно - можно (костыльным решением) руками загрузить туда папку vendor. Или (опять же костыльный вариант) убрать папку vendor из исключений git-а, и пусть она заливается на хостинг вместе с остальным проектом.
    Ответ написан
    9 комментариев
  • Область видимости метода?

    @HellWalk
    Все работает корректно.

    Вы создали класс A с методом a() доступным только для потомков
    Затем создали класс B наследующегося от A
    Затем создали класс C наследующегося от A с публичным методом b(), к которому и обращаетесь извне. А уже внутри класса-наследника обращаетесь к protected-методу.

    Ошибка будет, если попытаться сделать так:

    var_dump((new B())->a());

    Вне классов, т.е. после вашего var_dump((new C())->b());
    Ответ написан
    Комментировать
  • А как тестировать handler?

    @HellWalk
    Если говорить не о чистых юнит тестах (они замороченные), а функциональном тестировании (на базе того же функционала phpunit), то:

    Я не могу проверить, что попало в базу, потому что я не знаю Id, по которому туда попадут значения


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

    P.S.
    У вас там сущности можно оптимизировать - как понимаю вы там каждый раз uuid и дату создания передаете в конструктор, можно сделать трейты раз два, и в сущности указывать:

    /**
     * @ORM\Entity(repositoryClass=PostRepository::class)
     * @ORM\HasLifecycleCallbacks()
     */
    class Post
    {
        use IdTrait;
        use CreatedAtTrait;
    
       // ...


    Двумя строчками в сущности добавляете два поля и их автоматическое заполнение. Избавите конструктор от двух параметров.
    Ответ написан
    Комментировать
  • Наследование классов в PHP - не выводится переменная?

    @HellWalk
    class Telegram
    {
        public $chat_id;
    
        public function __construct($a)
        {
            $this->chat_id = $a;
        }
    }
    
    class DataBase extends Telegram
    {
        public function __construct($a)
        {
            parent::__construct($a);
            print('constructed');
        }
    }
    
    $a = new Telegram(3);
    $b = new DataBase(123);
    print($b->chat_id); // constructed123
    Ответ написан
    Комментировать
  • Какой смысл mock объектов для юнит тестирования своего кода?

    @HellWalk
    Смысл моков - эмулировать объекты с определенным поведением.

    Самый банальный пример, помимо http запросов, это эмулирование неправильных объектов.

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

    В phpunit есть функционал подсчета покрытия кода тестами - попробуйте на каком-нибудь относительно небольшом модуле добиться 100% покрытия кода тестами - вам обязательно придется использовать хитрые моки, эмулирующие нестандартное поведение объектов.

    P.S. Если вы недавно знакомы с юнит-тестами - непонимание моков нормально. Если будете стремиться писать надежный код, с качественным покрытием кода тестами (здесь самое сложное - предугадать все плохие кейсы, которые будут пытаться сломать ваш код) - понимание придет.
    Ответ написан
    2 комментария
  • Как передать параметры в массив?

    @HellWalk
    Там массив с данными, могу ли я передать новые значение с помощью curl?

    Можете, если у них есть API с таким функционалом.

    Есть ли документация?

    Спросите это у владельцев того ресурса, которому вы хотите отправлять данные.
    Ответ написан
    Комментировать
  • Как реализовать ЧПУ на PHP (движок самописный)?

    @HellWalk
    Вам нужны:
    1. Routing - есть компоненты, которые можно использовать независимо
    2. Контроллеры - чтобы в роутах ссылаться на Контроллер@методКонтроллера
    3. И нужная вам задача делается в рамках обычного функционала нормальных роутеров

    Раз у вас велосипед, можно продолжить велописедить, и написать свой роутинг - например, вот хорошее видео, где показывается, как это делать. Автор видео, после множества примеров, в конце показывает, как подключить и использовать сторонний модуль Aura.Router
    Ответ написан
    2 комментария
  • Как из строки получить два параметра?

    @HellWalk
    $_POST['title'] = 'title-desc-2013-04-28';
    $array = explode('-', $_POST['title']);
    $title = $array[0];
    $desc = $array[1];
    
    var_dump($title); // title
    var_dump($desc); // desc


    Если версия php свежая, можно и так:
    [$title, $desc] = $array;
    Ответ написан
    1 комментарий
  • Как ограничить количество попыток для пользователя?

    @HellWalk
    Итак, у вас есть какой-то ресурс, к которому вы хотите сделать ограниченный доступ неавторизованным пользователям (с авторизованными все понятно):

    1. Сразу нужно понимать, что сделать 100% работающий вариант для всех - невозможно, можно только максимально усложнить спамерам (я бы именно к спаму отнес такую задачу) жизнь.
    2. Чтобы реализовать это, нужно собрать максимум информации об анонимном пользователе (сохранить эти данные и по ним пытаться понять, новый это анонимный посетитель, или старый):
    - Самое банальное - куки на фронте
    - Чуть менее банальное, но тоже легко обходится - ip
    - Дальше можно взять такие параметры, как window.navigator.userAgent с фронта
    - На беке брать $_SERVER['PHP_AUTH_USER']
    - И еще есть всякие хитрые способы, например, кешировать картинку в браузере юзера, со специальным токеном, и по нему проверять. На память не вспомню статью на хабре, но поискать можно

    Сохранять эти данные, а потом писать хитрый анализатор, который будет сравнивать данные нового анонимного пользователя, с существующими данными в базе - и решать, что делать (можно считать пользователя зашедшим повторно по 100% соответствию всех параметров, а можно сказать, что если 70-80% совпадает - считаем это совпадением).

    Как вам правильно сказали - компании типа Яндекса и Гугла тратят миллионы для борьбы со спамерами, и 100% результата не достигли, не нужно думать, что у вас это получится. Но попробовать можно - опыт будет полезный.
    Ответ написан
    Комментировать
  • Как перевести страницу с помощью short_code?

    @HellWalk
    Начать нужно с того, на чем проект? Велосипед или фреймворк?

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

    Даже если у вас велосипед - можно использовать Symfony Translations (как отдельный модуль)

    Если же захочется сделать свой велосипед, то конечно, можно, но:

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

    Пример крайне упрощенного самописного модуля мультиязычности можете посмотреть в этом проекте (src/Battle/Translation/)
    Ответ написан
    Комментировать
  • Возможно ли подружить Symfony + gRPC + Codeception?

    @HellWalk Автор вопроса
    В общем, все оказалось просто (когда знаешь что делать)

    Необходимо в config/services.yaml в существующую строку:
    exclude: '../src/{DependencyInjection,Entity,Tests,Kernel.php}'

    добавить папку, в которой находятся gRPC-классы, в моем случае это папка src/Grpc и строчка в конфиге выглядит так:
    exclude: '../src/{DependencyInjection,Entity,Tests,Grpc,Kernel.php}'


    Спасибо за наводку по решению BoShurik
    Ответ написан
    Комментировать
  • Как не попасть в "неправильный" PHP?

    @HellWalk
    как отличить компанию куда следует откликаться, где со старта можно постигать и повышать скилл на профессиональном уровне и не попасть в конторы по клепанию ИМ?

    • Продуктовая компания
    • Проект на современном фреймворке (Symfony/Laravel)
    • Пишут авто-тесты
    • Делают ревью кода
    • Настроен CI/CD (т.е. если кто-то сделал хреновый пулл реквест, из-за которого упали тесты - смержить его просто не получится)
    • Сроки не горят. Практика показывает, что невозможно сделать хороший качественный проект в постоянно горящих дедлайнах
    • Есть команда. Из пунктов выше это и так понятно, но на всякий случай напишу отдельно. Не идите в компании, где вам придется работать в одиночку, или в компании с другим одним программистом.

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

    С одной стороны в требованиях были знания стильно-модно-молодежных Redis, Symfony понимания Git-Flow, Agile и т.д. и там же указаны - знание WP 1С-Битрикс. Как это можно понимать?

    Это значит, что в компании есть как хорошие, так и плохие проекты. Угадайте, кто будет заниматься плохими.
    Ответ написан
    Комментировать
  • Почему говорят не учить РНР?

    @HellWalk
    Смотрю тут все PHP нахваливают. Надо бы объективности ради указать и на вполне банальные недостатки - средний уровень зарплат в PHP - один из самых низких "по больнице":

    5dd389442d100655184482.png

    По этому, если вы подходите к выбору языка исключительно по уровню зарплат в нем - то да, PHP не лучший выбор. Конечно, даже в России на PHP есть зарплаты и 200+ и 300+ тысяч - но дорастают до таких зарплат не многие (и знать нужно далеко не один PHP).

    P.S. На мой субъективный взгляд - GO сейчас лучший язык для "входа в ИТ" с максимально быстрым выходом на хорошие зарплаты.
    Ответ написан
  • Отключение выполнения php-скриптов для поддиректорий виртуального хоста Apache

    @HellWalk
    Вариант для nginx, для папки images и все в ней:

    location ~* ^/(images)/.+\.(php|php3|php4|php5|phtml|phps|pl|pm)$ {
            deny all;
    }
    Ответ написан
    Комментировать
  • Как отыскать __callStatic() метод?

    @HellWalk Автор вопроса
    Задача ушла на второй план, а сегодня вновь наткнулся на этот метод, и в очередной раз решил разобраться, тем более дебагер уже настроен.

    Оказалось, что конкретно в моем случае концов вообще не найти - в проекте используется Fhalcon (будь он проклят), и механика работы его моделей вообще выходит за рамки PHP:

    Phalcon\Mvc\Model is the first ORM written in Zephir/C languages for PHP, giving to developers high performance when interacting with databases while is also easy to use.


    Т.е. формально есть класс Phalcon\Mvc\Model, и в нем есть методы - но они все пустые, и даже если закомментировать:
    public static function __callStatic($method, $arguments) {}

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

    Т.е. с этой магией, которую творит фалкон, приходится только смириться.
    Ответ написан
  • Будет ли жить Phalcon?

    @HellWalk
    Нет

    "Повезло" столкнуться с ним после работы с Laravel/Yii2 - был в шоке от убогости и недоразвитости этого "фреймворка".
    Ответ написан