Laravel 8 ErrorException: попытка доступа к смещению массива по значению типа null

Я работаю с Laravel над разработкой своего проекта, и в основном я хочу редактировать некоторые Статьи из базы данных в своей теме, поэтому я создал колонку с именем edit.blade.php, и в этой колонке есть строка, которая получает текущую изображение статьи:

<div class="row">
    @foreach($article->images['images'] as $key => $image) 
        <div class="col-sm-2">
            <label class="control-label">
                {{$key}}
                <input type="radio" name="imagesThumb" value="{{ $image }}" {{ $article->images['thumb'] ? 'checked' : '' }} />
                <a href="{{$image}}"><img src="{{$image}}" width="100%"></a>
            </label>
        </div>
    @endforeach
</div>

И модель статьи тоже выглядит так:

class Article extends Model
{
    use HasFactory;
    use Sluggable;

    protected $guarded = [];

    protected $casts = [
        'images' => 'array'
    ];

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }

    public function path()
    {
        return "/article/$this->slug";
    }
}

А вот метод ArticleController edit, который вызывает лезвие:

public function edit(Article $article)
{
    return view('website.backend.articles.edit',compact('article'));
}

Теперь проблема в том, что всякий раз, когда я хочу перейти к этому лезвию, он возвращает эту ошибку:

ErrorException Попытка доступа к смещению массива для значения типа null (Просмотр: edit.blade.php)

И это относится к этой линии лезвия:

@foreach($article->images['images'] as $key => $image)

Поэтому я не знаю, почему он показывает мне эту ошибку, если вы знаете, пожалуйста, дайте мне знать, я был бы очень признателен за любую идею от вас, ребята...

Заранее спасибо.


ОБНОВЛЕНИЕ №2:

Вот мой метод store для ArticleController:

public function store(ArticleRequest $request)
{
    //auth()->loginUsingId(1);
    $imageUrl = $this->uploadImages($request->file('images'));
    auth()->user()->article()->create(array_merge(['images' => $imageUrl], $request->all()));
    return redirect(route('articles.index'));
}

А вот AdminController, который идет с методом UploadImages и расширен ArticleController:

class AdminController extends Controller
{
    protected function uploadImages($file)
    {
        $year = Carbon::now()->year;
        $imagePath = "/upload/images/{$year}/";
        $filename = $file->getClientOriginalName();
        $file = $file->move(public_path($imagePath), $filename);
        $sizes = ["300","600","900"];
        $url['images'] = $this->resize($file->getRealPath(), $sizes, $imagePath, $filename);
        $url['thumb'] = $url['images'][$sizes[0]];
        return $url;
    }
    private function resize($path, $sizes, $imagePath, $filename)
    {
        $images['original'] = $imagePath . $filename;
        foreach($sizes as $size)
        {
            $images[$size] = $imagePath . "{$size}" . $filename;
            Image::make($path)->resize($size, null, function($constraint){
                $constraint->aspectRatio();
            })->save(public_path($images[$size]));
        }
        return $images;
    }
}

ОБНОВЛЕНИЕ №1:

Выход dd($article);:

    App\Models\Article {#1234 ▼
  #guarded: []
  #casts: array:1 [▼
    "images" => "array"
  ]
  #connection: "mysql"
  #table: "articles"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:12 [▼
    "id" => 2
    "user_id" => 1
    "title" => "asdasd"
    "slug" => "asdasd"
    "description" => "asdsadas"
    "body" => "asdsada"
    "images" => "F:\xampp\tmp\php1825.tmp"
    "tags" => "asdsad"
    "viewCount" => 0
    "commentCount" => 0
    "created_at" => "2020-11-09 12:24:33"
    "updated_at" => "2020-11-09 12:24:33"
  ]
  #original: array:12 [▼
    "id" => 2
    "user_id" => 1
    "title" => "asdasd"
    "slug" => "asdasd"
    "description" => "asdsadas"
    "body" => "asdsada"
    "images" => "F:\xampp\tmp\php1825.tmp"
    "tags" => "asdsad"
    "viewCount" => 0
    "commentCount" => 0
    "created_at" => "2020-11-09 12:24:33"
    "updated_at" => "2020-11-09 12:24:33"
  ]
  #changes: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
}

person Community    schedule 09.11.2020    source источник
comment
Я не видел вывод dd, но я думаю, что это будет @foreach($article->images as $key => $image), если описанный выше метод не сработает, а затем опубликуйте вывод dd($article);   -  person sta    schedule 09.11.2020
comment
@sta Я только что добавил это, см. ОБНОВЛЕНИЕ № 1 и спасибо.   -  person    schedule 09.11.2020
comment
Пожалуйста, отредактируйте. Свернуть #attributes: array:12 [▶] обновить   -  person sta    schedule 09.11.2020
comment
@sta Я только что свернул его и отредактировал ОБНОВЛЕНИЕ №1.   -  person    schedule 09.11.2020
comment
Согласно вашему коду, images должен быть массивом, но его строка "images" => "F:\xampp\tmp\php1825.tmp" сохранила изображение tmp вместо правильного имени   -  person sta    schedule 09.11.2020
comment
@sta Так почему это ?? Я только что добавил информацию о своих контроллерах (ОБНОВЛЕНИЕ № 2). Не могли бы вы помочь мне в этом вопросе...   -  person    schedule 09.11.2020


Ответы (1)


Это из-за этой строки:

auth()->user()->article()->create(array_merge(['images' => $imageUrl], $request->all()));

$request->all() содержит ключ images, для которого задан временный путь (F:\xampp\tmp\php1825.tmp), а в array_merge значения в более поздних параметрах переопределяют значения из более ранних параметров. Чтобы исправить это, просто поменяйте параметры следующим образом:

auth()->user()->article()->create(array_merge($request->all(), ['images' => $imageUrl]));

person Matt    schedule 09.11.2020
comment
Ты мой ГЕРОЙ! Большое спасибо ‹3 - person ; 09.11.2020