Я уже 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');
Можете ли вы дать мне предложение о том, как двигаться дальше?!
Здравствуйте, извините, что не опубликовал это, он указывает на этот файл: C:\wamp64\www\infopret\vendor\laravel\framework\src\Illuminate\Validation\ValidationRuleParser.php на строку 92, которая: return array_map([$this, 'prepareRule'], $rule); Сама функция: защищенная функция






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