• Как в Nuxt/Vue вставить внешний JS с рендором в блок?

    @izheme Автор вопроса
    Ха, действительно всё работает! Спасибо. Клянусь, я вчера так пробовал, но что-то пошло не так.
  • Можете пояснить логику вызова функции по завершению асинхронной загрузки внешнего скрипта?

    @izheme Автор вопроса
    Спасибо, друг, помог быстро разобраться. Так же оставлю еще один пример, может кому-то поможет. Часто это используется для рендера какого-то виджета в сайт и тогда пример будет примерно такой:

    (function(w, n) {
      w[n] = w[n] || [];
      w[n].push({itemId: "1"});
    })(window, 'superItemWidget');
    
    
    
    // в скрипте подгружаемом асинхронно (или просто позже)
    
    // Гипотетическая функция, отвечающая за рендер виджета
    const renderItem = (option) => {
      console.log(option.itemId + 'is rendered');
    }
    
    (function(w, n) {
       // если уже есть в пространстве объекты для рендера, вызываем их рендер
       if (w[n]) {
         w[n].forEach((option) => {
           renderItem(option);
        });
      }  
    
      // Для добавляемых после загрузки вешаем рендер на push
     w[n] = new function () {
        this.push = function(option) {
            renderItem(option);
        }
      }
    })(window, 'superItemWidget');
    
    // Код страницы, обрабатываемый после загрузки внешнего скрипта:
    (function(w, n) {
      w[n] = w[n] || [];
      w[n].push({itemId: "2"});
    })(window, 'superItemWidget');
  • Как правильно использовать middleware в Laravel?

    Начнем с того, что вы зачем-то приводите кусок выдранного неотформатированного кода, в котором куча непонятных объектов и подходов. Это просто неуважение к сообществу. Ок, мы не тупые, разберемся.

    1.
    public function store(Request $request, StoreBlogTag $store)

    Ну мы типа поняли, что в StoreBlogTag хранятся правила валидации и ошибки для валидации для тэгов. Зачем это все нужно из текущего кода не понять. Как уже не раз отметили, все это можно заменить на Form Request Validation.

    2.
    $validate = Validator::make($request->all(), $store->rules(), $store->messages());
    if ($validate->fails()) {
        return redirect('post/create')
        ->withErrors($validate)
        ->withInput();
    };

    Зачем нам эта копипаста? Вы же вроде тэги создаете. А почему редиректите на `post/create` - как это можно понять? Что это нам вообще дает? Здесь какой-то специфический редирект? Иначе можно возложить это все на Ларавел и заменить на:
    Validator::make($request->all(), $store->rules(), $store->messages())->validate();

    Хотя, опять же не понять, зачем вообще делать валидацию через make?

    3.
    $tag = Tag::firstOrCreate([
    'title' => $request->input('title'),
    'slug' => Str::slug($request->input('title'), '-'),
    ]);

    Зачем вообще в данном случае приводить такой сложный пример? Нельзя что ли простой create с mass-assignment привести? Зачем делать проверку по двум полям? Почему slug генерируется в контролере? Для slug вообще полно готовых решений в виде трэйтов.

    4.
    $tag->save();
    Это типа, если вдруг, с первого раза не сохранилось (метод firstOrCreate создает запись в БД), еще раз сохраним для подстраховочки :)

    Короче, вот пример для топикстартера (возврат ресурсов т.к. это API):
    class BrandController extends Controller
    {
        //    [...]
        public function store(SaveBrand $request)
        {
            $brand = Brand::create($request->all());
            return new BrandResource($brand);
        }
    
        public function update(SaveBrand $request, Brand $brand)
        {
            $brand->update($request->all());
            return new BrandResource($brand);
        }
    }

    +
    class SaveBrand extends FormRequest
    {
        public function authorize()
        {
            return true;
        }
    
        public function rules()
        {
            $rules = [
                'name' => [
                    'required',
                    'max:100',
                    Rule::unique('brands')->ignore($this->id)
                ],
                'url' => [
                    'required',
                    'max:100',
                    'url',
                    Rule::unique('brands')->ignore($this->id)
                ]
            ];
    
            // Позволяет редактировать по одному полю в запросе
            if ($this->method() == 'PATCH') {
                foreach ($rules as $key => $item) {
                    array_unshift($rules[$key], 'sometimes');
                }
            }
    
            return $rules;
        }
    }

    +
    class BrandResource extends JsonResource
    {
        public function toArray($request)
        {
            return parent::toArray($request);
        }
    }
  • Как определить окончание работы ряда Job задач в laravel?

    Александр Михайленко, честно, я не понимаю, что вы хотите. Как я понимаю, ваш фронт, после отправки запроса в очередь, начинает делать AJAX запросы на ендпоинт и анализировать ответы. Это ведь нормальный работающий механизм. Если у вас из-за этого очень много запросов AJAX и сервер испытывает сложности под запросами, то переходите на сокеты. Если нет, оставьте как есть.

    Как себя должен вести фронт если выполнены 3 из 4 задач - никто не знает - это ваша бизнес логика. Если вы запускаете задачи не последовательно, то никаких последних там нет. И только вашему приложению может быть ведомо, что надо делать при выполненном наборе задач.
  • Почему не сохраняется сессия в laravel в некоторых браузерах?

    Мало инфы. Как себя ведут кукисы с индетификатором в проблемных браузерах - сохраняются и передаются на сервер?
  • Как проверять разрешения пользователей в nuxtjs приложении?

    not_cool, роли и правила в любом случае придется хранить на бэкенде и перепроверять права при запросах, т.к. фронтенду ну никак нельзя доверять. Чтобы не писать два раза, можно получать права с бэкенда. Кстати тут есть пример. Auth не занимается подобным, но нет никаких сложностей использовтаь CASL поверх auth.

    Как устроено приложение? SPA, SSR? Что на бэкенде?
  • Как дождаться записи значения в сессию?

    Troodi Larson, метода save нет в документации, потому что не надо вызывать его вручную. Он должен вызываться автоматически. Твой код его не вызывает. Я уже несколько раз обратил внимание, что все крутится вокруг проблемы вызова этого метода. Находи его в исходниках, ставь там дебагер и смотри, что и когда он сохраняет.
  • Как дождаться записи значения в сессию?

    Troodi Larson, не понять ничего из твоих объяснений. Это в рамках одного запроса или нет? Зацепись за метод save() и отдебаж его вызовы, может тогда поймешь, где ты прерываешь нормальный ход событий. Если это разные запросы, то, возможно ты прерываешь скрипт до записи в хранилище сессии или еще что-то.
  • Как дождаться записи значения в сессию?

    Troodi Larson, без кода не понять. Но асинхронности там быть не может. Можно вообще забыть про редис, это всего лишь хранилище. Когда ты сохраняешь в сессию, и ниже по коду обращаешься к сессии, никакого чтения из редиса не происходит. В приведенном выше коде, ты напрямую делаешь save. Может ты пробуешь не из объекта ларавельской сессии читать, а напрямую из редиса? Конечно, в редисе еще ничего не будет. Т.к. сэйв в хранилище происходит позже.
  • Как дождаться записи значения в сессию?

    Troodi Larson, я понимаю, что можно заставить PHP работать асинхронно, но то что ты рассказываешь, явно не подразумевает асинхронности. Так откуда ты берешь асинхронность? Может ты просто не сохранял сессию или не перезагружал модель?
  • Какие проблемы прямой вставки кода виджета в код стороннего сайта?

    @izheme Автор вопроса
    Павел Корнилов, для сброса стилей есть all :) Я думаю, что вы не до конца поняли вопрос. Если мы сбросим стили внутри виджета через !important, то мы уже не сможем изменить их из внешнего сайта.
  • Какие проблемы прямой вставки кода виджета в код стороннего сайта?

    @izheme Автор вопроса
    Павел Корнилов, не могу признать ваш ответ решением вопроса. Я не увидел в ваших ответах реального решения проблемы. К сожалению, вы не ответили как разрулить ситуацию, а просто указали что во внешнем сайте (который не контролируется обсуждаемым сервисом) используется плохая практика (для заметки, приведенное в ситуации CSS правило и без !important все cломает, если мы его не переопределим).

    Я придерживаюсь мнения, что использование в данной задаче веб компонентов с их Shadow DOM позволяет решить все проблемы. Можно использовать и iframe, с дополнительными плюшками, позволяющими загрузить в него стили из внешнего сайта.

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

    @izheme Автор вопроса
    Павел Корнилов, так использовать id в css #parent #app_body тоже плохая практика. Но если делать виджет, то надо ведь понимать и принимать, что во внешних сайтах будет плохой код.

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

    @izheme Автор вопроса
    Павел Корнилов, как разруливать, если во внешнем сайте будет безумие типа:
    div > div {
       display: flex !important
    }

    Да там может, что угодно быть. Это же абстрактный водрдпресс-сайт в вакууме :) . Получается, что каждый наш DOM элемент надо охватить CSS свойствами с !important (гарантировать сброс до нужных нам). При этом, изменить эти свойства из вне уже не получится. Ведь так?
  • Какие проблемы прямой вставки кода виджета в код стороннего сайта?

    @izheme Автор вопроса
    Николай, спасибо за глубокой ответ. Насчет JS. Я не сильный JS программист (занимаюсь другой областью), знаю об указанных вами способах. Согласен, что в JS проблем должно быть меньше. Но я не уверен, что совсем не будет. Я немного поиграл с существующем кодом (а он написан на Vue + Vuetify), попробовал вставить его в сайт с Vue. И получил конфликт именно от Vuetify. Я не копал далеко, возможно надо лучше изолировать, возможно Vuetify как-то хитро обращается, т.к. он выдает такую ошибку: [Vuetify] Multiple instances of Vue detected (при этом вариант без Vuetify конфликтов не дал). Я просто не уверен, что изолирование может быть панацеей в JS. Если я правильно понимаю, в конечном итоге, через windows это все можно вытащить. Или я не прав?

    Я тоже склонен к iframe, даже скорее к вебкомпоненту. Просто, даже такие вещи, как input range являются shadow DOM, а не прямой вставкой. Поэтому, прямая вставка меня очень настораживает. CSS, как вы верно отметили - 100% батхерт!
  • Какие проблемы прямой вставки кода виджета в код стороннего сайта?

    @izheme Автор вопроса
    Проблема входящих данных в этом случае ничем не отличается от проверки любых данных. Для сервера все приходящие данные, можно считать, что "с неизвестного сайта".

    За JS я особо не переживаю. Просто я не сильный JS программист (занимаюсь другой областью), поэтому уточнил о нэймспэсах, учитывая, что это Vue и браузер, со своим windows объектом. Но вот как можно в этой ситуации разрулить CSS, при этом ни разу не поимев проблем, я даже не представляю.