【问题标题】:Dynamic model binding in trait function特征函数中的动态模型绑定
【发布时间】:2022-09-23 04:24:53
【问题描述】:

我有多个策略类。

并且这些策略\'update, delete, restore 函数具有相同的逻辑评估,即检查经过身份验证的用户是否拥有资源。

例如,我有一个邮政和一个评论模型。

那么对于邮政政策评论政策,他们的update, delete, restore 函数都将具有:

public function update(User $user, Post $post)
{
    return $user->id == $post->user_id;
}

public function delete(User $user, Post $post)
{
    return $user->id == $post->user_id;
}

public function restore(User $user, Post $post)
{
    return $user->id == $post->user_id;
}

// Also the same with CommentPolicy

有了这个,我还不如有这样的特质:

trait AuthorizableTrait
{
    public function authorize(User $user, Resource $resource)
    {
        return $user->id == $resource->user_id;
    }

}

所以,我的问题是,是否可以在 trait 中注入当前模型的动态实例,例如,PostComment 模型现在将变为 Resource?如果是这样,如何?

    标签: php laravel traits


    【解决方案1】:

    如果不指定授权函数第二个参数的类型,我想就可以了。

    如果您定义以下函数,但没有 Resource 类型:

    public function authorize(User $user, $resource)
    

    您将能够在$resource(帖子、评论等)中发送您想要的所有内容,然后检查将起作用……除非您始终拥有user_id 属性。

    【讨论】:

    • 是的,我也刚发现。不过谢谢:)
    【解决方案2】:

    还有其他几种方法可以处理这个问题。在您的 trait 中,您可以简单地将 Resource $resource 替换为 Model $model。只要您的Post.phpComment.phpResource.php 型号是class ... extends Model { ... },它就会接受:

    <?php 
    namespace App\Models\Traits;
    
    use Illuminate\Database\Eloquent\Model;
    
    trait AuthorizableTrait {
      public function authorize(User $user, Model $model) {
        return $user->id == $model->user_id;
      }
    }
    

    如果这太“松散”,并且您不希望所有模型都可以使用它(即,在可能的情况下,并非所有模型都有user_id 列),那么您可以使用Union Types(假设您在兼容的 PHP 版本):

    <?php 
    namespace App\Models\Traits;
    
    use App\Models\Post;
    use App\Models\Comment;
    use App\Models\Resource;
    
    trait AuthorizableTrait {
      public function authorize(User $user, Post|Comment|Resource $model) {
        return $user->id == $model->user_id;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多