Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5:允许用户编辑帖子,如果他';是帖子的所有者还是论坛类别的所有者_Php_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php Laravel 5:允许用户编辑帖子,如果他';是帖子的所有者还是论坛类别的所有者

Php Laravel 5:允许用户编辑帖子,如果他';是帖子的所有者还是论坛类别的所有者,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,到目前为止,我允许用户编辑自己的帖子,但每当我通过如果他是subreddit/category条件的所有者,它就会完全停止工作 我有这三张桌子 Users: id, name, email... Subreddits: id, name, user_id... Posts: id, link, title, user_id, subreddit_id... 这是PostsController.php中的edit()方法 public function edit(Post $post, Subr

到目前为止,我允许用户编辑自己的帖子,但每当我通过
如果他是subreddit/category
条件的所有者,它就会完全停止工作

我有这三张桌子

Users: id, name, email...
Subreddits: id, name, user_id...
Posts: id, link, title, user_id, subreddit_id...
这是
PostsController.php中的
edit()
方法

public function edit(Post $post, Subreddit $subreddit)
    {
        if(Auth::id() !== $post->user_id) {
            return view('home')->withErrors('You cannot do that');
        } else {
            return view('post/edit')->with('post', $post)->with('subreddit', $subreddit);
        }
    }
这就是观点

@if(Auth::id() == $post->user_id)
      <a href="{{ action('PostsController@edit', [$post->id]) }}">Edit</a>
@endif
看法

PostsController.php

public function edit(Post $post, Subreddit $subreddit, User $user)
    {
        if(Gate::denies('update-post', $post) && Gate::denies('mod-update-post', $subreddit)) {
        return view('home')->withErrors('You cannot do that');
    } else {
        return view('post/edit')->with('post', $post)->with('subreddit', $subreddit);
    }
    }
看法

@can('update-post',$post)
@恩德坎
使用上述代码,如果“更新帖子”为真,我最终能够编辑帖子,但我无法检查
mod update post
是否也为真,我一直收到验证错误
您无法执行此操作

dd($subreddit)
inside edit()方法显示一个空数组

编辑:我想我已经解决了。我使用了
$post->subreddit->user->id
而不是
$subreddit->user\u id
,因为它返回空值。现在这一切似乎都是基于帖子是属于用户还是用户是论坛所有者

但是视图上的编辑链接仍然显示我是否有访问权限。我无法同时双重检查
更新帖子
修改更新帖子
。而且使用
@can('update-post',$post)
只能工作一次,我不能重复检查

那么,我如何检查用户是文章的所有者还是要显示并允许编辑的类别的所有者呢

使用拉威尔的新产品

编辑:我认为您误解了应该如何使用授权。它应该用于检查当前用户是否可以执行操作。因此,您不希望为不同的用户类型定义多个方法

以编辑一篇文章为例。这是您的授权检查的名称:
@can('edit',$post)
。你不需要为普通用户定义一个不同的,为版主定义另一个。只需将逻辑添加到edit post方法:

class PostPolicy
{
    public function edit(User $user, Post $post)
    {
        // If user is administrator, then can edit any post
        if ($user->isModerator()) {
            return true;
        }

        // Check if user is the post author
        if ($user->id === $post->author_id) {
            return true;
        }

        return false;
    }
}
如您所见,我使用相同的方法执行不同的检查,因此在您的刀片模板中,您可以执行以下操作:

@can('edit', $post)
    <a href="{{ route('post.edit', $post->getRouteKey()) }}">Edit post</a>
@endcan
@can('edit',$post)
@恩德坎
希望这能澄清问题。

这里介绍了替代技术(可能稍微简单一点):


因此,我们的想法是实现Request的子类,您可以在其中实现验证规则,还可以实现“授权”方法。

您还可以在App\Http中创建新文件夹作为规则:

并添加新的规则文件:

<?php

namespace App\Http\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\Models\Post;

class IsOwner implements Rule
{
    public function passes($attribute, $value)
    {
        return auth()->user()->id == Post::find($value)->user_id;
    }

    public function message()
    {
        return 'You are forbidden from taking this action!';
    }
}

查看策略:“但是如果我添加了if(Auth::id()=$subreddit->user\u id)”:我不知道您在哪里添加了这个。请显示修改后的代码段。我尝试了
门面,但无法在视图上检查两个
@can
,因此我返回到默认的检查方式。我有一个检查
$user->id===$post->user\u id
的确切门策略,但是当我添加第二个检查
$user->id===$subreddit->user\u id
的门时,它停止工作,并开始像我在原始帖子中描述的那样运行。@bernie我更新了我的帖子。我看不出你的代码有任何错误。尝试转储
$subreddit
的内容(打印等),因为我怀疑它可能不包含您期望的内容。此外,请确保您还保护编辑过程的发布路径,而不仅仅是表单显示视图。我之前尝试过,我添加了一个新策略
mod update POST
,该策略将
返回$user->id===$subreddit->user\u id
但我无法在视图中检查两个
@can
,并且我没有找到关于该主题的文档。这是因为您应该为正在检查的内容定义一个角色,而不是将它们组合在一起,即
@can('edit',$post)
。只需在该方法中对策略执行两个布尔检查,而不是尝试在视图中合并检查(您不应该这样做)。我已经编辑了我的帖子并添加了我的门策略,但它仍然无法正常工作。我现在可以在我的帖子上看到编辑链接,但无法编辑它们,导致验证错误。我改进了我的代码,门策略
updatepost
正在工作,但是
mod update post
没有。我仍然需要在视图中使用
@can
,否则每个人都可以看到编辑链接。是的。因此,请使用
@can('edit',$post)
,然后添加确定用户是否可以编辑帖子的逻辑,如果可以,请显示链接。
@can('update-post', $post)
     <a href="{{ action('PostsController@edit', [$post->id]) }}">Edit</a>
@endcan
class PostPolicy
{
    public function edit(User $user, Post $post)
    {
        // If user is administrator, then can edit any post
        if ($user->isModerator()) {
            return true;
        }

        // Check if user is the post author
        if ($user->id === $post->author_id) {
            return true;
        }

        return false;
    }
}
@can('edit', $post)
    <a href="{{ route('post.edit', $post->getRouteKey()) }}">Edit post</a>
@endcan
<?php

namespace App\Http\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\Models\Post;

class IsOwner implements Rule
{
    public function passes($attribute, $value)
    {
        return auth()->user()->id == Post::find($value)->user_id;
    }

    public function message()
    {
        return 'You are forbidden from taking this action!';
    }
}