用户提交的帖子使用Laravel存储功能

时间:2017-04-17 21:11:10

标签: php laravel routes posts

所以除了我之前的主题(谢谢你们的帮助)routes with compact

我现在面临着我的商店功能的麻烦,我收到了错误:"试图获得非对象的属性。

这是我的控制器中的商店功能

    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的视图(为了使其更清晰,p.s.使用不同路径的相同表单,适用于我的简单帖子,但不适用于我的用户提交的帖子)

@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

显示帖子的方法:

    public function show($id)
{
    $userpost = Usp::find($id);
    return view('admin.userposts.show', compact('userpost'));
}

1 个答案:

答案 0 :(得分:1)

所以事实是问题不是存储方法而是路由。

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将遍历您的路线时,它将首先遇到显示路线,因此它将采取&#34;创建&#34;作为身份证。因此,它将进入show方法,它不会找到任何匹配的帖子,帖子为空,你得到错误。

所以,有两种方法可以解决这个问题。

第一个(最简单的,在所有情况下都可以,可能不是最好的)是在创建路线之前放置创建路线。

第二个,我认为最好的是在id中添加condition(在slug的情况下不起作用)。因为id只是整数,所以你得到:

Route::get('/userposts/{id}', 'UserPostsController@show')->name('admin.userposts.show')->where('id', '[0-9]+');

因此,创建不会与正则表达式匹配,并且它不会进入show方法。

对于&#34;资源创作&#34; (存储在数据库中),我不会使用&#34;逐个字段&#34;方法

相反,我会这样做:

$userpost = Usp::create($request->only('title', 'body'));

我觉得这更健谈。

但是,它不会起作用,laravel保护我们免受这些事情的侵害。为了使其有效,您有两种选择。

  1. (我认为最好的选择)
    在您的模型中,添加一个名为$ fillable的受保护变量,其中包含您允许批量分配*的所有列。在这种情况下,你会把:

    protected $fillable = ['name'];

  2. (如果您确定自己在做什么,该选项) 在你的模型中,你可以说,嘿,我知道我在这里做什么,只是让我做我的东西而不保护我。在这种情况下,你会把:

    protected $guarded = [];

  3. 注意:

    1. $request->only('field1', ...)为您提供了一个字段数组,其中字段名称为键,在这种情况下,它会为您提供['field1' => $request->field1]。在您的情况下,它会为您提供['title' => $request->title, 'body' => $request->body]

    2. 质量赋值是指向模型提供数组并将所有属性放入数组的字段时。更多信息https://laravel.com/docs/5.4/eloquent#mass-assignment

    3. 当我的意思是laravel保护我们免受这些事情的侵害时,它确实保护我们,因为它不是不好的做法(相反,我发现它更具可读性),但因为它确实允许你犯错误(例如,设置不存在的字段)。