質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

3239閲覧

【Laravel5.3】独自ポリシーでモデル以外の型の引数を指定できるか

speed_star777

総合スコア57

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/01/01 13:28

Laravel5.3を使用しています。
ユーザアクションを制御する際に、独自ポリシーを作成しているのですが、
ドキュメントを見るとUserやPoatなどのモデルの型を引数に取っているのですが、
単純にint型などの普通の引数を指定できるのでしょうか?
というのも期待した結果が得られませんでした。

  • ドキュメントの例

php

1<?php 2 3namespace App\Policies; 4 5use App\User; 6use App\Post; 7 8class PostPolicy 9{ 10 /** 11 * Determine if the given post can be updated by the user. 12 * 13 * @param \App\User $user 14 * @param \App\Post $post 15 * @return bool 16 */ 17 public function update(User $user, Post $post) 18 { 19 return $user->id === $post->user_id; 20 } 21}
  • 自分の実装(ポリシー側)

php

1 public function hoge(User $user, $intHoge) 2 { 3 if ($intHoge === 10) { 4 return true; 5 } 6 return false 7 }
  • 自分の実装(コントローラ側)
$intHoge = 10; if ($user->can('hoge', $intHoge)) { echo 'success'; } echo 'failed';

自分の実装は上記のようになっているのですが、
結果が「failed」になってしまいます。
コントローラ側の書き方が悪いのか、
そもそもこのような引数を持つことができないのかが判断できませんでした。
ご教授いただけませんでしょうか。

ちなみに参考にしたドキュメントのURLはこちらになります。
https://readouble.com/laravel/5.3/ja/authorization.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

確認したところ、この様な引数を持つことは出来ないようです。
UserクラスのCanは下記の通りに実装されており、第2引数にInt型を持つことは出来ません。

laravel\vendor\laravel\framework\src\Illuminate\Foundation\Auth\Access\Authorizable.php

php

1<?php 2 3namespace Illuminate\Foundation\Auth\Access; 4 5use Illuminate\Contracts\Auth\Access\Gate; 6 7trait Authorizable 8{ 9 /** 10 * Determine if the entity has a given ability. 11 * 12 * @param string $ability 13 * @param array|mixed $arguments 14 * @return bool 15 */ 16 public function can($ability, $arguments = []) 17 { 18 return app(Gate::class)->forUser($this)->check($ability, $arguments); 19 } 20 21 /** 22 * Determine if the entity does not have a given ability. 23 * 24 * @param string $ability 25 * @param array|mixed $arguments 26 * @return bool 27 */ 28 public function cant($ability, $arguments = []) 29 { 30 return ! $this->can($ability, $arguments); 31 } 32 33 /** 34 * Determine if the entity does not have a given ability. 35 * 36 * @param string $ability 37 * @param array|mixed $arguments 38 * @return bool 39 */ 40 public function cannot($ability, $arguments = []) 41 { 42 return $this->cant($ability, $arguments); 43 } 44}

また、Arrayを引数に取っていますが、Array(1,2,3)としても意味はありませんでした。
配列の最初の要素に対してObjectかどうかを判定していて、最初のObjectのみを対象にしているようです。
\laravel\framework\src\Illuminate\Auth\Access\Gate.php(抜粋)

php

1 /** 2 * Determine if the first argument in the array corresponds to a policy. 3 * 4 * @param array $arguments 5 * @return bool 6 */ 7 protected function firstArgumentCorrespondsToPolicy(array $arguments) 8 { 9 if (! isset($arguments[0])) { 10 return false; 11 } 12 13 if (is_object($arguments[0])) { 14 return isset($this->policies[get_class($arguments[0])]); 15 } 16 17 return is_string($arguments[0]) && isset($this->policies[$arguments[0]]); 18 }

投稿2017/01/04 04:25

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

speed_star777

2017/01/04 04:31

ご丁寧に調査いただきましてありがとうございます。 私のポリシーの使い方がLaravelの構造的に間違っているみたいですね。 ポリシーを使用しない他の方法を考えたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問