Ответы пользователя по тегу Laravel
  • Как локализовать письма на русский?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    resources/lang/ru.json
    resources/lang/en.json

    Пример
    {
      "Hello, World!": "Привет, Мир!"
    }
    __('Hello, World!');


    Если с ключами, то
    resources/lang/ru/auth.php
    resources/lang/en/auth.php

    Пример
    return [
      "login": "Войти"
    ];
    __('auth.login');
    Ответ написан
  • Как подкрасить 2 блока в разные цвета по всей ширине в дочернем Blade-шаблоне?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Я бы не делал общий контейнер

    <!-- лэйаут -->
    <div @class(['about-content' => request()->is('About')])>
        @yield('content')
    </div>
    
    <!--Дочерний-->
    <div class="pb-5 management-content">
      <div class="container">
        <h2>MANAGEMENT PHILOSOPHY</h2>
        ...
      </div>
    </div>


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

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если проект большой, я бы вообще предпочел разделение по группам ответственности.
    Для ларки есть отличный пакет для этого – nwidart/larabel-modules
    Ответ написан
    Комментировать
  • Рендеринг одного компонента в Laravel при загрузке страницы?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Отрендерить на пхп конечно можно https://github.com/delphinpro/vue-ssr-with-php-v8js
    Но нужно ли?

    Можно рассмотреть такой вариант: вывод базовой разметки меню, а на фронте монтирование в этот див компонента.

    <div id="header">
      <ul>
        <li><a href="#">item</a>
        <li><a href="#">item</a>
      </ul>
    </div>


    app.mount('#header')
    Ответ написан
    2 комментария
  • Почему не сбрасывается кеш шаблона Blade при его изменении?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если посмотреть в исходник блэйд-компилятора, то видно, что актуальность кэша проверяется по времени изменения файла (не его хэшу)

    public function isExpired($path)
        {
            // ...
            return $this->files->lastModified($path) >=
                   $this->files->lastModified($compiled);
        }
    public function lastModified($path)
        {
            return filemtime($path);
        }


    И тогда можно сделать вывод, что ваш FTP клиент не изменяет время модификации файла при его загрузке. Точнее говоря, он предотвращает изменение этой метки (устанавливает исходную).

    В шторме для этого есть опция "Preserve files timestamp" в разделе
    File | Settings | Build, Execution, Deployment | Deployment | Options

    небольшой секретик
    В любой непонятной ситуации – читай исходники. Там намного больше инфы, чем в документациях. =)
    Ответ написан
    4 комментария
  • Как не блокировать код после выполнения Artisan::queue?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если это у вас локальная разработка, то просто оставьте консоль открытой, а для других задача откройте новую.
    На боевом сервере запускайте отдельно, через supervisor или pm2.
    Ответ написан
    Комментировать
  • Как добавить платежную систему на сайт, сделанный на laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    lаravel или нет, нет особой разницы.
    Читаем документацию по интеграции к платежной системе и делаем как там написано.
    Ответ написан
    Комментировать
  • Как настроить Laravel для создания простого бекенда?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    роуты почистил и всё.
    Да, часть миддлваров не будут использоваться для апи. Но разве это должно волновать? Лежат себе и лежат на диске. Там и вес-то их до килобайта не дотягивает.

    Есть ли способ сразу получить оптимизированное под написание апи решение?


    Ларка уже оптимизирована. Вам по умолчанию даже пакет для аутентификации по токенам включили. Просто используйте и не парьтесь.
    Ответ написан
    1 комментарий
  • Как перенести сайт на laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    опен сервер пятой версии?
    два варианта
    1. выбрать ручное управление доменами, и прописать нужную директорию для сайта (/public)
    2. оставить автоматическое, но добавить в список автонаходимых директорий public

    в шестой версии просто для домена указывается нужный путь к public

    ps htaces трогать не нужно, если он стандартный для ларки и вы туда ничего сами не дописывали
    Ответ написан
    1 комментарий
  • Где хранить стили проекта при использовании модульной архитектуры?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Модульный подход не исключает использования штатной папки app и остальных, в том числе resources. Общие, базовые стили вполне могут располагаться там.

    Не совсем понял зачем так делать,

    очевидно же - для разделения. Ну самое простое - если вы решите отключить какой-то модуль, то и принадлежащие ему ассеты вам не нужны, и они не будут подключены.
    Ответ написан
    Комментировать
  • Как реализовать корзину на связке Laravel и Vue.js?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если вы используете дефолтный входной роут /api для обмена данными, то там нет сессии.
    Если нужна сессия, то ее нужно включить соответствующим миддлваром (Как использовать сессию в API).

    Корзину можно хранить в БД, даже временную. Или в LocalStorage.
    Ответ написан
    2 комментария
  • Как убрать в Laravel Vite закрывающий слэш в link?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    В любой непонятной ситуации смотри исходники =)

    https://github.com/laravel/framework/blob/10.x/src...

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

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    тут масса вариантов.

    на фронте можно два поля выводить с логикой ИЛИ
    одно из можно прятать, примерно так:

    Ваш Email: ____________
    Link: Войти по номеру телефона
    
    Ваш телефон: ____________
    Link: Войти по Email


    При клике на ссылку поле для мыла прятать и показывать поле для телефона (каждое со своей маской). Текст ссылки соответственно тоже менять на "Войти по имейл"

    На бэке как уже отметили использовать prepareForValidation. Номер телефона нормализовывать. Проще всего вырезать всё, кроме цифр и так хранить в базе. При выводе форматировать как нравится.
    А чтобы юзер не забыл, что он вводил при регистрации, восьмерку или семерку, использовать вот эту продвинутую маску https://intl-tel-input.com/ Эта библиотечка, кстати, и нормализацию делает.
    Ответ написан
    Комментировать
  • Как создать фабрики для связанных таблиц?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    class ProfilFactory extends Factory
    {
        public function definition(): array
        {
            return [
                'user_id' => User::factory(),
                // ...
            ];
        }
    }
    Ответ написан
    1 комментарий
  • Почему не работают url изображений в проектах laravel на OSPanel (OpenServer)?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    нужно слинковать хранилище в публичную директорию

    php artisan storage:link

    Симлинки, которые будут созданы этой командой, прописаны в файле config/filesystem.php.
    По умолчанию, там одна ссылка для хранилища.
    Ответ написан
    1 комментарий
  • Как использовать сессию в API?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Алексей Коновалов,
    Это значит что все запросы которые я посылаю из браузера должны проходить через web.php?


    Нет, это значит, что если вам нужна сессия в апи, то эти маршруты должны быть в группе миддлваров web.

    А если быть ещё более точным, то эти маршруты должны проходить через миддлвэр StartSession

    Если вам не требуется классический stateless api, то поменяйте в RouteServiceProvider группу маршрутов api

    Route::middleware('web')
        ->group(base_path('routes/web.php'));
    
    Route::prefix('api')
    -   ->middleware('api')
    +   ->middleware('web')
        ->group(base_path('routes/api.php'));
    Ответ написан
  • Как узнать почему письмо отправленное через Mail::send не дошло до адресата?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Насколько я помню, протокол электронной почты довольно древний. И в нем не заложено возможности определить факт доставки письма адресату. Совершенно неважно как и чем вы отправляете письмо, такой возможности нет на более низком уровне.
    Ответ написан
  • Получаю ошибку при миграций?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Каким это волшебным образом, у вас при миграциях запускаются сидеры?

    Ответ для зеленых новичков:
    Чтобы класс сидера был найден, расположите его в database/seeders/CopyUserDataSeeder.php
    и внутри файла пропишите в первой строке
    namespace Database/Seeders;
    Ответ написан
    Комментировать
  • Как сделать роутинг для страниц, добавляемых через админку?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Считать из базы все слаги, динамически зарегистировать все возможные роуты.
    Считанные слаги кэшировать. Кэш обновлять по сохранению страницы в базе.
    Такой вариант дает возможность создавать в админке любые адреса, включая корневые.

    В качестве примера:
    class DynamicRoutes
    {
      public function routes(): void
      {
        /** @var Collection $pageCollection */
        $pageCollection = getFromCacheIf(config('cache.pages'), CACHE_PAGES, function () {
          try {
            return $this->getPages();
          } catch (\Exception $exception) {
            return new Collection();
          }
        });
    
        $pageCollection->each(function (Page $page) use ($pageCollection) {
    
          $routeName = ROUTE_PREFIX_PAGE.$page->slug;
          $routeUri = $page->getAttribute('url');
    
          $parentRouteName = $page->parent_id
            ? ROUTE_PREFIX_PAGE.($pageCollection->get($page->parent_id)->slug)
            : 'home';
    
          Route::prefix($routeUri)->group(function () use ($page, $routeName, $parentRouteName) {
    
            Route::get('', static function () use ($page) {
              return App::call($page->controllerName(), ['page' => Page::findOrFail($page->id)]);
            })
              ->name($routeName)
              ->breadcrumbs(function (Trail $trail) use ($page, $routeName, $parentRouteName) {
                return $trail->parent($parentRouteName)
                  ->push($page->localizedAttribute('title'), route($routeName));
              });
    
            switch ($page->controllerName()) {
              case GalleryController::class:
                $this->galleryRoutes($routeName);
                break;
              case TourController::class:
                $this->tourRoutes($routeName);
                break;
              case NewsController::class:
                $this->newsRoutes($routeName);
                break;
            }
    
          });
    
        });
      }
    
      private function galleryRoutes(string $parentRouteName): void
      {
        Route::get('{gallery:slug}', [GalleryController::class, 'show'])
          ->name(ROUTE_GALLERY)
          ->breadcrumbs(function (Trail $trail, Gallery $gallery) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($gallery->localizedAttribute('title'), route(ROUTE_GALLERY, $gallery));
          });
      }
    
      private function tourRoutes(string $parentRouteName): void
      {
        Route::get('{tour:slug}', [TourController::class, 'show'])
          ->name(ROUTE_TOUR)
          ->breadcrumbs(function (Trail $trail, Tour $tour) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($tour->localizedAttribute('title'), route(ROUTE_TOUR, $tour));
          });
      }
    
      private function newsRoutes(string $parentRouteName): void
      {
        Route::get('{news:slug}', [NewsController::class, 'show'])
          ->name(ROUTE_NEWS)
          ->breadcrumbs(function (Trail $trail, News $news) use ($parentRouteName) {
            return $trail->parent($parentRouteName)
              ->push($news->localizedAttribute('title'), route(ROUTE_NEWS, $news));
          });
      }
    
      private function getPages(): Collection
      {
        $pages = Page::whereNotNull('slug')->get()->keyBy('id');
    
        $pages->each(function (Page $page) use ($pages) {
          $page->setAttribute('url', $this->buildUrlForPage($page, $pages));
        });
    
        return $pages;
      }
    
      private function buildUrlForPage(Page $page, Collection $pages): string
      {
        if (!$page->parent_id) {
          return $page->slug;
        }
    
        $parentPage = $pages->get($page->parent_id);
    
        return $this->buildUrlForPage($parentPage, $pages).'/'.$page->slug;
      }
    }


    router/web.php
    //...
    app(DynamicRoutes::class)->routes();
    
    Route::fallback(function () {
      return response()->view('errors.404', [], 404);
    });
    Ответ написан
    Комментировать
  • В роутах Laravel больше нельзя указывать простое (короткое) название контроллера?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    По умолчанию неймспейсы для контроллеров в роутах отключены.
    Но вы можете их добавить сами в RouteServiceProvider
    Route::middleware('web')
                    ->namespace('App\\Http\\Controllers')
                    ->group(base_path('routes/web.php'));


    Однако я этого не рекомендую.
    Используя для работы хорошую IDE вы также просто будете писать имя контроллера, а IDE подскажет какой класс нужно вставить.
    Ответ написан
    Комментировать