• Dependency Injection на пальцах?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    DI позволяет создать единый "реестр", где вы можете указать какие классы будут синглтонами (и.е. один и тот же экземпляр каждый раз), а какие создаваться фабриками (и.е. каждый раз создавать новый экземпляр). Более того, в тех же классах вы можете "подтягивать" нужные вам зависимости (экземпляры классов) просто указывая нужный класс, а DI берет на себя работу того, как именно он получит эти экземпляры. Он упрощает вам жизнь, ибо вы можете один раз указать ЧТО вам нужно вместо того, что бы получать это самому. Более того, в любой момент вы можете подменить одну зависимость на другую. Например, есть у вас интерфейс и два класса его реализующие. Во всем приложении вы общаетесь только с интерфейсом, а в DI вы указываете какой из них будет использоватся, причем это можно менять "на лету".

    Кроме того вы можете строить бесконечные дерева зависимостей классов и даже делать два класса зависимыми один от другого, указывая правила их резолвинга в DI.
    Ответ написан
    Комментировать
  • Как совместить laravel и vue проект?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Ну тогда не переносите. Бекенд вешаете на сабдомен или на префикс (лучше первое) ну а домен на фронт направляете.
    Ответ написан
    Комментировать
  • Какой посоветуете пример реализации сайта на laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Кратко: в опен-сорсе таких нету, да и в целом такие попадаются редко.
    Ответ написан
    Комментировать
  • Обновить пароль но не всегда?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Используешь FormRequest и после:

    $user->update($request->validated())

    А пароль ларька сама закриптует. Либо если нет, то делаешь мутатор в модельке.
    Ответ написан
    1 комментарий
  • Можно ли зарегистрировать новый оператор для Query Builder в Laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Можно. Используйте mixin'ы: *тык*

    После этого прописываете в вендоре @method в докблоке. Да, решение очень далеко от идеала, но имеем что имеем :/
    Ответ написан
    Комментировать
  • Как правильно сделать?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Чито? Нажимая на кнопку, вводя название в поиск - изменяете стейт (data или vuex) и по клику, либо по событию загружаете список с вашим поиском и сортировкой, и опять же записываете в стейт.

    И используйте уже ES2015 :/
    Ответ написан
    Комментировать
  • Как создать опрос в телеграмм боте на laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    laracasts.com - просматриваете все, покупаете подписку и смотрите еще тонну (по laravel). Раскажут вам про все, что вам нужно.
    Ответ написан
    Комментировать
  • Как убрать локализации в контроллерах laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    В миддлвейре ДО вызова $next($request):
    $request->route()->forgetParameter('locale');
    Ответ написан
    Комментировать
  • Нужно ли ставить точку с запятой после возвращаемой функции?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Если везде используете точку с запятой - там тоже ставьте. Если нет - то нет.
    Ответ написан
    Комментировать
  • Как правильно возвращать ошибки в своем API, Laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Единого формата ответа с ошибками от http api не существует. Есть некие претенденты, но это такое. Возвращать - не надо, надо кидать эксепшены и обрабатывать в хендлере. Лучше - если будет какой-то один базовый class AppException, с помощью которого вы сможете контроллировать соответствие ваших же кастомных ошибок на наличие нужных полей (кода, http кода, сообщения, мета инфа). Как делаю я (пока что прокатывает):
    1) с сервера отдаю к каждой уникальной ошибке (например той, что выходит за рамки валидатора) свой код ошибки, как с error_code. У тривиальных ошибок (типа not found или validation) - их нет, так как на нее указывает http код (типа 404 и 422).
    2) так же к каждому эксепшену в коде пишу месседж, который так же отдаю в ответе во время разработки. На продакшене вырубаю дебаг и меседж пропадает из ответа от сервера, остается http код и "свой код".

    Если говорить только об validation error, то делаю как с error_details, а потом фронтер разбирается с этим так, как оно вписывается в дизайн.
    Ответ написан
    Комментировать
  • Laravel vue-router на многостраничном сайте можно сделать?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Многостраничный сайт - и.е. обычный, с HTTP раутингом, где используются силы раутера laravel и какой-нить шаблонизатор там же? Если да, то причем тут vue-router?

    vue-router нужен для SPA (single page application), то есть там, где переход по ссылке на какой-нить внутренний ресурс лишь дергает JS, то-есть весь фронт - крутится только в браузере, а на бек (и на раутер laravel) - летят только ajax запросы. Сам по себе к laravel не имеет вообще никакого отношения, равно как и vue.

    Причем тут пакеты - не понимаю. Бекендовские, из composer'а? Ну они вообще не связанны с vue-router. Фронтовские, из npm? Ну я таких не знаю, но смею предположить, что те дают лишь какие-то готовые компоненты, в лучшем случае, а раутер никто трогать не посмеет. Ну и даже если посмеет - что с того? Вам прийдется передать его инстенс куда-то в либу (кто как напишет), но об этом будет четко указано в документации.

    Здается мне, что вы не понимаете что такое vue, vue-router, пакеты и многостраничные сайты. Ну или хотя бы что-то из этого :/
    Ответ написан
    7 комментариев
  • Почему hidden элементы видны в JsonResource?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Потому что вы обращаетесь к нему через магический геттер на обьекте ресурса ($this->email), который в свою очередь просто дергает тоже поле на ресурсе (модельке). $hidden у модели скрывает поле только при ->toArray(), но оно все еще есть в аттрибутах.

    Все логично и так и должно работать) Выходы:
    1) убирать 'email' => $this->email из ресурса
    2) делать
    class UserResource {
        private $includeEmail = false;
    
        public function toArray($request) {
            return [
                'email' => $this->when($this->includeEmail, $this->email)
            ];
        }
    
        public function includeEmail() {
            $this->includeEmail = true;
    
            return $this;
        }
    }


    И позже делаете return (new UserResource($model))->includeEmail(); в контроллере.
    Ответ написан
  • Как назвать модель в данном случае?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Зависит от того, один detail там или много. Например, если PriceDetail имеет key-value пары, то единственное число, если же набор захадкоденых параметров и связь one-to-one, то логичней PriceDetails.
    Ответ написан
    Комментировать
  • Какой роутер нынче хорош дома для гика?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Xiaomi mi mini, не бери тройку, прошиваешь padavan или openwrt и гикуешь сколько влезет, апаратно - может много)
    Ответ написан
    Комментировать
  • Как управлять ролями и правами Laravel 5 и VUE.JS?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Реализуется легко:

    на беке юзаете баунсер + $this->authorize/Gate::allows и проверяете нужные права, вне зависимости от фронта.
    на фронт с бека передаете берете массив пермишенов (абилитис в баунсере), в том же месте, где передаете юзера (не важно, отдельным запросом или сразу при загрузке страницы). Пишите во vuex'е нужные геттеры, как пример из моего проекта:

    export const can = (state) => (perm) => this.loggedIn(state) && state.authUser.abilities.includes(perm);
    export const canAny = (state) => (perms) => perms.some(x => this.can(state)(x));


    И юзаете директивы где нужно, предварительно импортнув нужные геттеры:

    v-if="can('chat.mute')"

    PS: не стоит писать свои директивы "v-can", ибо:
    1) они не информативны (непонятно, что они делают, если прав нет)
    2) прийдется написать с десяток таких, на все случаи жизни, типа "can-show", "can-if" и прочая лабудень.

    PS2: про "переход по страницам" и любые запросы на бек - ларавель сам кинет forbidden 403, проверяете интерцептором в axios'е на этот статус и кидаете на страницу с ошибкой/показываете окошко/нотификацию/птичку/кошку.
    Ответ написан
    Комментировать
  • Как преобразовать int[] в byte[]?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    int[] data = { 100, 200, 300, 400 };
    
    ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);        
    IntBuffer intBuffer = byteBuffer.asIntBuffer();
    intBuffer.put(data);
    
    byte[] array = byteBuffer.array();


    PS: stackoverflow
    Ответ написан
    3 комментария
  • Как правильно обработать платёж, если сервер ПС иногда падает по таймауту?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Первое, что нужно сделать - почитать ответ @Adamos'а. Вторым делом, конечно же, сделать у транзакции (платежа) в базе данных какой-то статус, и проверять, не была ли она уже обработана перед этим.
    Ответ написан
    Комментировать
  • Как лучше организовать структуру урлов в Laravel?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    category_1 - нормально, а category/1 - не нормально? Полный бред. Вообще, в идеале, должно быть categories/1, ну да ладно.

    Но даже если учесть эту бредятину, то что мешает в where regex'е вписать конкретные правила, как например:
    Route::get('/{category_slug}', 'CategoryController@index')
      ->where('category_slug', '/category\_([0-9]+)/');


    ? Повторюсь, это ТУПОЙ подход, делать так не нужно.

    Про "общую таблицу" даже и не думайте. Да и повторюсь в третий раз, categories/1 и читается, и смотрится в сотни раз лучше, чем category_1. Сразу впечатление, что разработчик сайта не понимает, что такое restful api.
    Ответ написан
    Комментировать
  • Как задается проверка на устройство, которое послало запрос на сервер?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    HTTP хедер - User-Agent. Но это недостоверная информация, подделать ее элементарно.
    Ответ написан
    Комментировать