用户提交的帖子存储功能使用 Laravel
User Submitted Posts Store function using Laravel
所以除了我之前的话题(谢谢你们的帮助)
我的存储功能现在遇到问题,出现错误:“正在尝试获取非对象的 属性。
这是我控制器中的存储功能
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);
}
这是创建用户的视图post(为了更清楚,p.s。具有不同路由的相同表单当然适用于我的简单 post,但不适用于我的用户提交 posts)
@extends('index')
@section('index-stylesheets')
{!! Html::style('css/parsley.css') !!}
@endsection
@section('content')
<h1>Create New User Post</h1>
<hr>
{!! Form::open(array('route' => 'admin.userposts.store', 'data-parsley-validate' => '')) !!}
{{ Form::label('title', 'Title:') }}
{{ Form::text('title', null, array('class' => 'form-control', 'required' => '', 'maxlength' => '255')) }}
{{ Form::label('body', "Post Body:") }}
{{ Form::textarea('body', null, array('class' => 'form-control', 'required' => '')) }}
{{ Form::submit('Create Post', array('class' => 'btn btn-success btn-lg btn-block', 'style' => 'margin-top: 20px;')) }}
{!! Form::close() !!}
@endsection
@section('index-scripts')
{!! Html::script('js/parsley.min.js') !!}
@endsection
显示方法post:
public function show($id)
{
$userpost = Usp::find($id);
return view('admin.userposts.show', compact('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 one,因此它会将"create"作为id。因此,它将进入 show 方法,它不会找到任何匹配的 post,post 为 null,您会得到错误。
所以,有两种方法可以解决这个问题。
第一个(最简单,适用于所有情况,可能不是最好的)是将创建路由放在显示路由之前。
第二个,我认为最好的,是在 id 中添加一个 condition(在 slug 的情况下不起作用)。由于 ID 只是整数,因此您会得到:
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show')->where('id', '[0-9]+');
因此,create 不会匹配正则表达式,也不会进入 show 方法。
对于"resource creations"(存储在数据库中),我不会使用"field-by-field"方法。
相反,我会做这样的事情:
$userpost = Usp::create($request->only('title', 'body'));
我觉得这样比较啰嗦
但是,它不会起作用,laravel 保护*我们免受此类事情的侵害。要让它发挥作用,您有两种选择。
(我认为最好的选择)
在您的模型中,添加一个名为 $fillable 的受保护变量,其中包含您允许批量分配的所有列*。在这种情况下,您将输入:
protected $fillable = ['name'];
(如果你确定你在做什么的选项)
在你的模型中,你可以说,嘿,我知道我在这里做什么,让我做我的事情而不用保护我。在这种情况下,您将输入:
protected $guarded = [];
备注:
$request->only('field1', ...)
给你一个你想要的字段数组,字段名称作为键,在这种情况下它给你 ['field1' => $request->field1]
。在你的情况下,它会给你 ['title' => $request->title, 'body' => $request->body]
.
批量赋值是当你给模型一个数组,它把所有的属性放到数组的字段中。更多信息在这里 https://laravel.com/docs/5.4/eloquent#mass-assignment
当我的意思是 laravel 保护我们免受这些事情的影响时,它并没有真正保护我们,因为这不是一个坏习惯(相反,我发现它更具可读性),但是因为它确实允许你犯错误(例如,设置不存在的字段)。
所以除了我之前的话题(谢谢你们的帮助)
我的存储功能现在遇到问题,出现错误:“正在尝试获取非对象的 属性。
这是我控制器中的存储功能
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);
}
这是创建用户的视图post(为了更清楚,p.s。具有不同路由的相同表单当然适用于我的简单 post,但不适用于我的用户提交 posts)
@extends('index')
@section('index-stylesheets')
{!! Html::style('css/parsley.css') !!}
@endsection
@section('content')
<h1>Create New User Post</h1>
<hr>
{!! Form::open(array('route' => 'admin.userposts.store', 'data-parsley-validate' => '')) !!}
{{ Form::label('title', 'Title:') }}
{{ Form::text('title', null, array('class' => 'form-control', 'required' => '', 'maxlength' => '255')) }}
{{ Form::label('body', "Post Body:") }}
{{ Form::textarea('body', null, array('class' => 'form-control', 'required' => '')) }}
{{ Form::submit('Create Post', array('class' => 'btn btn-success btn-lg btn-block', 'style' => 'margin-top: 20px;')) }}
{!! Form::close() !!}
@endsection
@section('index-scripts')
{!! Html::script('js/parsley.min.js') !!}
@endsection
显示方法post:
public function show($id)
{
$userpost = Usp::find($id);
return view('admin.userposts.show', compact('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 one,因此它会将"create"作为id。因此,它将进入 show 方法,它不会找到任何匹配的 post,post 为 null,您会得到错误。
所以,有两种方法可以解决这个问题。
第一个(最简单,适用于所有情况,可能不是最好的)是将创建路由放在显示路由之前。
第二个,我认为最好的,是在 id 中添加一个 condition(在 slug 的情况下不起作用)。由于 ID 只是整数,因此您会得到:
Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show')->where('id', '[0-9]+');
因此,create 不会匹配正则表达式,也不会进入 show 方法。
对于"resource creations"(存储在数据库中),我不会使用"field-by-field"方法。
相反,我会做这样的事情:
$userpost = Usp::create($request->only('title', 'body'));
我觉得这样比较啰嗦
但是,它不会起作用,laravel 保护*我们免受此类事情的侵害。要让它发挥作用,您有两种选择。
(我认为最好的选择)
在您的模型中,添加一个名为 $fillable 的受保护变量,其中包含您允许批量分配的所有列*。在这种情况下,您将输入:protected $fillable = ['name'];
(如果你确定你在做什么的选项) 在你的模型中,你可以说,嘿,我知道我在这里做什么,让我做我的事情而不用保护我。在这种情况下,您将输入:
protected $guarded = [];
备注:
$request->only('field1', ...)
给你一个你想要的字段数组,字段名称作为键,在这种情况下它给你['field1' => $request->field1]
。在你的情况下,它会给你['title' => $request->title, 'body' => $request->body]
.批量赋值是当你给模型一个数组,它把所有的属性放到数组的字段中。更多信息在这里 https://laravel.com/docs/5.4/eloquent#mass-assignment
当我的意思是 laravel 保护我们免受这些事情的影响时,它并没有真正保护我们,因为这不是一个坏习惯(相反,我发现它更具可读性),但是因为它确实允许你犯错误(例如,设置不存在的字段)。