Laravel 存储库/服务模式:如何处理 Auth 和 Gates

Rif*_*fqi 6 php repository-pattern laravel

我开始为我的 laravel 项目使用存储库和服务模式。

只是一个快速的背景,我使用存储库作为数据映射器和服务来帮助保持控制器完成他们的主要工作,即接收请求和发送响应,从而变得更瘦。

以下代码示例是为了让您对上述解释有所了解:

// App\Repositories\Eloquent\UsersRepository
class UsersRepository implements UsersRepoInterface {
    protected $model;

    public function __construct (Model $model) {
        $this->model = $model;
    }
    public function all() : Collection {
        //
    }
    public function find($id) : Model {
        //
    }
    // and all other methods ...
}

// App\Services\UserService
class UserService {
    protected $repo;

    public function __construct (UsersRepoInterface $user_repo) {
        $this->repo = $user;
    }
    /**
     * @param array $data
     * @return User
     * @throws Exception
     */
    public function create(array $data) : User {
        // All business logics to create a user data
        return $user;
    }
    // and all other methods ...
}

// App\Http\Controllers\UserController
class UserController extends Controller {
    private $user;

    public function __construct (UserService $user) {
        $this->user = $user;
    }

    public function create (Request $request) : Response {
        $user = $this->user->create($request->all());

        return response(['user' => $user]);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,我的项目是一个内部 API 应用程序,因此需要进行身份验证才能发出大部分请求。我使用 Laravel Passport 的 OAuth2.0。

问题

在我切换到存储库/服务或你所谓的模式之前,我在将请求传递给控制器​​方法之前使用了 Gates 和 Policies。很明显,用户身份验证被传递给了我认为不正确的每个策略方法(来自 Passport),我相信直接使用用户模型而不是这违反了存储库模式,不是吗?

因此,我真的需要一些建议,我应该如何解决此类问题?

任何建议和显然的帮助都非常感谢!

提前致谢!