• Где найти бесплатную литературу по иностранным языкам - эстонский, финский, японский?

    glaphire
    @glaphire
    PHP developer
    1) в большинстве других стран тщательнее следят за авторскими правами и их нарушением, поэтому их сложнее найти
    2) самый эффективный способ поиска - создать "нативный запрос", перевести поисковую фразу на нужный язык и делать запрос на нем. На книги на эстонском или японском в оригинале при запросе на русском или английском просто не наберется рейтинг в поисковой выдаче, чтобы отобразить релевантные результаты на первой странице. Сама пользовалась этим приемом для других языков и книг/журналов.
    3) duckduckgo может отобразить результаты, которые гугл банит за нарушение прав
    Ответ написан
    3 комментария
  • Как передать данные сообщения в шаблон письма Lumen/laravel?

    glaphire
    @glaphire
    PHP developer
    Традиции есть традиции - ссылка на доку первым делом)
    https://laravel.com/docs/8.x/mail#via-the-with-method
    Там даже два способа - один через with, второй через свойства класса.
    Ответ написан
  • Есть ли какой-то смысл делать сайт на symfony вмето laravel, с пиковой посещаемостью 10 000?

    glaphire
    @glaphire
    PHP developer
    Нет. Фреймворк тут играет последнюю роль. 10000 человек в день это немного, меньше одного запроса в секунду в среднем, надо смотреть на нагрузку в пике. В любом случае надо анализировать слабые места - запросы к базе, количество веб серверов для обработки запросов, возможность кеширования и асинхронной обработки...
    UPD. У Вас в вопросе написано и пиковая нагрузка 10000, и 10000 за день, что в итоге?))
    Все равно результат нужно сводить к предварительному профилированию и только потом к тюнингу серверов или рефакторингу
    Ответ написан
    5 комментариев
  • Undefined Index при попытке создать связь между сущностями?

    glaphire
    @glaphire
    PHP developer
    Такая ошибка вылезает если объект в связи уже не в объекте UnitOfWork. Эта ошибка может быть вызвана неправильной версией доктрины ( на гитхабе были issues), но мне кажется что Вы не должны добавлять flush после каждого persist здесь, т.е. надо сделать персист юзера, заказов и добавленных продуктов, а потом уже все зафлашить один раз
    Ответ написан
    7 комментариев
  • Как сделать динамический OneToMany в Doctrine?

    glaphire
    @glaphire
    PHP developer
    Это похоже на наследование таблиц (inheritance mapping), но могут быть издержки с поддержанием такого решения (с чужих слов)
    Ответ написан
    Комментировать
  • Как протестировать метод контроллера в Symfony5?

    glaphire
    @glaphire
    PHP developer
    Раньше с таким не сталкивалась, но есть момент в описании вопроса - просто сделать эхо контента и exit не выйдет, чтобы вывести файл нужно еще добавить заголовки контента, размер файла и способ вывода. Т.е. в таком виде как метод контроллера есть сейчас я не понимаю, как он может корректно работать)
    Даже если без доработок, то для предотвращения вывода контента файла в консоль достаточно использовать ob_start() и ob_get_clean().

    Доработала пример:
    Контроллер:
    <?php
    
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\BinaryFileResponse;
    use Symfony\Component\Routing\Annotation\Route;
    
    class TestController extends AbstractController
    {
        /**
         * @Route("/get-image", name="get_image")
         */
        public function getImage()
        {
            $path = "/home/dariia/Code/sf5_http_kernel_course/public/uploads/article_image/lightspeed-5f687f2402b6f.png";
    
            $response = new BinaryFileResponse($path);
    
            return $response;
        }
    }


    Тест:
    <?php
    
    namespace App\Tests\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
    
    class TestControllerTest extends WebTestCase
    {
        public function testRegister()
        {
            $client = static::createClient();
            ob_start();
            $client->request('GET', '/get-image');
            $client->getResponse()->sendContent();
            $this->assertResponseIsSuccessful();
            $this->assertResponseHeaderSame('Content-Type', 'image/png');
            ob_get_clean();
    ...

    Дальше можно добавить ассерты на тему размера файла, имени и т.д., просто нужно иметь какую-то привязку к файлу, чтобы этими данными манипулировать, а я упростила пример)
    Ответ написан
    5 комментариев
  • Как обеспечить безопасность проекта при использовании пакетов из Composer?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    1) Каждая версия php имеет свой набор уязвимостей, нужно держать у себя пакеты, которые работают с последними версиями php
    2) Для проектов существуют платные сканеры безопасности (vulnerability или security scanner), они могут обнаружить уязвимости в том числе и в пакетах
    3) если какая-то логика критически важна и нет доверия к готовым пакетам, то можно написать свой пакет с нуля и подключать его из закрытого корпоративного репозитория
    Ответ написан
    Комментировать
  • Можно ли подставить в IN строку sql запросе?

    glaphire
    @glaphire
    PHP developer
    SELECT `rus_category` FROM `categories` WHERE `id` IN (SELECT id_categories FROM products)

    Mysql не может автоматически вынуть значения колонки из таблицы, нужно указывать это явно)
    Ответ написан
  • Как протестить api symfony?

    glaphire
    @glaphire
    PHP developer
    Если речь о запуске локального сервера то
    php -S localhost:8080 -t public/
    (Порт может быть другой, если sf версии 3 и ниже то вместо public указать web)
    Ответ написан
    Комментировать
  • Можно ли как-нибудь проверить свои знания laravel, symfony или любой другой технологии?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Проще всего найти "топ 20 вопросов по фреймворку" (на английском, там свежее), если бегло можешь ответить на них то понимание есть, сложные тесты есть только в платных сертификациях
    Ответ написан
    Комментировать
  • Как получить конфиги из services.yaml в тестах?

    glaphire
    @glaphire
    PHP developer
    В задаче есть два момента:
    1) не понятно, настроили ли Вы запуск под test окружением
    дока Symfony и заметка про настройку окружений
    2) К параметрам можно доступаться через контейнер
    $client = self::createClient();
        $normalContainer = $client->getContainer();
        $param = $normalContainer->getParameter('param_name');

    или делая autowiring (описывать в services.yaml инжект параметра в конструктор класса, но кажется с тестами такой номер не проходит)
    Ответ написан
    1 комментарий
  • Почему пользователь Симфони (или Докера?) называется 82?

    glaphire
    @glaphire
    PHP developer
    Это пространство системы, симфони тут ни при чем)
    82 это айди юзера www-data в alpine.
    Ответ написан
    4 комментария
  • Как установить через composer?

    glaphire
    @glaphire
    PHP developer
    Только что попробовала на php 7.4, пакет установился в композер, при этом не настраивала что-то дополнительно.
    Первый фронт работ - проверить настройки вывода ошибок в php cli.
    Второй фронт - сделать composer self-update.
    Третий - запустить композер с максимальной verbosity
    composer require thiagoalessio/tesseract_ocr -vvv
    Там будет хотя бы видно последний шаг, на котором что-то идет не так.
    Ну и даже в логе композера у Вас сейчас видно:
    running composer update  thiagoalessio/tesseract_ocr
    , т.е. в composer.json он уже есть, иначе бы он так не писал.
    Ответ написан
    9 комментариев
  • Как настроить права в Docker?

    glaphire
    @glaphire
    PHP developer
    Возможно что-то не до конца скопипастила, просто нет живого проекта под рукой. Для своих пет проектов я настроила работу докера из под моего обычного юзера системы. Сначала сделала так, чтобы docker и docker-compose работали от юзера (есть инструкция в интернете, надо пошаманить с группами юзеров), потом в docker-compose.env добавила такое
    #run echo $(id -u):$(id -g) and copypaste it to HOST_USER variable
    #HOST_USER is needed to run docker containers under current user on host machine
    HOST_USER=1234:1234

    Потом в docker-compose.yml
    version: "3"
    services:
        nginx:
            image: nginx:latest
            ports:
                - "8081:80"
            volumes:
                - .:/app
                - ./docker/nginx/:/etc/nginx/conf.d/
            depends_on:
                - php-fpm
            working_dir: /app
            networks:
                - internal
        php-fpm:
            user: ${HOST_USER}
            working_dir: /app
            build:
                context: ./docker/php-fpm
                dockerfile: Dockerfile
            volumes:
                - .:/app
                - ./docker/php-fpm/log/:/var/log/
                - /etc/group:/etc/group:ro #####вот
                - /etc/passwd:/etc/passwd:ro #####вот
            ports:
                - '9000:9000'
            networks:
                - internal
            environment:
                XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1"
                PHP_IDE_CONFIG: "serverName=PHPSTORM"

    В докерфайлах ничего не дописывала. У меня это только для php-fpm, но думаю что для nginx и mysql можно делать по аналогии
    Ответ написан
  • PhpStorm, как определить своё значение свойства?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Думаю что в коде какая-то ошибка и шторм правильно ругается (неправильно настроены конфиги или класс для второй базы данных).
    Самый простой способ - перед запросом сохранить $this->db2->database в переменную и над ней написать phpdoc с описанием, что она возвращает, потом уже подставлять $databaseName2 в запрос.
    /**
     * @var string $databaseName2
     */
    $databaseName2 = $this->db2->database;

    Замечание по коду - не надо так подставлять значения в строки, лучше использовать sprintf() или подставлять только итоговую переменную, а не обращение к объектам по цепочке.
    Ответ написан
    7 комментариев
  • Что лучше редиректы или цепочка обязанностей?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    В чистом виде мидлвар как в ларавеле тут нет, нужно использовать продуманный роутинг, behaviors, хуки контроллера или глобальные компоненты (все зависит от задачи)
    Ответ написан
  • Как разработать веб-систему для изучения иностранного языка?

    glaphire
    @glaphire
    PHP developer
    На текущем этапе стоит создать корректную базу данных со всеми связями и нормализацией.
    Также расписать все процессы в виде блок-схем, что куда и зачем идет, потому что без нормального тех.задания код нормальным не будет - независимо от языка и фреймворка.
    В остальном пока не разберетесь с PHP по какому-то из популярных учебников, то рассказывать придется слишком много - это просто базовая информация, на которой потом и можно простроить проект. У популярных CMS есть подвохи - они не по всем аспектам гибкие и дорабатывать какой-то функционал может быть слишком муторно (админка под "обучение по алгоритму"). На фреймворках это можно сделать, но опять же знаний PHP и ООП у Вас нет, поэтому это будет только потеря времени, нужно сначала разобраться с основами. Не стоит недооценивать PHP - тут так же нужно изучить основные подходы в веб разработке, как и в python, ruby, серверном js или java)
    Ответ написан
    5 комментариев
  • Как изменять файлы?

    glaphire
    @glaphire
    PHP developer
    Правильно нормализуйте базу данных, а следом за ней и управление файлами:
    1) таблица users, таблица files с привязкой к юзеру, в files - id, user_id, original_name, extension(необязательно), abs_path. Имя файла нужно хранить по какому-то правилу, чтобы не было конфликтов.
    2) На стороне приложения нужно иметь экшены CRUD файла (read на свойства файла в таблице и отдельно read как просмотр файла или отдача на скачивание).
    3) Не нужно удалять все файлы, нужно на фронтенде выводить элементы управления на все файлы пользователя, которые будут вызывать экшены удаления файлов (условно список кнопок, нажатие которых вызывает экшен удаления конкретного файла).
    Часть из это у Вас уже есть, просто действительно сумбурно написано, надо отрефакторить так чтобы каждая вещь отвечала за свою логику, а не вперемешку, как сейчас
    Ответ написан
  • Как и где лучше хранить документы на сайте?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    1) создаете папку для документов за пределами публичной папки (той, в которой index.php и статика)
    2) создаете экшен для загрузки файлов, помещаете туда эти файлы, привязываете файл к пользователю на уровне базы данных
    3) отдача файла для просмотра должна производиться только через экшен (чтобы не было прямого доступа к файлу методом подбора урла), с проверкой, что только юзер и админы могут его просматривать
    Ответ написан
    Комментировать
  • Codeception, как ввести днные в поле поиска?

    glaphire
    @glaphire
    PHP developer
    В селектор достаточно вписать #search, указывать класс search-form не нужно
    Ответ написан