问题描述
我正在与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]));