modelClass = $modelClass; if (class_exists($this->modelClass) && ! is_callable([$modelClass, 'registerVisibilityScoper'])) { throw new Exception("Model $modelClass cannot be visibility scoped as it does not use Flarum\Database\ScopeVisibilityTrait."); } } /** * Add a scoper for a given ability. * * @param callable|string $callback * @param string $ability: Defaults to 'view'. * * The callback can be a closure or invokable class, and should accept: * - \Flarum\User\User $actor * - \Illuminate\Database\Eloquent\Builder $query * * The callback should return void. * * @return self */ public function scope($callback, string $ability = 'view'): self { $this->scopers[$ability][] = $callback; return $this; } /** * Add a scoper scoper that will always run for this model, regardless of requested ability. * * @param callable|string $callback * * The callback can be a closure or invokable class, and should accept: * - \Flarum\User\User $actor * - \Illuminate\Database\Eloquent\Builder $query * - string $ability * * The callback should return void. * * @return self */ public function scopeAll($callback): self { $this->allScopers[] = $callback; return $this; } public function extend(Container $container, Extension $extension = null) { if (! class_exists($this->modelClass)) { return; } foreach ($this->scopers as $ability => $scopers) { foreach ($scopers as $scoper) { $this->modelClass::registerVisibilityScoper(ContainerUtil::wrapCallback($scoper, $container), $ability); } } foreach ($this->allScopers as $scoper) { $this->modelClass::registerVisibilityScoper(ContainerUtil::wrapCallback($scoper, $container)); } } }