Задать вопрос
Ответы пользователя по тегу Laravel
  • Не получается создать route - admin. В чем проблема?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    В последних версиях namespace для роутов не используется.
    Уберите его отсюда
    Route::middleware('admin')
                    ->prefix('admin')
                    ->name('admin.')
             //       ->namespace($this->namespace)
                    ->group(base_path('routes/admin.php'));

    либо используйте строковую нотацию в роутах
    Route::get('auth', 'AuthController@show')->name('auth');
    Ответ написан
  • Как сделать так, чтоб в форме отображалось одно поле таблицы, а отправлялось другое?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Выводите список категорий в select
    <option value="{{ $category->id }}">{{ $category->name }}</option>


    Это если в форме нужно выбрать категорию. Если категория уже выбрана, например зашли в категорию и добавляем в нее товары, то название категории для пользователя вообще можно вывести текстом, а ID в скрытом поле.
    Ответ написан
  • Как передать обьект модели пользователя в шаблон?

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

    Дайте угадаю. Конфигурация по умолчанию, и вы делаете запрос на роут /api/blabla
    Только вот /api по умолчанию предлагается использовать для stateless запросов.
    Можете использовать другой роут, например /ajax/bla, тогда все запросы будут проходить через группу миддлвэров web и стартовать сессию.
    Или исправить RouteServiceProvider

    Route::prefix('api')
        // ->middleware('api')
        ->middleware('web')
        ->group(base_path('routes/api.php'));


    B тогда у вас в контроллере, вызываемом через аякс, будет текущая сессия, а значит и Auth::user() будет содержать текущего пользователя.

    PS Passport и Sanctum тут совершенно не нужны.
    Ответ написан
    2 комментария
  • Проблемы со стилями Laravel что делать?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Всё у вас правильно.
    В последних версиях используется Vite для сборки и по умолчанию есть всего два скрипта

    npm run build
    npm run dev


    Когда вы запускаете dev, то никакие файлы в public и не должны создаваться. Vite запускает свой сервер на localhost:5173, куда и "складывает" билды. Если откроете код страницы, то увидите там такое
    <script type="module" src="http://[::1]:5173/@vite/client"></script>
    <link rel="stylesheet" href="http://[::1]:5173/resources/assets/css/app.scss" />


    Этот режим предназначен для разработки, все изменения в файлах применяются "на лету".

    Когда вам нужно сбилдить готовые ассеты, выполните npm run build - и все нужные файлы появятся в public/build/.
    Ответ написан
    Комментировать
  • Вопрос по отправке данных на сервер и обработке ответа?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Представление самой страницы

    …
    <div id="table">
      @include('table')
    </div>
    …


    Отдельная вьюха для таблицы

    <table>
        <tr>
        ...
        </tr>
        @foreach ($data as $element)
           <tr>
               <td>{{ $element['date'] }}</td>
               ...
           </tr>
        @endforeach
    </table>


    Отдельный маршрут для запроса таблицы
    Route::get('getTable', function(){
      ...
      return response()->json([
        'target' => 'table',
        'html' => view('table', [...])->render()
      ])
    });


    B универсальная функция запроса в js

    function getChank(url, data) {
      return fetch(url, {
        body: data,
      }).then(response => response.json())
        .then(response => {
            const target = document.getElementById(response.target);
            target.innerHTML = response.html;
        });
    }


    -------
    А еще посмотрите в сторону Liveware. С ним все получится намного удобнее и красивее.
    Ответ написан
    1 комментарий
  • Какую библиотеку выбрать для построения графиков/диаграмм для проекта на Laravel?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Графики обычно рисуются на стороне клиента, джаваскриптом.
    И библиотеки для этого есть - Charts, Highcharts и куча других, более или менее навороченных.
    Эти две я пробовал. Charts позволяет сделать многое и довольно простая.
    А Highcharts - это вообще бомба, там куча настроек и кастомизаций https://www.highcharts.com/demo

    Причем здесь теги laravel и php я вообще не понял...
    Ответ написан
    3 комментария
  • Валидировать поля в массиве?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    return [
             "id" => "required",
             "email" => "required|email",
             "names.*.name" => "required"
    ];
    Ответ написан
    Комментировать
  • Как в дочернем шаблоне blade от laravel скрыть часть контента из материнского шаблона?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    layouts/base.blade.php
    <!DOCTYPE html>
    <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        @hasSection('title')
            <title>@yield('title') :: {{ config('app.name') }}</title>
        @else
            <title>{{ config('app.name') }}</title>
        @endif
        @vite(['resources/sass/app.scss'])
        <meta name="csrf-token" content="{{ csrf_token() }}">
    </head>
    <body>
    @yield('body')
    @vite(['resources/js/app.js'])
    @stack('scripts')
    </body>
    </html>


    layouts/auth.blade.php
    @extends('layouts.base')
    @section('body')
        <div>
            @yield('content')
        </div>
    @endsection


    layous/app.blade.php
    @extends('layouts.base')
    @section('body')
        <div>
            <header>
                @include('partials.app.header')
            </header>
            <main>
                @yield('content')
            </main>
        </div>
    @endsection


    pages/login.blade.php
    @extends('layouts.auth')
    @section('content')
        <form>  </form>
    @endsection


    pages/home.blade.php
    @extends('layouts.app')
    @section('content')
        Главная
    @endsection
    Ответ написан
  • Как сделать несколько скомпилированных стилей ViteJS в Laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Так же как и с миксом.
    Отдельные таски в package json с указанием отдельных конфигов Vite
    "scripts": {
      "build:site": "vite build --config site.vite.config.js",
      "build:admin": "vite build --config admin.vite.config.js",
    }

    https://vitejs.dev/guide/cli.html
    Ответ написан
    Комментировать
  • Почему не подключается не один файл, не работают роуты в laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Какая у вас структура файлов на хостинге?
    Полагаю, что-то вроде такого

    ~/
     ----/site.com
         ----/public_html


    Вам нужно разместить свой проект ларавел в папке site.com, а публичную папку в самом ларавель перемаппить на public_html (по умолчанию она должна называться public)

    Для этого в app/Providers/AppServiceProvider.php добавьте строку

    class AppServiceProvider extends ServiceProvider
    {
        public function register(): void
        {
            $this->app->usePublicPath(base_path('public_html'));
        }
    }


    Все содержимое из дефолтной public перенести в pablic_html
    Ответ написан
  • Как получить второй id из url?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Просто добавьте все параметры которые есть в роуте.
    Используйте биндинг, что бы сразу в параметре получить объект.

    public function productPage(Category $category, Product $product){
        // $currentProduct = Product::find($product); это уже не нужно
        // В переменной $product уже будет объект
        return view('product', compact('product'));
    }
    Ответ написан
    Комментировать
  • Как сделать опциональные поля в DTO?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    ну как вариант в методе prepareForValidation() форм-реквеста заполнять недостающие поля нулями
    Ответ написан
    Комментировать
  • Как работает ф-ция url в laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    url() https://laravel.com/docs/10.x/helpers#method-url
    Функция url генерирует полный URL для указанного пути:

    $url = url('user/profile');
     
    $url = url('user/profile', [1]);

    Если путь не указан, возвращается экземпляр Illuminate\Routing\UrlGenerator:

    $current = url()->current();
     
    $full = url()->full();
     
    $previous = url()->previous();
    Ответ написан
    Комментировать
  • Как Laravel «понимает» аутентифицирован пользователь или нет?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    В самой сессии хранится идентификатор залогиненного пользователя.

    643d31c6beb10205163174.png

    Для гостей этот идентификатор отсутствует
    Ответ написан
    1 комментарий
  • Laravel Relationships, как получить запись связывания?

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

    У вас она должна называться category_post и содержать минимум два столбика unsignedBigInteger
    post_id | category_id

    Модели должны быть названы в единственном числе Category и Post

    Отношения тоже следует называть соответственно. Тут интуитивно просто: если связь ко многим – множественное число (для отношений hasMany, belongsToMany), иначе единственное (для отношений hasOne, belongsTo).

    Методы всегда называются в camelCase. Первая буква маленькая.

    Только тогда у вас будет работать вся магия ларавел по умолчанию, без дополнительных описаний. Например, не нужно будет указывать таблицу в модели (protected $table = 'categories';)

    -------

    Например, Пользователь и Пост. У каждого пользователя может быть множество постов, но каждый пост принадлежит единственному пользователю. Тогда мы можем описать эту связь так (связь будет один-ко-многим)

    class User {
      public function posts(): HasMany {
        return $this->hasMany(Post::class); // юзер->имеетМного(Постов)
      }
    }
    class Post {
      public function user(): BelongsTo {
        return $this->belongsTo(User::class); // пост->относитсяК(Юзеру)
      }
    }
    
    // Получение данных
    
    foreach ($user->posts as $post) {
       // Все посты пользователя
    }
    
    $post->user->name; // Имя пользователя, которому принадлежит этот пост.
    
    // Добавление постов
    
    $user->posts()->create([ 
      'title' => 'Title of post',
      'content' => 'Long content',
      // id юзера в такой записи указывать не нужно, он будет проставлен автоматически.
    ]);


    ---------

    Теперь к вашему случаю. Тут нужно понять могут ли ваши посты одновременно находиться в нескольких категориях. Если нет, то вам нужна связь один-ко-многим, как в примере выше.
    Если да, то вы на верном пути, вам нужна связь многие-ко-многим, через связующую таблицу.
    Дальнейший код в примерах написан с учетом приведенных выше замечаний по именованию.

    class Post extends Model
    {
        public function categories(): BelongsToMany
        {
          return $this->belongsToMany(Category::class); // пост->относитсяКоМногим(Категориям)
        }
    }
    
    class Category extends Model
    {
        public function posts(): BelongsToMany
        {
          return $this->belongsToMany(Post::class); // категория->относитсяКоМногим(Постам)
        }
    }


    Это всё, что нужно для связи.

    Получить все посты из категории

    foreach ($category->posts as $post) {
    
    }


    C сортировкой

    $posts = $category->posts()->orderBy('created_at')->get();


    Для создания есть те же методы create(), save().
    Кроме того, есть возможность присоединить уже существующую модель.

    $post = Post::create([...]); // Создали пост, он никому не принадлежит
    $category->attach($post->id); // Теперь он связан с категорией


    Есть метод sync() для синхронизации пачки моделей.

    Всё это очень подробно написано в официальной документации.
    Я по сути просто сделал небольшую выжимку оттуда.
    https://laravel.com/docs/10.x/eloquent-relationships
    Ответ написан
    1 комментарий
  • Отправка email уведомления Ларавель с реального сервера?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Настройте на своём сервере SMTP и укажите его параметры в ларавел.
    MAIL_MAILER=smtp
    MAIL_HOST=smtp.timeweb.ru
    MAIL_PORT=2525
    MAIL_USERNAME=info@*****.com
    MAIL_PASSWORD=*****
    MAIL_ENCRYPTION=null
    MAIL_FROM_ADDRESS=info@****.com
    MAIL_FROM_NAME="MySite"
    Ответ написан
    1 комментарий
  • Почему sync() не отрабатывает во время выполнения скрипта, а только после завершения?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    После синка нужно (если реально нужно) перезагрузить отношение

    $user->load('roles')
    Ответ написан
    Комментировать
  • Как исправить ошибку с паролем 1045?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Что тут предлагать? Логин и/или пароль от базы неправильные
    Ответ написан
    Комментировать
  • Можно ли добавить кастомное значение в $request->validated() на этапе валидации?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Можно добавлять данные ДО валидации

    protected function prepareForValidation()
    {
        if (!$this->input('role.slug')) {
            $updatedInput = $this->collect('role')->merge([
                'slug' => Str::slug($this->input('role.name'), '_'),
            ])->toArray();
    
            $this->merge(['role' => $updatedInput]);
            Request::merge(['role' => $updatedInput]);
        }
    }


    https://qna.habr.com/q/1227502
    Ответ написан
    Комментировать
  • Почему не работает условие where в laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Правильные варианты записи:
    $service1->where('car_id', '=', $req->car_id);
    $service1->where('car_id', $req->car_id);
    $service1->whereCarId($req->car_id);
    Ответ написан
    Комментировать