пытаюсь написать Политику включения комментариев в Laravel

В laravel у меня есть таблица Подписчиков, которую я использую, чтобы проверить, следует ли Пользователь за другим Пользователем, а также может ли он комментировать сообщения.

Таблица выглядит так:

Schema::create('followers', function (Blueprint $table) {

$table->unsignedInteger('publisher_id')->unsigned();
$table->unsignedInteger('follower_id')->unsigned();
$table->boolean('enable_follow')->default('1');
$table->unique(['publisher_id', 'follower_id']);
$table->timestamps();$table->foreign('publisher_id')
->references('id')
->on('users')
->onDelete('cascade');

$table->foreign('follower_id')
->references('id')
->on('users')
->onDelete('cascade');});

и это проверки, которые я делаю, чтобы решить, может ли пользователь комментировать сообщение:

public function canComment(User $user, Post $post)
{

$following = Follower::where('follower_id', $user->id)->where('publisher_id', $post->user_id)->select('enable_follow')->get();

if (!$following->isEmpty()) {

$enabled = $following[0]['enable_follow'];

if ($enabled != '0') {

return true;

} else {

return false;

}
} else if ($following->isEmpty()) {

return true;

}

}

И это часть контроллера для хранения, как вы видите, я пытаюсь авторизоваться так: $this->authorize('canComment', $post[0]);

public function store(Request $request)
{//on_post, from_user, body
// define rules
$rules = array(

'post_id' => 'required',
'body' => 'required'
);

$validator = Validator::make(Input::all(), $rules);

$post_id = $request->input('post_id');

$post = Post::findOrFail($post_id);

if ($validator->fails()) {
return Response()->json($validator);
} else {

$this->authorize('canComment', $post);

//prepares object to be stored in DB
$comment = new Comment();

$comment['user_id'] = $request->user()->id;
$comment['post_id'] = $post_id;
$comment['body'] = $request->input('body');
$comment->save();
if ($comment) {

$comment['user_name'] = $request->user()->username;
$comment['comment_id'] = $comment->id;
$comment['token'] = $request->input('_token');
}

return Response()->json($comment);}
}

Проблема в том, что я получаю 403 (Запрещено) ошибку в ситуации, когда у меня есть $following пусто и где следующее включено. Политика не работает, как ожидалось.

Исходный код метода авторизации на фасаде Gate:

public function authorize($ability, $arguments = [])
{
$result = $this->raw($ability, $arguments);

if ($result instanceof Response) {
return $result;
}

return $result ? $this->allow() : $this->deny();
}

Возможно, я не прав, возвращая истину или ложь в политике, так как этот код ожидает, что результат будет instance of Response но так что вы возвращаете, чтобы предоставить или запретить доступ ??

0

Решение

Проблема заключалась в размещении политики внутри commentPolicy, поэтому она ожидала получить комментарий, а не публикацию, а перемещение в postPolicy решило ее.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]