Ответы пользователя по тегу Laravel
  • Laravel echo socket.io клиент, как реализуется авторизация?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    В моём случае проблема оказалась из-за несовместимости версий.
    Понял это после того, как добавил отображение ошибки подключения:
    this.echo.connector.socket.on('connect_error', (error) => {
      console.error('Ошибка подключения к Socket.IO серверу', error);
    });
    Ответ написан
    Комментировать
  • Как достать из массива json массив?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    Пробуйте методом тыка с дампами.
    try {
      $item = json_decode('your json');
    } catch (\Exception $e) {
      dd($e);
    }
    dd($item);
    dd($item->associatedModel);
    dd($item->associatedModel->toArray()); // if collection


    Ну а тут по другому никак))
    Ответ написан
    Комментировать
  • Как разнести админ панель и основной сайт по разным проектам в laravel?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    Я думаю что при решении таких задач проще всего расписать все минусы и плюсы и принять решение:
    + распределение нагрузки
    + в каком-то смысле выше уровень безопасности, но это спорный вопрос
    + независимая (в каком-то смысле) разработка

    - в 2 раза больше кода (библиотеки, сервисы, политики, модели и многое другое дублируется)
    - сложнее техническая поддержка
    - увеличивается шанс повреждения БД
    - независимая разработка

    Лично моё мнение – разносить на 2 раздельных проекта нецелесообразно. На отдельный домен (поддомен) – возможно. Делается это для того чтобы распределить нагрузку на PHP. Делается это с помощью настройки префикса у маршрутов. Но делать это нужно, опять таки, если действительно требуется. Тут сложно судить не зная что у вас за ресурс и сколько часов разработки в него заложено.
    Ответ написан
  • Как ограничить доступ пользователя к записи?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    1) В модели Record создай метод-отношение recordsForShowing.
    2) В контроллере RecordController в методе index() выводи все записи.
    3) В контроллере RecordController в методе show() добавь проверку:
    public function show(App\Models\Record $record) {
        // если пользователь не авторизован или не существует в таблице user_records то выдаем ошибку "недостаточно прав"
        abort_if(!auth('web')->check() || $record->recordsForShowing()->where('user_id', auth('web')->id())->count() < 1, 403);
            
        // дальше обычным образом показываешь запись
        return view('template_name', compact('record'));
    }


    Тогда список записей смогут увидеть все пользователи, но вот посмотреть полную запись только выбранные пользователи.
    Ответ написан
    4 комментария
  • При переносе Laravel проекта что-то пошло не так, как исправить?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    Ответ написан
    Комментировать
  • Как сделать выход из аккаунта с указанного устройства laravel?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    Один из вариантов, с помощью Middleware проверять наличие строки в БД (можно не при каждом обновлении страницы, а каждую минуту, например):
    select 1 from sessions where id = 'current_session_id' and user_id = 'current_user_id';
    Если нет строки (ранее удалена сессия из админки) сбросить авторизацию.
    Ответ написан
    Комментировать
  • Как обновить домен laravel в каком файле?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    .env в корне сайта (там где vendor, tests, app)
    Ответ написан
    Комментировать
  • Создание через админ панель дочерних страниц laravel 8?

    PeterLS
    @PeterLS
    Руководитель веб-студии
    Во-первых, добавьте в таблицу pages столбец parent_id (nullable, default null, связь на pages->id).
    Во-вторых, в модели Page настройте связи на pages (HasMany).

    По поводу роутов одно из решений это парсинг URL-адреса.

    // routes/web.php в самом конце
    Route::get('{slug}', 'Controller@parse')->where('slug', '([0-9A-Za-z-/]+)');
    
    // прикладываю один из своих рабочих вариантов. тут парсятся не только страницы, но и категории (с мультивложенностью), продукты
    // app/http/controllers/controller.php
    public function parse(Request $request) {
            $urlArray = explode('/', $request->path());
    
            if (count($urlArray) === 1) {
                $page = Page::where('slug', $urlArray[0])->first();
                if (!empty($page)) {
                    return (new PageController)->show($page);
                }
    
                $category = Category::where('slug', $urlArray[0])->where('parent_id', 1)->first();
                if (!empty($category)) {
                    return (new CategoryController)->show($request, (new ProductFilters($request)), $urlArray[0]);
                }
            } else {
                $parentCategory = NULL;
                $i = 1;
                foreach ($urlArray as $urlArrayItem) {
                    $lastStep = $i === count($urlArray);
    
                    $category = Category::where('slug', $urlArrayItem);
                    if (is_null($parentCategory)) {
                        $category->where('parent_id', 1);
                    } else {
                        $category->where('parent_id', $parentCategory->id);
                    }
    
                    if (empty($category->first())) {
                        if ($lastStep) {
                            $product = $parentCategory->products()->where('slug', $urlArrayItem)->active()->first();
                            if (!empty($product)) {
                                return (new ProductController)->show($urlArrayItem);
                            }
                        }
    
                        abort(404);
                    } else {
                        if ($lastStep) {
                            return (new CategoryController)->show($request, (new ProductFilters($request)), $urlArrayItem);
                        }
    
                        $parentCategory = $category->first();
                    }
    
                    $i++;
                }
            }
    
            abort(404);
    }
    Ответ написан