Laravel 5.1:从空值创建默认对象

10

我正在使用 Laravel 5.1 PHP 框架。当我尝试更新记录时,出现错误:

"AdminController.php 第 108 行出现错误:从空值创建默认对象".

我已经在谷歌上搜索过,但是找不到解决我的问题的结果。

路由

Route::get('/admin/no', 'AdminController@index');
Route::get('/admin/product/destroy/{id}', 'AdminController@destroy');
Route::get('/admin/new', 'AdminController@newProduct');
Route::post('/admin/product/save', 'AdminController@add');
Route::get('/admin/{id}/edit', 'AdminController@edit');
Route::patch('/admin/product/update/{id}', 'AdminController@update')

管理员控制器

 public function edit($id)
    {

        $product = Product::find($id);
        return view('admin.edit', compact('product'));

    }

    public function update(Request $request, $id)
    {

        $product = Product::find($id);
        $product->id = Request::input('id');
        $product->name = Request::input('name');
        $product->description = Request::input('description');
        $product->price = Request::input('price');
        $product->imageurl = Request::input('imageurl');


        $product->save();
        //return redirect('/admin/nο');

    }
    enter code here

edit.blade.php

div class="panel panel-info">
        <div class="panel-heading">
            <div class="panel-title">Edit Product</div>
        </div>
        <div class="panel-body" >
            <form action="/admin/product/update/{id}" method="POST"><input type="hidden" name="_method" value="PATCH"> <input type="hidden" name="_token" value="{{ csrf_token() }}">
    enter code here
5个回答

9
问题在于$product = Product::find($id);返回NULL。添加以下检查代码:
if(!is_null($product) {
   //redirect or show an error message    
}

尽管这是您的更新方法,但可能在构建此方法的url时遇到了错误。可能是您传递给此路由的id有误。
您的表单action存在错误:
<form action="/admin/product/update/{id}" method="POST">

注意花括号,Blade的语法是{{ expression }},而不仅仅是{}。因此,id永远不会传递到product.update路由中。只需将其更改为:

<form action="/admin/product/update/{{$id}}" method="POST">

2
在 edit.blade.php 文件中,应该是 {{$id}},你忘了 $ 符号。 - Akshay Naik
我更改了表单操作,但是什么也没有发生,我得到了新的错误NotFoundHttpException in RouteCollection.php line 161:。 - Kristin K
@KristinK 只需将此代码添加到您的表单中:<input name="_method" type="hidden" value="PUT"> - Ivanka Todorova

1

检查产品是否存在,然后进行更新。表单将如下所示:

<form action="/admin/product/update/{{$id}}" method="POST">

$符号缺失 :)


1
在 Laravel 中更新实体时,请使用 PUT 方法而不是 POST。更新表单方法并尝试。
<form action="/admin/product/update/{id}">

<input name="_method" type="hidden" value="PUT">

1
HTML表单中没有method="PUT"。只有GETPOST - Ivanka Todorova

0

请检查您的web.php文件,可能是控制器名称有误。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

这对其他类似问题可能会有所帮助。

使用$product = Product::where('some_other_id', $id);而不是$product = Product::find($id);。我之所以这样说,是因为您可能正在引用像外键一样的some_other_id,而不是主键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接