Получение аргумента № 2 должно быть массивом в laravel

Я уже 2 дня бьюсь головой о стены и никак не могу избавиться от этой ошибки.

Я получаю эту ошибку:

ErrorException (E_WARNING)
array_map(): Argument #2 should be an array

Что я пытаюсь сделать: у каждого пользователя может быть список URL-адресов в базе данных. Один и тот же URL-адрес может быть в двух или более учетных записях пользователей, поэтому это отношение «многие ко многим».

Мой URLконтроллер выглядит так:

<?php

 namespace App\Http\Controllers;

    use App\User;
   use App\Urls;
    use Illuminate\Http\Request;
     use Auth;

 class UrlsController extends Controller
  {

public function __construct() {
    $this->middleware('auth');
}

public function index(User $user)
{
    return view('editurl', compact('user'));
}

public function store(User $user) {

    $user_id = Auth::user()->id;

    $data = request()->validate([
        'user_id' => $user_id,
        'url' => 'required',
    ]);

    auth()->user()->userurls()->create([
        'user_id' => $data['user_id'],
        'url' => $data['url'],
    ]);

    return redirect("/url/" . auth()->user()->id);

}

}

Моя модель URL-адреса выглядит так:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Urls extends Model
{
    //protected $quarded = [];
    protected $fillable = ['user_id','url'];

    protected $table = 'userUrls';

    public function user()
    {
        return $this->belongsToMany(User::class);
    }

}

Мой файл лезвие выглядит так:

    @extends('layouts.pagprincipala')

@section('content')


<section id = "home" class = "home pt-5 pb-5">

    <div class = "container mb-5">
        <div class = "row">
            <div class = "col-md-8">
                <h1 class = "h4">Adaugare url-uri</h1>
                <hr class = "bg-dark w-25 ml-0">
                <p>
                    <form action = "/url/{{$user->id}}" enctype = "multipart/form-data" method = "post">
                    @csrf

                        <div class = "row">
                            <div class = "col-8 offset-2">

                                <div class = "form-group row">

                                    <label for = "url" class = "col-md-12 col-form-label">Adaugare URL (doar emag si pcgarage)</label>
                                    <input id = "url"
                                    type = "text" 
                                    class = "form-control{{$errors->has('url') ? 'is-invalid' : ''}}" 
                                    name = "url" 
                                    autocomplete = "url" autofocus>

                                    @if ($errors->has('url'))
                                        <span class = "invalid-feedback" role = "alert">
                                            <strong class = "text-danger">Campul url este obligatoriu.</strong>
                                        </span>
                                    @endif

                                </div>

                                <div class = "row pt-4">

                                    <button class = "btn btn-primary">Adaugare URL</button>

                                </div>

                            </div>
                        </div>

                    </form>
                </p>
            </div>
        </div>
    </div>

  </section>


@endsection

Кроме того, мои маршруты выглядят так:

Route::get('/url/{user}', 'UrlsController@index')->name('editurl');
Route::post('/url/{user}', 'UrlsController@store')->name('updateurl');

Можете ли вы дать мне предложение о том, как двигаться дальше?!

Указывает ли сообщение об ошибке на файл и номер строки? Похоже, что какая-то функция laravel вызывает array_map() под капотом, и она не получает того, что ожидает.

N Mahurin 15.07.2019 21:12

Здравствуйте, извините, что не опубликовал это, он указывает на этот файл: C:\wamp64\www\infopret\vendor\laravel\framework\src\Illumina‌​te\Validation\Valida‌​tionRuleParser.php на строку 92, которая: return array_map([$this, 'prepareRule'], $rule); Сама функция: защищенная функция

FBK 15.07.2019 22:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
542
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в вашем валидаторе:

$data = request()->validate([
        'user_id' => $user_id,
        'url' => 'required',
    ]);

Вы пытаетесь проверить user_id с помощью правила, согласно которому является является идентификатором пользователя. То, что вы, вероятно, хотите достичь, это 'user_id' => 'integer',, или вы можете вообще отказаться от этого правила, поскольку вы знаете, кем является пользователь из-за Auth()->user(). Это должно сделать:

$data = request()->validate([
        'url' => 'required|url', //checks if it is an URL
    ]);

Чего мы не знаем, так это того, как устроена ваша User модель. Со многими ко многим вам нужна сводная таблица urls_users или user_urls_users с url_id и user_id, что означает, что вам не нужен user_id в таблице userUrls, только идентификатор и URL. Но это другой вопрос. Если вы хотите убедиться, что любой пользователь имеет какой-либо URL-адрес только один раз, вы можете использовать метод ->sync().

Добрый день, Дмитрий, очень помогли ваши комментарии. Помимо проверки, в которой вы были правы, у меня была сводная таблица, но у меня была ошибка добавления идентификатора пользователя в таблицу userUrls, после внесения изменений все работает как надо.

FBK 16.07.2019 06:49

Рад слышать. Удачного кодинга @FBK

Dimitri Mostrey 16.07.2019 12:31

Другие вопросы по теме