如何修复"Call to a member function update() on null"错误?



>我正在尝试将输入数据从表单拉入数据库以运行更新操作。但是,有一个错误直接指向行"$obj->update(request()->all());".错误是"在 null 上调用成员函数 update()"。我不太确定这个错误是什么意思,但我认为这意味着 request()->all() 为空。我希望输出是在将用户输入更新到数据库后,用户将通过返回重定向('/p')重定向到 pageManagement.blade.php;但是,当前输出只是一个错误消息,指出"在 null 上调用成员函数 update()"。

public function update($URI)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::find($URI);
$obj->update(request()->all());
return redirect('/p');
}

这是我的模特页面.php。

class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
}

这是我在网络上的路线.php。

Route::patch('/page/{URI}','PageController@update');

这是我的表单,供用户输入数据。

<form action="/page/{{ $pageContent->URI }}" method="post">
@csrf
@method('PATCH')
<label for="title">Title:</label><br>
<input type="text" id="title" name="title" autocomplete="off" value="{{ $pageContent -> title 
}}"><br>
@error('title') <p style="color: red">{{ $message }}</p> @enderror
<label for="URI">URI:</label><br>
<input type="text" id="URI" name="URI" autocomplete="off" value="{{ $pageContent -> URI }}"> 

@error('URI') {{ $message }} @enderror 页面内容:

页面内容 }}"> @error('pageContent') {{ $message }} @enderror tinymce.init({ 选择器:"#pageContent" })我的 GitHub 存储库附在下面,因为表单的问题格式看起来有点搞砸了......

https://github.com/xiaoheixi/wfams

感谢您阅读我的问题! :D

您正在使用 Request,因此您需要在函数中调用Request,对于update()方法,您可以使用where()代替:

public function update(Request $request)
{
$data = $request->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::where('URI', $request->URI)
->update([
'title' => $request->title, 
'pageContent' => $request->pageContent
]);
return redirect('/p');
}

在此处查看官方文档

我建议您使用验证规则"存在"来验证 URI 是否存在:

$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|exists:pages,URI',
'pageContent' => 'required'
]);

现在,如果您的页面表中不存在URI,Laravel将返回一个验证错误,并显示诸如"表页面中不存在指定的URI"之类的消息

我看到了你的GitHub https://github.com/xiaoheixi/myFirstWebsite

控制器中的模型绑定示例:

Route::patch('/page/{URI}','PageController@update');
Route::get('{URI}', 'PageController@getPage');
public function update($URI)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$obj = AppPage::find($URI);
$obj->update(request()->all());
return redirect('/p');
}

控制器更改为:

use AppPage;
public function getPage(Page $URI)
{
return view('page_view', compact('URI'));
}
public function update(Request $request, Page $URI)//match $URI to {URI}
{
$data = $request->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10|unique:pages,URI,'.$URI->id, //you dont want a duplicate URI when you search a page by URI
'pageContent' => 'required'
]);

$URI->update($request->all());
return redirect('/p');
}

在刀片中:

<form action="/page/{{ $pageContent }}" method="post">

在模型中:

use IlluminateDatabaseEloquentModel;
class Page extends Model
{
protected $fillable = ['title', 'URI', 'pageContent'];
public function getRouteKeyName()
{
return 'URI';
}
}

该错误表示find返回null。这是有道理的,因为find将尝试搜索主键字段而不是URI字段。

我不会将URI用作此记录的标识符。我会使用它id.

<form action="/page/{{ $pageContent->id }}" method="post">
Route::patch('/page/{page}','PageController@update');

这会大大简化事情。现在,您可以轻松地使用路由模型绑定来获取此Page

use AppPage;
...
public function update(Page $page)
{
$data = request()->validate([
'title' => 'required',
'URI' => 'required|min:5|max:10',
'pageContent' => 'required'
]);
$page->update(request()->all());
return redirect('/p');
}

这将确保$page是现有的模型实例。既然是这种情况,你可以打电话给update。只要确保titleURIpageContent是"可填充的"。

最新更新