randomstate / doctrine-scopes

Doctrine2的全局查询作用域

v0.1.4 2023-05-27 21:49 UTC

This package is auto-updated.

Last update: 2024-08-28 00:34:52 UTC


README

在现代应用程序中(尤其是多租户SaaS应用程序)的一个最重要的任务是确保客户之间的数据隔离。对此的最佳实践是在全局级别过滤所有查询。

Laravel Eloquent提供了这个功能。Doctrine2没有。

这个包解决了这个问题 👌

这为您提供了完整的查询构建器功能,以便在作用域中定位查询,而内置的过滤器不允许连接,并期望您自己编写SQL。

入门指南

composer require randomstate/doctrine-scopes

使用方法

在您通常创建实体管理器的地方,将其包装在一个可装饰的实体管理器中,并注入作用域查询构建器工厂闭包。

$scopes = new ScopeCollection();
$scope->add('myscope', new MyScope());
$scope->enable('myscope');

// Replace query builders with scopable ones
$em = new DecoratableEntityManager(new EntityManager(...));
$em->setQueryBuilderFactory(function() use($em, $scopes) {
    return new ScopableQueryBuilder($em, $scopes);
});

// Wrap repositories so that they are scoped
$em->extendRepositoryFactory(function(EntityRepository $repository) use($em) {
    return new ScopedEntityRepository($repository, $em);
})

$em->find(MyClass::class, 1); // this query is now scoped by whatever you have in MyScope@apply 🎉

Laravel

对于Laravel用户来说,这更容易

在您的config/app.php文件中将RandomState\DoctrineScopes\DoctrineScopesServiceProvider::class添加到服务提供者列表中。

在您选择的服务提供者的启动方法中(例如AppServiceProvider

public function boot() {
    $this->app->extend(RandomState\DoctrineScopes\ScopeCollection::class, function($scopes) {
        $scopes->add('myscope', new MyScope);
        $scopes->enable('myscope');
        
        return $scopes;
    });      
}