【问题标题】:Update and Delete in LaravelLaravel 中的更新和删除
【发布时间】:2018-01-16 01:08:14
【问题描述】:

我希望用户只能执行删除和更新他们自己的帖子(在本例中为 cmets)等操作。

我有两个问题要解决:

  1. 来自不同用户的多个 cmets 显示在同一页面上,我在每条评论旁边都有要更新或删除的链接。如果是他们创建的评论,我只希望链接显示在 cmets 旁边。

  2. 我已经拥有创建、更新和删除工作的功能(尽管更新和删除当前不考虑用户是谁)。我不知道我是否需要实施 Gates、Policies 或两者兼而有之,以及这将如何影响我已经创建的内容......例如,我是否必须将控制器函数中的代码移动到 Policy 中?我查看了有帮助的 Laravel 资源,但我仍然不清楚。

类具有定义的关系,例如:

   class User extends Authenticatable
    {
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

我有在我的控制器中执行操作的功能,例如:

public function addComment(Request $request, $id)
{
    $request->validate([
        'body' => 'required',

    ]);

    $entry = new Comment();
    $film = Film::find($id);
    $entry->body = $request->body;
    $entry->film_id = $film->id;
    $entry->user_id = auth()->user()->id;
    $entry->save();

    return redirect('/');
}


public function updateComment(Request $request)
{
    $request->validate([
        'body' => 'required',
    ]);

    $entry = Comment::find($id);
    $entry->body = $request->body;
    $entry->save();
}

评论表:

Schema::create('comments', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->integer('film_id');
    $table->string('body');
    $table->timestamps();

评论刀片:

<h1>{{ $film->title }}</h1>

<!--<p>{{$film->comments}}</p>-->
<table id="myTable">
    <tr>
        <th>Comment</th>
        <th>User</th>
        @if (Auth::check())
        <th>Update</th>
        <th>Delete</th>
        @endif

@foreach ($film->comments as $comment)

    <tr>
        <td>{{$comment->body}}</td>
        <td>{{$comment->user['name']}}</td>

        @if (Auth::check())
        <td><a href="/update/{{$comment->id}}">Update</a></td>
        <td><a href="/delete/{{$comment->id}}">Delete</a></td>
        @endif
    </tr>
    @endforeach
</table>
@if (Auth::check())
<div>@include('form')</div>
@else
<h3>Please log in to add a comment</h3>
@endif
@endsection

路线示例:

Route::get('/update/{id}', 'FilmsController@editComment')->name('editComment')->middleware('auth');

如果没有登录,我目前只是使用@if (Auth::check()) 隐藏链接,但这不适合我的问题。

【问题讨论】:

  • 请把相关刀片代码也贴出来。
  • 刚刚添加刀片

标签: laravel authentication crud


【解决方案1】:

您可以将登录用户的用户ID与当前评论的用户ID进行比较,例如optional(Auth::user())-&gt;id === $comment-&gt;user_id

请注意这里的optional()。这需要注意 Auth::user() 可以在没有用户登录的情况下返回 null。没有 Laravel 会抛出错误,因为我们在 null 上调用 -&gt;id

下面我将这段代码添加到您的代码中:

@foreach ($film->comments as $comment)
    <tr>
        <td>{{$comment->body}}</td>
        <td>{{$comment->user['name']}}</td>

        @if(optional(Auth::user())->id === $comment->user['id'])
        <td><a href="/update/{{$comment->id}}">Update</a></td>
        <td><a href="/delete/{{$comment->id}}">Delete</a></td>
        @endif
    </tr>
@endforeach

【讨论】:

  • 谢谢@常识。对此答案稍作改动:@if(Auth::check() &amp;&amp; Auth::user()-&gt;id === $comment-&gt;user['id'])。同时,如果我排除 Auth::check 而只是做 @if(Auth::user()-&gt;id === $comment-&gt;user['id']) 这也有效。还需要Auth::check吗?即使Auth::check 仍然存在,我也可以更改网址并修改其他人的评论
  • 您可以删除第一个检查并应使用optional() 助手。请参阅我的更新答案。
  • 谢谢@常识。我现在唯一的问题是我可以手动将 url 从 commentupdate/1 更改为 commentupdate/2 并且这样做将能够更新不属于我的评论。不确定这是否可以通过路由解决?我在我的帖子中添加了一个路线示例。我在必要的路线上使用了-&gt;middleware('auth');,但想知道是否有办法在这里声明特定用户?
  • 更新 - 认为我需要中间件,我需要研究一下,如果需要,会发布一个不同的问题。再次感谢@常识。
【解决方案2】:

如果您使用“注册策略”,您将能够使用“can”和“cant”。 can/cant 在刀片和用户中都有效。

$user->can('create', Post::class)

$user->can('update', $post_instance)

@can('更新', $post_instance) ...等等...

https://laravel.com/docs/5.5/authorization#registering-policies

【讨论】:

  • 我看过这个,但正如我上面所说,我不明白如何在现有代码中实现它......例如,我在控制器中有功能可以保存,一个可以编辑,另一个删除评论。在 laravel.com 上的政策文档中,它说 class PostPolicy { public function update(User $user, Post $post) { return $user-&gt;id === $post-&gt;user_id; }这与我现有的更新功能有何关系?
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2014-09-28
  • 2017-05-17
  • 2020-01-05
  • 2021-12-08
  • 2015-04-02
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多