master

laravel/framework

Last updated at: 29/12/2023 09:27

HasGlobalScopes.php

TLDR

The file HasGlobalScopes.php contains a trait HasGlobalScopes with methods for managing and working with global scopes in an Eloquent model.

Methods

addGlobalScope($scope, $implementation = null)

This method is used to register a new global scope on the model. It accepts the following parameters:

  • $scope: An instance of \Illuminate\Database\Eloquent\Scope, a Closure function, or a string representing the scope name.
  • $implementation: An optional instance of \Illuminate\Database\Eloquent\Scope or Closure function that implements the scope.

hasGlobalScope($scope)

This method is used to determine if a model has a global scope. It accepts the following parameter:

  • $scope: An instance of \Illuminate\Database\Eloquent\Scope or a string representing the scope name.

getGlobalScope($scope)

This method is used to get a global scope registered with the model. It accepts the following parameter:

  • $scope: An instance of \Illuminate\Database\Eloquent\Scope or a string representing the scope name.

getAllGlobalScopes()

This method is used to get all of the global scopes that are currently registered. It returns an array of global scopes.

setAllGlobalScopes($scopes)

This method is used to set the current global scopes for the model. It accepts the following parameter:

  • $scopes: An array of global scopes to set.

getGlobalScopes()

This method is used to get the global scopes for this class instance. It returns an array of global scopes for the model instance.

Classes

N/A

<?php

namespace Illuminate\Database\Eloquent\Concerns;

use Closure;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Arr;
use InvalidArgumentException;

trait HasGlobalScopes
{
    /**
     * Register a new global scope on the model.
     *
     * @param  \Illuminate\Database\Eloquent\Scope|\Closure|string  $scope
     * @param  \Illuminate\Database\Eloquent\Scope|\Closure|null  $implementation
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    public static function addGlobalScope($scope, $implementation = null)
    {
        if (is_string($scope) && ($implementation instanceof Closure || $implementation instanceof Scope)) {
            return static::$globalScopes[static::class][$scope] = $implementation;
        } elseif ($scope instanceof Closure) {
            return static::$globalScopes[static::class][spl_object_hash($scope)] = $scope;
        } elseif ($scope instanceof Scope) {
            return static::$globalScopes[static::class][get_class($scope)] = $scope;
        }

        throw new InvalidArgumentException('Global scope must be an instance of Closure or Scope.');
    }

    /**
     * Determine if a model has a global scope.
     *
     * @param  \Illuminate\Database\Eloquent\Scope|string  $scope
     * @return bool
     */
    public static function hasGlobalScope($scope)
    {
        return ! is_null(static::getGlobalScope($scope));
    }

    /**
     * Get a global scope registered with the model.
     *
     * @param  \Illuminate\Database\Eloquent\Scope|string  $scope
     * @return \Illuminate\Database\Eloquent\Scope|\Closure|null
     */
    public static function getGlobalScope($scope)
    {
        if (is_string($scope)) {
            return Arr::get(static::$globalScopes, static::class.'.'.$scope);
        }

        return Arr::get(
            static::$globalScopes, static::class.'.'.get_class($scope)
        );
    }

    /**
     * Get all of the global scopes that are currently registered.
     *
     * @return array
     */
    public static function getAllGlobalScopes()
    {
        return static::$globalScopes;
    }

    /**
     * Set the current global scopes.
     *
     * @param  array  $scopes
     * @return void
     */
    public static function setAllGlobalScopes($scopes)
    {
        static::$globalScopes = $scopes;
    }

    /**
     * Get the global scopes for this class instance.
     *
     * @return array
     */
    public function getGlobalScopes()
    {
        return Arr::get(static::$globalScopes, static::class, []);
    }
}