• Как проверить получаемый файл в API-тесте?

    @HellWalk Автор вопроса
    Решение найдено:

    $I->seeResponseEquals(file_get_contents('path_to_file'));


    Правда с excel такой трюк не выйдет - файл внутри себя хранит дату создания:

    <cp:lastModifiedBy>Unknown Creator</cp:lastModifiedBy>
    <dcterms:created xsi:type="dcterms:W3CDTF">2023-05-11T13:10:33+00:00</dcterms:created>
    <dcterms:modified xsi:type="dcterms:W3CDTF">2023-05-11T13:10:33+00:00</dcterms:modified>
    <dc:title>Untitled Spreadsheet</dc:title>


    По этому просто сравнить с локальным образцом не получится - файлы будут всегда разными.
    Ответ написан
    Комментировать
  • Стоит ли работать с Drupal в 2022?

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

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

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

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

    @HellWalk Автор вопроса
    Не смотря на наличие документации на которую сослался Денис Дерепко, она мало помогает в задаче подменить именно EntityManager, и именно когда к нему идет обращение в зависимостях через EntityManagerInterface.

    По этому отдельным ответом пишу решение:

    config/services.yaml:
    App\Proxy\EntityManagerProxy:
        decorates: 'doctrine.orm.entity_manager'


    Proxy-обертка (здесь оставив за скобками почему в документации декоратор, а в моем случае proxy) с нужным функционалом - чтобы EntityManager переподключался в базе в случае потери соединения с базой (а доктрина закрывает соединение в случае любой SQL-ошибки):

    class EntityManagerProxy implements EntityManagerInterface
    {
        private ObjectManager $entityManager;
        private ManagerRegistry $doctrine;
    
        public function __construct(ObjectManager $entityManager, ManagerRegistry $doctrine)
        {
            $this->entityManager = $entityManager;
            $this->doctrine = $doctrine;
        }
    
        /**
         * @param $object
         * @return void
         * @throws Exception
         */
        public function persist($object): void
        {
            $this->correctionConnect();
            $this->entityManager->persist($object);
        }
    
        /**
         * @return void
         * @throws Exception
         */
        public function flush(): void
        {
            $this->correctionConnect();
            $this->entityManager->flush();
        }
    
    
        private function correctionConnect(): void
        {
            // Для ошибок когда падает сама база или соединение с ней, например:
            // SQLSTATE[57P01]: Admin shutdown: 7 FATAL:  terminating connection due to administrator command
            // SQLSTATE[08006] [7] could not translate host name "postgres" to address: Temporary failure in name resolution
            // (например, когда на время падает контейнер с postgres)
            if ($this->entityManager->getConnection()->ping() === false) {
                $this->entityManager->getConnection()->close();
                $this->entityManager->getConnection()->connect();
            }
    
            // Для ошибки "The EntityManager is closed" (например, при ошибки SQL-запроса)
            if (!$this->entityManager->isOpen()) {
                $this->doctrine->resetManager();
                $this->entityManager = $this->doctrine->getManager();
            }
        }
        
        // Все другие методы для EntityManagerInterface перебрасываются напрямую на базовый EntityManager
    Ответ написан
    Комментировать
  • Две версии 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 комментариев
  • Как понять, что кэш сохранился в Redis?

    @HellWalk Автор вопроса
    Все, разобрался. Ожидаемо Symfony добавляет свой хеш к ключам.

    Посмотреть с каким ключом сохранилось значение можно через вывод всех ключей:

    127.0.0.1:6379> keys *
    1) "gTPBdlcdoq:270378f0-b29c-4bf6-b7d1-7a64d6e212ff"
    Ответ написан
    Комментировать
  • Область видимости метода?

    @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;
    
       // ...


    Двумя строчками в сущности добавляете два поля и их автоматическое заполнение. Избавите конструктор от двух параметров.
    Ответ написан
    Комментировать
  • Где в доктрине код, отвечающий за конвертацию filed_name в fieldName?

    @HellWalk Автор вопроса
    Нашел
    https://github.com/doctrine/inflector/blob/2.0.x/l...

    /**
         * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'.
         */
        public function tableize(string $word) : string
        {
            $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word);
    
            if ($tableized === null) {
                throw new RuntimeException(sprintf(
                    'preg_replace returned null for value "%s"',
                    $word
                ));
            }
    
            return mb_strtolower($tableized);
        }
    
        /**
         * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'.
         */
        public function classify(string $word) : string
        {
            return str_replace([' ', '_', '-'], '', ucwords($word, ' _-'));
        }


    За наводку спасибо BoShurik
    Ответ написан
  • Какие есть варианты повышения для вебмастера?

    @HellWalk
    Больная тема. Прошел этот путь.

    В дополнение к тому, что уже писали (что нужно переходить в чистые программисты), дополню.

    Забавно, но ценность специалиста иногда может зависеть только от одного названия резюме. Можно делать работу фулл-стека, поверхностно знать бэк и фронт фреймворки, при этом иметь должность "веб-мастер" и заниматься еще всякой хренью, типа SEO. Но стоит только изменить название резюме с "веб-мастер" на фулл-стек веб программист - и ценность такого человека в глазах рекрутеров сразу вырастает. Так что подтягивайте, если их нет, знания фреймворков, делайте себе аккаунт на github с примером простого блога на каком-нибудь laravel + vue.js и забудьте слово "веб-мастер"

    А также нужно помнить, что на рынке ценятся крутые специалисты, а крутым специалистом можно стать только в узкой области - соответственно после фулл-стека лучше переходить в чистый фронт или бек.
    Ответ написан
    Комментировать
  • Наследование классов в 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
    Ответ написан
    Комментировать
  • Почему Front end разработчику платят так же, а то и больше, чем Full-stack разработчику?

    @HellWalk
    Потому что на рынке ценятся крутые специалисты. А крутым специалистом можно быть только в узкой области.

    Фулл-стек - это путь вечного "немного во всем"

    Говорю это, как человек, который входил в web-разработку "веб-мастером" - это еще шире, чем фулл-стек - где ты и дизайном занимаешься, и наполнением, и SEO - лютый список обязанностей, с нулевой ценностью на рынке труда по итогу.

    Единственный плюс - понимание полного цикла веб-проекта, от разработки до продвижения и монетизации. Свои стартапы будет начинать проще, чем чистому бек-программисту, например.
    Ответ написан
    5 комментариев
  • Как бороться с дедлайнами от неквалифицированного начальства?

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

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

    Год работы есть - это уже хорошая база для дальнейшего поиска работы.

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

    P.S. Вообще удивляют люди, которые занимая ключевую позицию (а если вы на проекте один - значит вы и есть ключевая фигура на этом проекте, независимо от того, джун вы или синьер), совершенно не ценят себя. Это вы должны им условия ставить, и говорить, что если не сделают как вы хотите - уйдете. Тем более они сами говорят, что не могут других программистов найти.
    Ответ написан
    1 комментарий
  • Что делать и куда дальше двигаться веб разрабу после шарашки?

    @HellWalk
    Обучение было полным шлаком, изучал всё сам, так как от пар просто не было толку, а задания на подобие конкатенации строк продолжались до 4-го курса.

    Это норма (с)

    В итоге после написания сильно прогорел

    Что-то рано

    что делать?

    Во первых, выяснить, что вам нравится и чем вы хотите в жизни заниматься.

    Во вторых, если вам все же нравится программирование - то вопрос надо поставить так: "как выделиться среди других джунов?"

    Я эту задачу сделал так: пол года пилил браузерную MMORPG, и хоть по итогу там было ~5% функционала от полноценной игры - этого хватило, чтобы работодатели общались на собеседовании совершенно по другому. Правда, только после того, как понял, что на личные проекты никто не смотрит, и специально просил HR, чтобы перед собеседованием посмотрели мои проекты.

    Когда у меня был пример браузерной MMORPG + на github был сайт-блог на Laravel - процент приглашений был 65% (т.е. 2 компании из 3 собеседований по итогу присылали оффер).

    Ну и самое главное - что я пол года, пока пилил свою MMORPG, получал удовольствие. И сейчас, спустя 5 лет, продолжаю пилить, когда есть время.

    А если вам писать что-то свое на выходных в тягость - стоит задуматься, а ваша ли это область.
    Ответ написан
    Комментировать
  • Как публиковать коммерческие проекты в GitHub?

    @HellWalk
    Никак

    Хотите, чтобы был код на гитхабе - пишите на выходных свои пет-проекты, их код и выкладывайте.

    Большинство просто забивают на этот гитхаб и все. С другой стороны, это возможность выделиться среди других. Но у всего есть своя цена.
    Ответ написан
    Комментировать
  • Возможно ли создать хорошую игру одному?

    @HellWalk
    Мне 14, и это лето я решил посветить изучению языка c++, в то время , как мои одноклассники курят, и считают это чем-то крутым.

    Молодец, далеко пойдешь.

    Я хочу создавать игры на языке c++

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

    возможно ли, создать хороший проект одному?

    Можно.

    И вообще, какой уровень знаний нужен для этого?

    Чем сложнее игра - тем больший объем знаний нужен. Для какой-нибудь змейки нужны базовые знания C++. А для создания 3D MMORPG на своем движке понадобится огромный объем знаний.

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

    @HellWalk
    если судить объективно, проекты какой направленности(характера) должны быть в git, что бы заинтересовать компанию?

    Любой направленности. Будут смотреть не на сам функционал, а на качество кода.
    Ответ написан
    Комментировать
  • Как исправить конфигурационный файл phpunit.xml?

    @HellWalk
    Вот пример рабочего phpunit.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <phpunit bootstrap="./vendor/autoload.php"
             colors="true"
             convertErrorsToExceptions="true"
             convertNoticesToExceptions="true"
             convertWarningsToExceptions="true"
             stopOnFailure="false">
        <testsuites>
            <testsuite name="Test Suite">
                <directory>./tests</directory>
            </testsuite>
        </testsuites>
        <filter>
            <whitelist>
                <directory suffix=".php">./src/</directory>
            </whitelist>
        </filter>
    </phpunit>
    Ответ написан
    Комментировать
  • Какой смысл mock объектов для юнит тестирования своего кода?

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

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

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

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

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