Задать вопрос
  • Как отрендерить на бэкенде vue компонент с пропсами?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Зачем рендерить на пхп? Подними ноду, напиши там ССР сервак и пусть дергает твой бекенд сколько угодно. v8 в пхп это какая-то дичь.
    Ответ написан
    Комментировать
  • Хорошие практики тестирования в Laravel проектах?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Feature - это end-to-end тесты. Ты берешь данные, отправляешь на эндпоинт и проверяешь ответ/статус выполнения задачи. Из этого следует, что никаких под-директорий там быть не может - максимум одна для API, одна для Web, и, если сильно хочется, то одна для CLI. В таких тестах НЕ должно быть моков, подмены зависимостей или чего-либо еще, что мешает полному тестированию эндпоинта от начала и до конца.

    Обычно пишу по одному на каждый эндпоинт, типа GamesListTest для /api/games.

    Unit - юнит тесты. Должны тестировать один класс и мокать остальные зависимости. Тут можете тестировать отдельно контроллеры, джобы, репозитории, сервисы и что-либо еще, что вам вздумается. Все депенденси этих классов нужно подменять и проверять входные аргументы (как можно тщательней, mockery + hamcrest-php).

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

    Всегда использую snake_case - так читаемей. assert'ов может быть хоть миллион - за этим вообще не слежу. Разбиваю тесты на методы чисто по логике и нужде - как проще, так и делаю. Лично у меня тесты лежат в "модулях", а не в /tests, но дефолтная структура - неплохой вариант для начала.
    Ответ написан
    4 комментария
  • Как группировать материалы с учетом ч/з?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Бекенд не знает об часовой зоне пользователя. От слова "совсем". Ему приходит UTC, он отдает UTC. Хочешь смещение - делай групировку на фронте (где она и должна быть, кстати).
    Ответ написан
  • Как иметь две версии файла, что бы 1 видел git, а другую сервер?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    В твоем случае есть прекрасная штука - environment variables. Добавляешь .env файл в проект, в конфиге ссылаешься на его переменные и игноришь .env .gitignore'ом. Так делать правильно.
    Ответ написан
    Комментировать
  • Как я могу превратить Laravel в подобие Lumen (отключить ненужные функции для скорости)?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    config/app.php

    Но чую, что производительность страдает не по этой причине.
    Ответ написан
    Комментировать
  • Как заменить whereHas, ибо он слишком медленный?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    whereHas делает обычный exists. Он даже и близко не медленный. Проблема в отсутствии индексов (на categories.name и в колонках, связывающих две таблицы).
    Ответ написан
    2 комментария
  • Куда размещать бизнес логику приложения laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Изначально затея MVP была в этом:
    View должно было быть представлением данных, глупым представлением, которое всего лишь смотрит на изменения полей Model и обновляет вид для юзера
    Controller должен был отвечать за ввод и вывод информации пользователю. Никакой бизнес логики - лишь команды и ответы.
    Model должен был быть представлением данных. Это не значит, что модели должны быть "толстыми" - это значит, что должны быть другие части приложения, отвечающие за бизнес логику. Не модель. И уж точно не та "модель", наглухо связанная с базой данных.

    А теперь мое имхо:
    1. Контроллеры принимают запрос, валидируют, достают авторизированного юзера, проверяют пермишены. Вызывают ОДИН метод какого-то класса, форматируют результат и отдают.
    2. В моделях только логика БД. Никакой бизнес логики от слова "совсем". Никаких зависимостей. Ничего.

    Всю логику выносить куда-то. Логика не должна знать о том, что это HTTP - и.е. никаких обьектов HTTP запросов, никаких HTTP ответов, никаких HTTP ошибок. Если нужен 404 - создается эксепшен под юс кейс (типа UserNotFoundException), а в контроллере ловится и переделывается в NotFoundHttpException. Никак иначе.
    Ответ написан
    3 комментария
  • Fastcgi_finish_request Laravel, php?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    \fastcgi_finish_request()
    Ответ написан
    Комментировать
  • Как правильно сортировать в laravel 5.7?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    sortBy? Это что, метод коллекции?)

    orderBy должен быть, и в билдере, а не на коллекции.
    Ответ написан
    Комментировать
  • Как должна быть устроена аутентификация в SPA-приложении на Laravel+Vue?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Используйте либу Socialite + socialiteproviders. При редиректе они вам отдадут юзера нужной соц. сети. Делаете все что хотите с этими данными, айдишку можете либо записать, либо выкинуть. Дальше все как и обычно, с пасспортом или без.
    Ответ написан
    Комментировать
  • Может ли быть API не как API?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Нет, не "должен", но может. Лично я пришел к такой схеме:
    - 200-ые статус коды отправляются ТОЛЬКО тогда, когда все прошло успешно. В таком случае не будет никаких success: true или response: {} - а нужные данные, прямо на первом уровне нестинга. Собственно если взять за правило, что 200-ые коды возвращаются когда все ок, то можно полностью избавлятся от этих плохих проверок на наличие ключа в респонсе.
    - 400-ые и 500-ые будут попадать в отдельный колбек/реджектить промис, опять же избавляя от нужды проверять какие-то ключи. Для всех кодов ответов, кроме 400 и 422 - в ответе нету нихрена. Ни code, ни message, ни response. Вообще ничего. Вся инфа находится в самом http status коде. Для 400 и 422 прибавляется параметр code, который является номером ВНУТРЕННЕЙ ошибки (ну, например, есть какие-то предусловия для выполнения запроса - уникальность эмейл адреса при регистрации как пример) - по ней фронт может показывать отдельные ошибки либо выполнять какую-то логику.

    Плюс ко всему этому у себя локально и на сервере для фронта включен дебаг, добавляющий некий параметр _debug к каждому ответу. В нем может хранится любая инфа - сообщение с ошибкой (даже если ее можно понять по http коду или внутреннему), стак трэйс 500-ой ошибки и тд.
    Ответ написан
    Комментировать
  • Как построить URL для данного роута?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    $router->get('profiles', 'ProfileController@index');
    $router->get('profiles/{id}', 'ProfileController@show');


    Это два разных раута. Обрабатывать их нужно в разных местах.
    Ответ написан
    1 комментарий
  • Как получить данные webhook, которые приходят с jira?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    laravel уже имеет все что нужно для вашей задачи. Если данные не приходят, значит их там в принципе нет, либо у вас неправильный http method. Читайте документацию.
    Ответ написан
    Комментировать
  • Как добавить Rule в validator так, чтобы правило сработало после основной проверки?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Есть правило, называется bail. Добавляете к каждому полю и валидатор будет сыпатся как только хотя бы одна проверка не пройдена, а значит к вашему кастомному правилу очередь не дойдет.

    Плюс к тому в кастомное правило не нужно передавать никаких реквестов - в метод passes() правила передается все что нужно:
    passes($attribute, $value, $parameters, $validator)


    Передаете в конструктор правила только название какого-то дополнительного поля - типа time_from.
    Ответ написан
    4 комментария
  • Как передать переменную в Laravel Resource Collection?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    В базовый класс коллекции
    /**
         * Create new anonymous resource collection.
         *
         * @param mixed         $resource
         * @param callable|null $each
         *
         * @return AnonymousResourceCollection
         */
        public static function collection($resource, callable $each = null)
        {
            $collection = new AnonymousResourceCollection($resource, \get_called_class());
    
            if ($resource && (! $resource instanceof MissingValue) && $each) {
                $collection->resource->each($each);
            }
    
            return $collection;
        }

    и в контроллер
    $check = true;
    
    return ProjectResource::collection($projects, function (ProjectResource $resource) use ($check) {
        $resource->setCheck($check);
    });
    Ответ написан
    7 комментариев
  • Какой монитор для кодинга 2019?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Взял себе 27" VA 1440p - все нравилось, пока на экран мака не глянул :) Бери IPS, 4k, что бы PPI был от 200. Даже с 1440p такого ты не добьешься.

    На счет шлейфов - тут либо один очень дорогой моник для работы и игр, либо один для игр, а второй - для работы.
    Ответ написан
  • Как вы тестируете сортировку в Laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    $this->assertEquals($books->pluck('id')->toArray(), Arr::pluck($response['books'], 'id'));

    Под термин "красиво" не подпадает, но работает. Второй вариант - написать свой constraint для order'а, типа
    $this->assertOrder([
        new SimpleOrderComparator('title', Comparator::ASC_ORDER)
    ], $response['books']);

    и убрать вообще $books - я так делал на работе, но там orderBy'и были намного сложнее.
    Ответ написан
  • Как контролировать версии файлов веб проекта?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Да, бывают. Называется git. Это то, что ваши программисты скорее всего использовали.

    Но это их инструмент, а не ваш. Вы не знаете, что они там меняли, и изменения могут быть несовместимы с вашим дата-сетом (кэш-серверами, как редис, базой данных, .env файлом и так далее) на продакшене, поэтому откатывать какие-то изменения без участия программиста - очень опасно.

    Ваша проблема в том, что программисты не пишут тесты и не тестируют сами, у вас нету тестеров и нету staging'а (сервера, на который попадают все изменения для тестировия сразу до продакшена). Вам нужно менять workflow.
    Ответ написан
    Комментировать