日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Laravel 是一框架,它有豐富的特性能夠快速開發(fā) Web 應(yīng)用程序。其權(quán)限功能是其中之一。在本文中,我們將開始學(xué)習(xí) Laravel 權(quán)限系統(tǒng)的兩個(gè)關(guān)鍵問題:權(quán)限繼承和繼承關(guān)系管理,并將實(shí)現(xiàn)功能代碼的演示。

權(quán)限繼承

權(quán)限繼承是指將權(quán)限從一個(gè)角色傳遞到另一個(gè)角色。在某些情況下,有必要將權(quán)限分配給一個(gè)角色,然后將這些權(quán)限傳遞給更具體的角色。例如,如果我們要管理某個(gè)單位的權(quán)限,則可以授予單位管理員所有的單位權(quán)限。而不必為每個(gè)員工分配權(quán)限。

Laravel 提供了「權(quán)限繼承」功能,我們可以使用它將權(quán)限從一個(gè)角色傳遞到另一個(gè)角色。讓我們開始學(xué)習(xí)如何實(shí)現(xiàn)這個(gè)功能。

在開始之前,我們需要建立數(shù)據(jù)庫(kù)。我們將創(chuàng)建兩個(gè)表:roles 和 permissions。

CREATE TABLE `roles` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `permissions` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

登錄后復(fù)制

我們將創(chuàng)建 roles 表來存儲(chǔ)角色,包括 id、name 和 parent_id 字段。id 字段是一個(gè)主鍵,必須唯一。name 字段將存儲(chǔ)角色名稱。parent_id 字段是可選的,它表示該角色的父角色。我們還將創(chuàng)建 permissions 表,其中包括 id 和 name 字段。id 字段是一個(gè)主鍵,必須唯一。name 字段將存儲(chǔ)權(quán)限名稱。

下面是 roles 表的示例數(shù)據(jù):

INSERT INTO `roles` (`id`, `name`, `parent_id`) VALUES
(1, 'Admin', NULL),
(2, 'Manager', 1),
(3, 'User', 2);

登錄后復(fù)制

在以上示例數(shù)據(jù)中,我們創(chuàng)建了三個(gè)角色,第一個(gè)角色稱為「Admin」,它沒有父角色;第二個(gè)角色稱為「Manager」,它的父角色是「Admin」;第三個(gè)角色稱為「User」,它的父角色是「Manager」。

現(xiàn)在,我們要實(shí)現(xiàn)權(quán)限繼承功能。為此,我們需要?jiǎng)?chuàng)建一個(gè)函數(shù),該函數(shù)將接收一個(gè)角色 ID,找到該角色的所有父角色,并返回這些角色的權(quán)限。我們還將實(shí)現(xiàn)另一個(gè)函數(shù),該函數(shù)將接收一個(gè)角色 ID 和一個(gè)權(quán)限名稱,并檢查該角色是否具有該權(quán)限,無論是直接授予該權(quán)限還是通過繼承該權(quán)限。

下面是獲取角色的所有父角色的函數(shù):

public function getPermissionsByRoleId($roleId) {
    $permissions = [];
    $role = Role::find($roleId);
    while($role) {
        $parent = Role::find($role->parent_id);
        if($parent) {
            $permissions = array_merge($permissions, $parent->permissions);
        }
        $role = $parent;
    }
    return $permissions;
}

登錄后復(fù)制

以上代碼創(chuàng)建了一個(gè) $permissions 數(shù)組,并從指定的角色開始遍歷角色的父角色。當(dāng)找到父角色時(shí),將其所有權(quán)限添加到 $permissions 數(shù)組中。如果找不到父角色,while 循環(huán)將終止,并返回 $permissions 數(shù)組。

現(xiàn)在,我們將實(shí)現(xiàn)另一個(gè)函數(shù),該函數(shù)將接收角色 ID 和權(quán)限名稱,并檢查該角色是否具有該權(quán)限。以下是該函數(shù)的代碼:

public function hasRolePermission($roleId, $permissionName) {
    $permissions = $this->getPermissionsByRoleId($roleId);
    foreach($permissions as $permission) {
        if($permission->name == $permissionName) {
            return true;
        }
    }
    return false;
}

登錄后復(fù)制

以上代碼調(diào)用了 getPermissionsByRoleId 函數(shù)以獲取角色的所有權(quán)限,并將其迭代以找到指定的權(quán)限。如果找到該權(quán)限,該函數(shù)將返回 true。否則,它將返回 false。

現(xiàn)在我們已經(jīng)學(xué)會(huì)了如何實(shí)現(xiàn)權(quán)限繼承,接下來重點(diǎn)學(xué)習(xí) Laravel 如何實(shí)現(xiàn)繼承關(guān)系管理。

繼承關(guān)系管理

在某些情況下,有必要?jiǎng)?chuàng)建繼承關(guān)系,并在應(yīng)用程序中使用它們。例如,如果我們有一個(gè)部門管理應(yīng)用程序,則每個(gè)部門都可以有一個(gè)管理者。而管理者與該部門之間的關(guān)系可以通過繼承關(guān)系建立。

在 Laravel 中,我們可以使用「多態(tài)關(guān)聯(lián)」功能建立繼承關(guān)系。讓我們開始學(xué)習(xí)如何實(shí)現(xiàn)它。

我們將創(chuàng)建一個(gè) departments 數(shù)據(jù)表。departments 表將表示應(yīng)用程序中的部門,包括 id、name 和 parent_id 字段。id 字段是一個(gè)主鍵,必須唯一。name 字段名稱將存儲(chǔ)部門名稱。parent_id 字段是可選的,它表示該部門的父部門。此外,我們還將創(chuàng)建一個(gè) users 表。此表包含了一個(gè)用戶的基本信息,包括 id 和 name 字段。我們還需要?jiǎng)?chuàng)建一個(gè) userables 表。該表將包含 user_id、userable_id 和 userable_type 字段。其中,user_id 字段是外鍵,指向 users 表中的 id 字段。userable_id 和 userable_type 字段是多態(tài)字段,它們表示用戶與其相關(guān)聯(lián)的任何模型。

下面是所需數(shù)據(jù)表結(jié)構(gòu)和示例數(shù)據(jù):

CREATE TABLE `departments` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `parent_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `userables` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `userable_id` int(10) UNSIGNED NOT NULL,
  `userable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `departments` (`id`, `name`, `parent_id`) VALUES
(1, 'Administration', NULL),
(2, 'Finance', 1),
(3, 'Sales', 1),
(4, 'IT', 1),
(5, 'Accounts Payable', 2),
(6, 'Accounts Receivable', 2),
(7, 'Engineering', 4),
(8, 'Development', 7),
(9, 'Testing', 7);

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'User One'),
(2, 'User Two'),
(3, 'User Three');

INSERT INTO `userables` (`id`, `user_id`, `userable_id`, `userable_type`) VALUES
(1, 1, 1, 'Department'),
(2, 1, 2, 'Department'),
(3, 2, 3, 'Department'),
(4, 3, 9, 'Department');

登錄后復(fù)制

以上示例數(shù)據(jù)中,我們創(chuàng)建了一個(gè)名為「Administration」的部門,它沒有父部門;名為「Finance」、「Sales」、「IT」的部門有「Administration」部門作為他們的父部門。另外,名為「Accounts Payable」和「Accounts Receivable」部門有「Finance」部門作為他們的父部門。名為「Engineering」的部門有「IT」部門作為它的父部門。「Development」和「Testing」部門有「Engineering」部門作為他們的父級(jí)部門。

我們將使用這些部門和用戶數(shù)據(jù)來建立繼承關(guān)系。

下面是 userables 表與部門之間的多態(tài)關(guān)聯(lián):

class Userable extends Model {
    public function userable() {
        return $this->morphTo();
    }

    public function user() {
        return $this->belongsTo(User::class);
    }
}

登錄后復(fù)制

以上代碼定義了 userable 函數(shù)。該函數(shù)返回與 userable 模型相關(guān)聯(lián)的模型。在我們的情況下,userable 將返回 Department 模型或任何其他相關(guān)模型。

接下來,我們定義 Department 模型:

class Department extends Model {
    public function users() {
        return $this->morphMany(Userable::class, 'userable');
    }

    public function parent() {
        return $this->belongsTo(Department::class, 'parent_id');
    }

    public function children() {
        return $this->hasMany(Department::class, 'parent_id');
    }
}

登錄后復(fù)制

以上代碼定義了三個(gè)函數(shù)。users 函數(shù)返回將 Userable id 與當(dāng)前模型實(shí)例相關(guān)聯(lián)的所有 User 實(shí)例。parent 函數(shù)返回這個(gè)部門的一個(gè)父級(jí)部門。children 函數(shù)返回所有直接關(guān)聯(lián)的部門。

現(xiàn)在,我們可以使用這些函數(shù)來獲取一個(gè)部門的所有直接用戶。以下是 getAllUsers 函數(shù)。

public function getAllUsers() {
    $users = [];
    foreach($this->users as $user) {
        $users[] = $user->user;
    }
    return $users;
}

登錄后復(fù)制

此函數(shù)將從當(dāng)前部門中檢索所有用戶,并返回一個(gè)數(shù)組,其中包含這些用戶。

最后,我們將定義 User 模型:

class User extends Model {
    public function userables() {
        return $this->hasMany(Userable::class);
    }

    public function departments() {
        return $this->morphToMany(Department::class, 'userable');
    }

    public function getDepartmentAttribute() {
        $department = null;
        foreach($this->userables as $userable) {
            if($userable->userable_type == 'Department') {
                $department = $userable->userable;
                break;
            }
        }
        return $department;
    }
}

登錄后復(fù)制

以上代碼定義了三個(gè)函數(shù)。userables 函數(shù)返回該用戶的所有可關(guān)聯(lián)實(shí)例。departments 函數(shù)返回與此用戶相關(guān)聯(lián)的所有部門。getDepartmentAttribute 函數(shù)將從 userables 中找到所有 Department 實(shí)例,并返回它們中的第一個(gè)。

以上所有代碼示例可以一起使用,以計(jì)劃實(shí)現(xiàn) Laravel 權(quán)限系統(tǒng)的兩個(gè)主要問題:權(quán)限繼承和繼承關(guān)系管理。

分享到:
標(biāo)簽:Laravel權(quán)限 權(quán)限繼承 繼承關(guān)系管理
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定