微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 8 ErrorException:尝试访问类型为null的数组偏移量

如何解决Laravel 8 ErrorException:尝试访问类型为null的数组偏移量

我正在与Laravel合作开发项目,基本上我想从数据库中编辑主题 Articles ,因此我创建了一个名为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>

Article模型也是如此:

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:

这是我对ArticleController store 方法

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'));
}

这是 UploadImages 方法随附的AdminController,并通过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,$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: []
}

解决方法

是因为这一行:

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]));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。