• Как сделать авторизацию у SSR приложения?

    изначально я пробовал ваш вариант на firebase


    Не было у меня такого варианта, вы с кем-то меня путаете)

    В это время пользователь видит "войти" и всё остальное меню для разлогиненого пользователя.


    Так отдавайте прелоадер, в чём проблема-то, очевидное же решение)
    У меня, например, очень просто сделано - во vuex store лежит поле user и action fetchUser, который вызывается в mounted корневого компонента (то есть только на клиенте). Поле user может иметь одно из 3-х вариантов значений: null (при инициализации стора), false или объект юзера. fetchUser устанавливает либо false (если нет токена, токен протух, юзер удалён - короче, все случаи, когда юзер не залогинен), либо объект юзера (соответственно, если юзер залогинен). Дальше очень просто:
    <div v-if="user === null">Обожди, думаю я...</div>
    <div v-else-if="user === false">Сюда можно только авторизованным пользователям</div>
    <div v-else>Привет, {{ user.name }}!</div>


    На приватной странице поставил проверку на авторизированного пользователя, и в случае его отсутствия редирект на логин. Естественно при перезагрузки приватной страницы всегда идёт редирект, даже если ты залогинен, т.к. пользователь не успевает инициализироваться на клиенте (1,5-2 сек.)


    Ну, во-первых, нахер вообще юзера куда-то отправлять на другу страницу? Ему же можно прямо на той же странице показать форму, не надо редиректить никуда. Как это сделать - в моём предыдущем комменте написано. Ну и даже если вдруг ну никак без редиректа не обойтись - пожалуйста вам вариант с fetchUser:
    {
        mounted() {
            fetchUser().then(user => {
                if (user === false) this.$router.replace('/login');
            });
        }
    }


    В итоге самым правильным способом я посчитал тот, который вы описали последним


    Ну и очень зря, потом сами же с ним намучаетесь.
  • Как сделать авторизацию у SSR приложения?

    Никита Котенко, а почему нельзя редиректить на клиенте, что в этом плохого?)
    Ну и на самом деле редиректить вообще, возможно, не надо. Можно просто сделать страницу с вложенным роутером, на которой показывается форма для входа, если нет юзера. Если юзер есть - просто выводить router-view, который покажет вложенные страницы.

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

    Никита Котенко, просто фетчите данные юзера после загрузки страницы только на клиенте, с сервера можно (например) отдавать прелоадер какой-то
  • Как правильно сохранить модель в Laravel?

    Только здесь как бы лишний запрос выполняется на вытягивание поста, так что это не самый оптимальный вариант.
    Можно первый параметр заменить на int $postId, а при сохранении коммента тогда есть 2 аналогичных способа привязать этот id к нему:
    $comment = new Comment($req->all()); // если что, у коммента можно определить $fillable, чтобы не париться с определением списка полей в контроллере
    $comment->post_id = $postId;
    // или
    $comment->post()->associate($postId);
    $comment->saveOrFail();


    Если в миграциях нормально настроены внешние ключи, то при несуществующем $postId saveOrFail будет ругаться.
  • Как правильно реализовать работу с пользователем в изоморфном js приложении?

    Роман, я не знаю, как это сделать лучше в реакт, но на vue у каждого компонента vue есть т.н. lifecycle hooks. Как минимум 2 из них вызываются только на клиенте - beforeMount и mounted. То есть ничего проверять не надо, просто пишем код в тех местах, которые в принципе выполняются только в браузере.

    С состоянием понимаю проблему. На примере загрузки данных пользователя я решал это примерно так: у поля user в хранилище может быть 3 значения - null, false или, собственно, объект юзера. По умолчанию значение null, то есть как бы неопределённое. Если анонимус, то user = false.

    Ну и на сервере, получается, мы просто рисуем всякие спиннеры или вообще ничего не рисуем. На клиенте уже ждём подгрузки данных и реагируем на это.
  • Как быть с long-polling в SPA?

    Не то что бы это решает данную проблему, но лучше для таких вещей или реальный long polling сделать (потому что в коде просто отправка запроса по таймауту, это не long polling), или ещё круче через websocket. И открывать одно соединение, а не на каждый объект отдельный запрос отправлять.
  • Зачем нужен express.js?

    Ну просто надстройка над http с роутингом удобным. Сравни доки экспресса и модуля http. Букав и там, и там немного, так что в комментариях это расписывать смысла нет :)
  • Как написать такой запрос средствами laravel eloquent?

    Да, можно. Или через метод leftJoin сделать такой же запрос, или методом withCount('relationName') (не уверен, что метод именно так называется, но что-то в этом роде), которая добавит к модели атрибут с количеством, но запустит отдельный запрос для подсчёта.
  • Как получить несколько моделей в Laravel 5?

    $pagination = new LengthAwarePaginator(
        $collection->slice(0, 10), // кусок коллекции для текущей страницы, 10 элементов для примера
        $collection->count(), // общее количество элементов
        10, // максимальное количество элементов на одной странице
        1 // номер текущей страницы
    );


    Не очень понимаю, правда, в чём проблема просто посмотреть документацию к классу по ссылке выше или вообще исходники. Там всё максимально очевидно.
  • Как получить несколько моделей в Laravel 5?

    А, ну ясен хрен, paginate из коллекции и не должен работать. Это метод запроса. Я же написал, что нужно пользоваться классом LengthAwarePaginator напрямую, то есть вручную создавать экземпляр и в конструктор среди прочего передавать кусок коллекции для текущей страницы.
  • Как получить несколько моделей в Laravel 5?

    Вряд ли я смогу помочь, если не узнаю, какую ошибку :)
    Ну а так он любую коллекцию или массив хавает.
  • Test laravel framework?

    Тогда как объяснить, что hasMany строит связь только на основе 3-х параметров - связанная модель, внешний ключ и исходный ключ? Для связи многие-ко-многим здесь не хватает промежуточной таблицы.
    belongsToMany - это не инверсная связь. Она одинакова для обеих связанных моделей, и так и должно быть. Инверсные по отношению друг к другу - hasMany/hasOne и belongsTo.
  • Test laravel framework?

    Не совсем. У модели категорий нужно использовать `hasMany` вместо `belongsToMany`

    hasMany - это если связь один-ко-многим, а тут многие-ко-многим, так что всё правильно.
  • Как переписать аутентификацию в Laravel?

    pemi: в ядре ни в коем случае нельзя ничего трогать. Любой класс ядра можно унаследовать и переписать под себя как угодно. Как это сделать - можно почитать в документации. Там не совсем полная информация, правда, но общее представление можно получить, а дальше гугл в помощь - на все вопросы уже давно есть ответы.
  • Как реализовать частичный рендер на Vue.js?

    Ещё и в консоли браузера предупреждение пишется, если vue подключен как модуль и если не включен NODE_ENV=production.
  • Как расширить BladeCompiler в Laravel?

    terehinis: Вообще, если используете Laravel 5.4, то там есть т.н. компоненты. Возможно, они спасут ситуацию - в них можно будет инкапсулировать всю логику, о которой вы говорите, и выводить разный контент в зависимости от внешних условий.

    Но я вам точно говорю: директивы - это не путь. Остановитесь, пока не поздно, иначе потом намучаетесь с этим. Как я и сказал, директивы в Blade призваны решать абсолютно другой ряд задач, не нужно пытаться забить гвоздь отвёрткой. Вы, конечно, его забьёте, но сколько усилий для этого понадобится :)

    Касаемо замены стандартных классов, в частности BladeCompiler:
    • пишите свой класс, опционально наследующий нужный вам системный (скажем CustomBladeCompiler, наследующий BladeCompiler);
    • в AppServiceProvider (ну или в любом другом провайдере, можно отдельный под это создать) заменяете через $this->app->singleton/bind/... старую зависимость на новую (вот как это сделано в Illuminate\View\ViewServiceProvider: joxi.ru/L21d0N1CXGexmX ).


    Но я снова призываю так не делать в вашем случае :)
  • Как расширить BladeCompiler в Laravel?

    terehinis: я почти уверен, что что-то вы делаете не так. Директивы в принципе не задуманы, как средство для вставки кусков кода в шаблон, только разве что для каких-то совсем общих случаев типа вставки атрибута времени в тег time. То есть как бы вы теперь ни поступили - вы будете делать адский костыль. Если, конечно, не измените подход.
    "Модулем", я так понимаю, вы обозвали blade-файл?
  • Как разделить webpack код от кода проекта?

    Да, конечно, забыл об этом... Поправил ответ.
  • Какой JavaScript фреймворк выбрать?

    Islam Ibakaev: это да. Но с точки зрения исключительно экосистемы я бы сказал, что разницы между ними почти нет, так как npm пакеты общие для всех.