randomstate / doctrine-scopes
Doctrine2的全局查询作用域
v0.1.4
2023-05-27 21:49 UTC
Requires
- doctrine/orm: ^2.6
Requires (Dev)
- laravel-doctrine/orm: ^1.4
- laravel/laravel: ^5.7
- mockery/mockery: ^1.2
- phpunit/phpunit: ^7.0
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; }); }