Php 使用Laravel的用户提交的帖子存储功能
所以除了我之前的话题(谢谢你们的帮助) 我现在面临着存储函数的问题,我得到了错误:“试图获取非对象的属性 这是控制器中的存储功能Php 使用Laravel的用户提交的帖子存储功能,php,laravel,routes,posts,Php,Laravel,Routes,Posts,所以除了我之前的话题(谢谢你们的帮助) 我现在面临着存储函数的问题,我得到了错误:“试图获取非对象的属性 这是控制器中的存储功能 public function store(Request $request) { // validate the data $this->validate($request, array( 'title' => 'required|max:255', 'body' => 'r
public function store(Request $request)
{
// validate the data
$this->validate($request, array(
'title' => 'required|max:255',
'body' => 'required'
));
// store in the database
$userpost = new Usp;
$userpost->title = $request->title;
$userpost->body = $request->body;
$userpost->save();
Session::flash('success', 'The blog post was successfully saved!');
return redirect()->route('admin.userposts.show', $userpost->id);
}
这是创建userpost的视图(为了更清楚,请注意,相同的表单当然有不同的路径,适用于我的简单帖子,但不适用于我的用户提交的帖子)
所以事实上,问题不在于存储方法,而在于路由
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show');
Route::get('/userposts/create', 'UserPostsController@create')->name('admin.userposts.create');
Route::post('/userposts/store', 'UserPostsController@store')->name('admin.userposts.store');
当按该顺序注册路由时,当laravel将迭代您的路由时,它将首先遇到show,因此它将以“create”作为id。因此,它将进入show方法,并且它将找不到任何匹配的post,post为空,您将得到错误
所以,有两种方法可以解决这个问题
第一个(最简单,在所有情况下都有效,可能不是最好的)是将创建路线放在显示路线之前
第二个,在我看来是最好的,是在id中添加一个(在slug的情况下不起作用)
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show')->where('id', '[0-9]+');
因此,create将与正则表达式不匹配,它也不会出现在show方法中
对于“资源创建”(存储在数据库中),我不会使用“逐个字段”的方法 相反,我会这样做:
$userpost = Usp::create($request->only('title', 'body'));
我觉得这更健谈
但是,这是行不通的,拉威尔保护我们不受这些事情的影响。要让它起作用,你有两个选择
在您的模型中,添加一个名为$fillable的受保护变量,该变量包含允许批量分配的所有列*。在这种情况下,您可以放置:
protected$filleble=['name'];
protected$guarded=[];
$request->only('field1',…)
为您提供一个字段数组,字段名称作为键,在本例中,它为您提供['field1'=>$request->field1]
。在本例中,它将为您提供['title'=>$request->title,'body'=>$request->body]
所以事实上,问题不在于存储方法,而在于路由
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show');
Route::get('/userposts/create', 'UserPostsController@create')->name('admin.userposts.create');
Route::post('/userposts/store', 'UserPostsController@store')->name('admin.userposts.store');
当按该顺序注册路由时,当laravel将迭代您的路由时,它将首先遇到show,因此它将以“create”作为id。因此,它将进入show方法,并且它将找不到任何匹配的post,post为空,您将得到错误
所以,有两种方法可以解决这个问题
第一个(最简单,在所有情况下都有效,可能不是最好的)是将创建路线放在显示路线之前
第二个,在我看来是最好的,是在id中添加一个(在slug的情况下不起作用)
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show')->where('id', '[0-9]+');
因此,create将与正则表达式不匹配,它也不会出现在show方法中
对于“资源创建”(存储在数据库中),我不会使用“逐个字段”的方法 相反,我会这样做:
$userpost = Usp::create($request->only('title', 'body'));
我觉得这更健谈
但是,这是行不通的,拉威尔保护我们不受这些事情的影响。要让它起作用,你有两个选择
在您的模型中,添加一个名为$fillable的受保护变量,该变量包含允许批量分配的所有列*。在这种情况下,您可以放置:
protected$filleble=['name'];
protected$guarded=[];
$request->only('field1',…)
为您提供一个字段数组,字段名称作为键,在本例中,它为您提供['field1'=>$request->field1]
。在本例中,它将为您提供['title'=>$request->title,'body'=>$request->body]
['userpost'=>$userpost',id'=>$id]
这是干什么用的???请指定代码的哪一行让您尝试获取非对象的属性。我的错我尝试了一些东西,但忘了删除它,但仍然不起作用。我将更新帖子。我希望知道是哪一行代码给了我这个错误:(对我来说,查看也会更容易。我的帖子存储功能中有完全相同的功能,它正在工作,但不在用户提交的帖子上。我在尝试创建帖子时遇到错误。表单甚至没有显示是哪行代码说试图获取……….错误消息?你有$request->title a吗nd$request->body
???将值作为标题和正文传递给控制器?您能给我们错误行吗?['userpost'=>$userpost',id'=>$id]
这是干什么用的???请指定t的哪一行