{"id":115,"date":"2025-08-25T11:03:48","date_gmt":"2025-08-25T11:03:48","guid":{"rendered":"https:\/\/1v0.net\/blog\/?p=115"},"modified":"2025-08-26T08:50:48","modified_gmt":"2025-08-26T08:50:48","slug":"step-by-step-guide-creating-a-user-roles-and-permissions-app-with-laravel-12","status":"publish","type":"post","link":"https:\/\/1v0.net\/blog\/step-by-step-guide-creating-a-user-roles-and-permissions-app-with-laravel-12\/","title":{"rendered":"Step-by-Step Guide: Creating a User Roles and Permissions App with Laravel 12"},"content":{"rendered":"\n<p>When building modern applications, one of the most common requirements is managing <strong>user roles<\/strong> and <strong>permissions<\/strong>. In this post, we\u2019ll break down the concepts, then show you how to implement them in a Laravel 12 app step by step \u2014 including a simple admin UI to manage roles and permissions.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Definitions<\/strong><\/h2>\n\n\n\n<p><strong>Role<\/strong>: A role is a named bundle of permissions (e.g., <em>Admin<\/em>, <em>Editor<\/em>). Assigning a role grants all permissions that role contains.<\/p>\n\n\n\n<p><strong>Permission<\/strong>: A permission represents a specific action (e.g., <em>posts.create<\/em>, <em>users.delete<\/em>). Permissions are the atomic units of access.<\/p>\n\n\n\n<p><strong>RBAC (Role-Based Access Control)<\/strong>: A strategy where users get roles, and roles contain permissions. This avoids assigning dozens of permissions directly to each user.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 1 &#8211; Install Laravel and Spatie Roles &amp; Permissions<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">composer create-project laravel\/laravel roles-permissions-app\ncd roles-permissions-app\n\ncomposer <span class=\"hljs-built_in\">require<\/span> spatie\/laravel-permission<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Publish config and migrations:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">php artisan vendor:publish --provider=<span class=\"hljs-string\">\"Spatie\\Permission\\PermissionServiceProvider\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 2 &#8211; Run Migrations<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">php artisan migrate<\/code><\/span><\/pre>\n\n\n<p>This creates <code>roles<\/code>, <code>permissions<\/code>, and pivot tables to link them with users.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 3 &#8211; Add Trait to User Model<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ app\/Models\/User.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Foundation<\/span>\\<span class=\"hljs-title\">Auth<\/span>\\<span class=\"hljs-title\">User<\/span> <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">Authenticatable<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Traits<\/span>\\<span class=\"hljs-title\">HasRoles<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Authenticatable<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">HasRoles<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ ...<\/span>\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 4 &#8211; Seed Roles &amp; Permissions<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>Create a seeder to define a baseline policy:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ database\/seeders\/RolesAndPermissionsSeeder.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Database<\/span>\\<span class=\"hljs-title\">Seeders<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Database<\/span>\\<span class=\"hljs-title\">Seeder<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Role<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Permission<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RolesAndPermissionsSeeder<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Seeder<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">run<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">void<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $permissions = &#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'posts.create'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'posts.edit'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'posts.delete'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'users.view'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'users.edit'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        ];\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">foreach<\/span> ($permissions <span class=\"hljs-keyword\">as<\/span> $name) {\n<\/span><\/span><span class='shcb-loc'><span>            Permission::firstOrCreate(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; $name]);\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $admin = Role::firstOrCreate(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'Admin'<\/span>]);\n<\/span><\/span><span class='shcb-loc'><span>        $editor = Role::firstOrCreate(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'Editor'<\/span>]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $admin-&gt;givePermissionTo($permissions);\n<\/span><\/span><span class='shcb-loc'><span>        $editor-&gt;givePermissionTo(&#91;<span class=\"hljs-string\">'posts.create'<\/span>, <span class=\"hljs-string\">'posts.edit'<\/span>]);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">php artisan db:seed --<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=RolesAndPermissionsSeeder<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 5 &#8211; Gate Your Routes<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ routes\/web.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Route<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>Route::get(<span class=\"hljs-string\">'\/admin'<\/span>, fn() =&gt; <span class=\"hljs-string\">'Admin panel'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    -&gt;middleware(<span class=\"hljs-string\">'role:Admin'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>Route::get(<span class=\"hljs-string\">'\/posts\/create'<\/span>, fn() =&gt; <span class=\"hljs-string\">'Create post form'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    -&gt;middleware(<span class=\"hljs-string\">'permission:posts.create'<\/span>);\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 6 &#8211; Build a Simple Management UI (Blade)<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>What you&#8217;ll build:<\/strong> Minimal CRUD screens to list, create, and edit Roles and Permissions, plus assign permissions to roles and roles to users.<\/p>\n<\/blockquote>\n\n\n\n<p>Generate controllers:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">php artisan make:controller Admin\/RoleController --resource\nphp artisan make:controller Admin\/PermissionController --resource\nphp artisan make:controller Admin\/UserRoleController<\/code><\/span><\/pre>\n\n\n<p>Routes for the admin UI (protect with <code>role:Admin<\/code>):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ routes\/web.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>\\<span class=\"hljs-title\">RoleController<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>\\<span class=\"hljs-title\">PermissionController<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>\\<span class=\"hljs-title\">UserRoleController<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>Route::middleware(&#91;<span class=\"hljs-string\">'auth'<\/span>, <span class=\"hljs-string\">'role:Admin'<\/span>])-&gt;prefix(<span class=\"hljs-string\">'admin'<\/span>)-&gt;name(<span class=\"hljs-string\">'admin.'<\/span>)-&gt;group(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">()<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    Route::resource(<span class=\"hljs-string\">'roles'<\/span>, RoleController::class);          <span class=\"hljs-comment\">\/\/ index, create, store, edit, update, destroy<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    Route::resource(<span class=\"hljs-string\">'permissions'<\/span>, PermissionController::class);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Assign roles to users<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    Route::get(<span class=\"hljs-string\">'users\/{user}\/roles'<\/span>, &#91;UserRoleController::class, <span class=\"hljs-string\">'edit'<\/span>])-&gt;name(<span class=\"hljs-string\">'users.roles.edit'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    Route::put(<span class=\"hljs-string\">'users\/{user}\/roles'<\/span>, &#91;UserRoleController::class, <span class=\"hljs-string\">'update'<\/span>])-&gt;name(<span class=\"hljs-string\">'users.roles.update'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>});\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Controller examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/Admin\/RoleController.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Controller<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Role<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Permission<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RoleController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">index<\/span><span class=\"hljs-params\">()<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $roles = Role::with(<span class=\"hljs-string\">'permissions'<\/span>)-&gt;paginate(<span class=\"hljs-number\">10<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.roles.index'<\/span>, compact(<span class=\"hljs-string\">'roles'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create<\/span><span class=\"hljs-params\">()<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $permissions = Permission::orderBy(<span class=\"hljs-string\">'name'<\/span>)-&gt;get();\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.roles.create'<\/span>, compact(<span class=\"hljs-string\">'permissions'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">store<\/span><span class=\"hljs-params\">(Request $request)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $data = $request-&gt;validate(&#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255|unique:roles,name'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'permissions'<\/span> =&gt; <span class=\"hljs-string\">'array'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        ]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $role = Role::create(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; $data&#91;<span class=\"hljs-string\">'name'<\/span>]]);\n<\/span><\/span><span class='shcb-loc'><span>        $role-&gt;syncPermissions($data&#91;<span class=\"hljs-string\">'permissions'<\/span>] ?? &#91;]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'admin.roles.index'<\/span>)-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Role created.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">edit<\/span><span class=\"hljs-params\">(Role $role)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $permissions = Permission::orderBy(<span class=\"hljs-string\">'name'<\/span>)-&gt;get();\n<\/span><\/span><span class='shcb-loc'><span>        $role-&gt;load(<span class=\"hljs-string\">'permissions'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.roles.edit'<\/span>, compact(<span class=\"hljs-string\">'role'<\/span>, <span class=\"hljs-string\">'permissions'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(Request $request, Role $role)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $data = $request-&gt;validate(&#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255|unique:roles,name,'<\/span> . $role-&gt;id,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'permissions'<\/span> =&gt; <span class=\"hljs-string\">'array'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        ]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $role-&gt;update(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; $data&#91;<span class=\"hljs-string\">'name'<\/span>]]);\n<\/span><\/span><span class='shcb-loc'><span>        $role-&gt;syncPermissions($data&#91;<span class=\"hljs-string\">'permissions'<\/span>] ?? &#91;]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'admin.roles.index'<\/span>)-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Role updated.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">destroy<\/span><span class=\"hljs-params\">(Role $role)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $role-&gt;delete();\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> back()-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Role deleted.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/Admin\/PermissionController.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Controller<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Permission<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PermissionController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">index<\/span><span class=\"hljs-params\">()<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $permissions = Permission::orderBy(<span class=\"hljs-string\">'name'<\/span>)-&gt;paginate(<span class=\"hljs-number\">15<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.permissions.index'<\/span>, compact(<span class=\"hljs-string\">'permissions'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create<\/span><span class=\"hljs-params\">()<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.permissions.create'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">store<\/span><span class=\"hljs-params\">(Request $request)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $data = $request-&gt;validate(&#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255|unique:permissions,name'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        ]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        Permission::create(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; $data&#91;<span class=\"hljs-string\">'name'<\/span>]]);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'admin.permissions.index'<\/span>)-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Permission created.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">edit<\/span><span class=\"hljs-params\">(Permission $permission)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.permissions.edit'<\/span>, compact(<span class=\"hljs-string\">'permission'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(Request $request, Permission $permission)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $data = $request-&gt;validate(&#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255|unique:permissions,name,'<\/span> . $permission-&gt;id,\n<\/span><\/span><span class='shcb-loc'><span>        ]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $permission-&gt;update(&#91;<span class=\"hljs-string\">'name'<\/span> =&gt; $data&#91;<span class=\"hljs-string\">'name'<\/span>]]);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'admin.permissions.index'<\/span>)-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Permission updated.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">destroy<\/span><span class=\"hljs-params\">(Permission $permission)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $permission-&gt;delete();\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> back()-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'Permission deleted.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/Admin\/UserRoleController.php<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">Admin<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">HttpControllers<\/span>\\<span class=\"hljs-title\">Controller<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">User<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Spatie<\/span>\\<span class=\"hljs-title\">Permission<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">Role<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserRoleController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">edit<\/span><span class=\"hljs-params\">(User $user)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $roles = Role::orderBy(<span class=\"hljs-string\">'name'<\/span>)-&gt;get();\n<\/span><\/span><span class='shcb-loc'><span>        $user-&gt;load(<span class=\"hljs-string\">'roles'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'admin.users.roles'<\/span>, compact(<span class=\"hljs-string\">'user'<\/span>, <span class=\"hljs-string\">'roles'<\/span>));\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">update<\/span><span class=\"hljs-params\">(Request $request, User $user)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\">    <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>        $data = $request-&gt;validate(&#91;\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'roles'<\/span> =&gt; <span class=\"hljs-string\">'array'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        ]);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        $user-&gt;syncRoles($data&#91;<span class=\"hljs-string\">'roles'<\/span>] ?? &#91;]);\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect()-&gt;route(<span class=\"hljs-string\">'admin.users.roles.edit'<\/span>, $user)-&gt;with(<span class=\"hljs-string\">'status'<\/span>, <span class=\"hljs-string\">'User roles updated.'<\/span>);\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Example Blade views (Bootstrap 5 layout implied):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span>&lt;!-- resources\/views\/admin\/roles\/index.blade.php --&gt;\n<\/span><\/span><span class='shcb-loc'><span>@extends(<span class=\"hljs-string\">'layouts.app'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>@section(<span class=\"hljs-string\">'content'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>&lt;div <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>=\"<span class=\"hljs-title\">container<\/span>\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">  &lt;<span class=\"hljs-title\">div<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">d<\/span>-<span class=\"hljs-title\">flex<\/span> <span class=\"hljs-title\">justify<\/span>-<span class=\"hljs-title\">content<\/span>-<span class=\"hljs-title\">between<\/span> <span class=\"hljs-title\">align<\/span>-<span class=\"hljs-title\">items<\/span>-<span class=\"hljs-title\">center<\/span> <span class=\"hljs-title\">mb<\/span>-3\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">    &lt;<span class=\"hljs-title\">h1<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">h3<\/span>\"&gt;<span class=\"hljs-title\">Roles<\/span>&lt;\/<span class=\"hljs-title\">h1<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">    &lt;<span class=\"hljs-title\">a<\/span> <span class=\"hljs-title\">href<\/span>=\"<\/span>{{ route(<span class=\"hljs-string\">'admin.roles.create'<\/span>) }}<span class=\"hljs-string\">\" class=\"<\/span>btn btn-primary<span class=\"hljs-string\">\"&gt;New Role&lt;\/a&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">  &lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">  &lt;table class=\"<\/span>table table-striped<span class=\"hljs-string\">\"&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;\/th&gt;&lt;th&gt;Permissions&lt;\/th&gt;&lt;th class=\"<\/span>text-end<span class=\"hljs-string\">\"&gt;Actions&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;tbody&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">      @foreach($roles as $role)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">        &lt;tr&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">          &lt;td&gt;{{ $role-&gt;name }}&lt;\/td&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">          &lt;td&gt;{{ $role-&gt;permissions-&gt;pluck('name')-&gt;join(', ') ?: '\u2014' }}&lt;\/td&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">          &lt;td class=\"<\/span>text-end<span class=\"hljs-string\">\"&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">            &lt;a href=\"<\/span>{{ route(<span class=\"hljs-string\">'admin.roles.edit'<\/span>, $role) }}<span class=\"hljs-string\">\" class=\"<\/span>btn btn-sm btn-outline-secondary<span class=\"hljs-string\">\"&gt;Edit&lt;\/a&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">            &lt;form action=\"<\/span>{{ route(<span class=\"hljs-string\">'admin.roles.destroy'<\/span>, $role) }}<span class=\"hljs-string\">\" method=\"<\/span>POST<span class=\"hljs-string\">\" class=\"<\/span>d-inline<span class=\"hljs-string\">\"&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">              @csrf @method('DELETE')<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">              &lt;button class=\"<\/span>btn btn-sm btn-outline-danger<span class=\"hljs-string\">\" onclick=\"<\/span><span class=\"hljs-keyword\">return<\/span> confirm(<span class=\"hljs-string\">'Delete this role?'<\/span>)<span class=\"hljs-string\">\"&gt;Delete&lt;\/button&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">            &lt;\/form&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">          &lt;\/td&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">        &lt;\/tr&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">      @endforeach<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;\/tbody&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">  &lt;\/table&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">  {{ $roles-&gt;links() }}<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">&lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">@endsection<\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span>&lt;!-- resources\/views\/admin\/users\/roles.blade.php --&gt;\n<\/span><\/span><span class='shcb-loc'><span>@extends(<span class=\"hljs-string\">'layouts.app'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>@section(<span class=\"hljs-string\">'content'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>&lt;div <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>=\"<span class=\"hljs-title\">container<\/span>\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">  &lt;<span class=\"hljs-title\">h1<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">h3<\/span> <span class=\"hljs-title\">mb<\/span>-3\"&gt;<span class=\"hljs-title\">Manage<\/span> <span class=\"hljs-title\">Roles<\/span> <span class=\"hljs-title\">for<\/span>: <\/span>{{ $user-&gt;name }}&lt;\/h1&gt;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  @<span class=\"hljs-keyword\">if<\/span>(session(<span class=\"hljs-string\">'status'<\/span>))\n<\/span><\/span><span class='shcb-loc'><span>    &lt;div <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>=\"<span class=\"hljs-title\">alert<\/span> <span class=\"hljs-title\">alert<\/span>-<span class=\"hljs-title\">success<\/span>\"&gt;<\/span>{{ session(<span class=\"hljs-string\">'status'<\/span>) }}&lt;\/div&gt;\n<\/span><\/span><span class='shcb-loc'><span>  @<span class=\"hljs-keyword\">endif<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>  &lt;form method=<span class=\"hljs-string\">\"POST\"<\/span> action=<span class=\"hljs-string\">\"{{ route('admin.users.roles.update', $user) }}\"<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>=\"<span class=\"hljs-title\">card<\/span> <span class=\"hljs-title\">card<\/span>-<span class=\"hljs-title\">body<\/span>\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">    @<span class=\"hljs-title\">csrf<\/span> @<span class=\"hljs-title\">method<\/span>('<span class=\"hljs-title\">PUT<\/span>')<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">    &lt;<span class=\"hljs-title\">div<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">row<\/span>\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">      @<span class=\"hljs-title\">foreach<\/span>($<span class=\"hljs-title\">roles<\/span> <span class=\"hljs-title\">as<\/span> $<span class=\"hljs-title\">role<\/span>)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">        &lt;<span class=\"hljs-title\">div<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">col<\/span>-<span class=\"hljs-title\">md<\/span>-4 <span class=\"hljs-title\">mb<\/span>-2\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">          &lt;<span class=\"hljs-title\">div<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">form<\/span>-<span class=\"hljs-title\">check<\/span>\"&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">            &lt;<span class=\"hljs-title\">input<\/span> <span class=\"hljs-title\">class<\/span>=\"<span class=\"hljs-title\">form<\/span>-<span class=\"hljs-title\">check<\/span>-<span class=\"hljs-title\">input<\/span>\" <span class=\"hljs-title\">type<\/span>=\"<span class=\"hljs-title\">checkbox<\/span>\" <span class=\"hljs-title\">name<\/span>=\"<span class=\"hljs-title\">roles<\/span>&#91;]\" <span class=\"hljs-title\">value<\/span>=\"<\/span>{{ $role-&gt;name }}<span class=\"hljs-string\">\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">              id=\"<\/span>role_{{ $role-&gt;id }}<span class=\"hljs-string\">\" {{ $user-&gt;hasRole($role-&gt;name) ? 'checked' : '' }}&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">            &lt;label for=\"<\/span>role_{{ $role-&gt;id }}<span class=\"hljs-string\">\" class=\"<\/span>form-check-label<span class=\"hljs-string\">\"&gt;{{ $role-&gt;name }}&lt;\/label&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">          &lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">        &lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">      @endforeach<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;div class=\"<\/span>mt<span class=\"hljs-number\">-3<\/span><span class=\"hljs-string\">\"&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">      &lt;button class=\"<\/span>btn btn-primary<span class=\"hljs-string\">\"&gt;Save&lt;\/button&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">    &lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">  &lt;\/form&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">&lt;\/div&gt;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">@endsection<\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In Blade, you can also show\/hide controls using directives:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines\"><span class='shcb-loc'><span>@role(<span class=\"hljs-string\">'Admin'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>  &lt;a href=<span class=\"hljs-string\">\"{{ route('admin.roles.index') }}\"<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>=\"<span class=\"hljs-title\">btn<\/span> <span class=\"hljs-title\">btn<\/span>-<span class=\"hljs-title\">sm<\/span> <span class=\"hljs-title\">btn<\/span>-<span class=\"hljs-title\">outline<\/span>-<span class=\"hljs-title\">primary<\/span>\"&gt;<span class=\"hljs-title\">Manage<\/span> <span class=\"hljs-title\">Roles<\/span>&lt;\/<span class=\"hljs-title\">a<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">@<span class=\"hljs-title\">endrole<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">@<span class=\"hljs-title\">can<\/span>('<span class=\"hljs-title\">posts<\/span>.<span class=\"hljs-title\">create<\/span>')<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\">  &lt;<span class=\"hljs-title\">a<\/span> <span class=\"hljs-title\">href<\/span>=\"<\/span>{{ url(<span class=\"hljs-string\">'\/posts\/create'<\/span>) }}<span class=\"hljs-string\">\" class=\"<\/span>btn btn-primary<span class=\"hljs-string\">\"&gt;New Post&lt;\/a&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-string\">@endcan<\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Security notes:<\/strong> Keep the admin routes behind <code>auth<\/code> + <code>role:Admin<\/code>. Validate inputs. Prefer <code>syncRoles<\/code> \/ <code>syncPermissions<\/code> to avoid stale assignments.<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 7 &#8211; Test Assignments Quickly<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">php artisan tinker\n\n&gt;&gt;&gt; $u = \\App\\Models\\User::first();\n&gt;&gt;&gt; $u-&gt;assignRole(<span class=\"hljs-string\">'Admin'<\/span>);\n&gt;&gt;&gt; $u-&gt;can(<span class=\"hljs-string\">'users.edit'<\/span>); <span class=\"hljs-comment\">\/\/ true if Admin has this permission<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>You now have a working RBAC foundation in Laravel 12: roles, permissions, protected routes, and a minimal UI to manage everything. From here, you can expand the interface (search, pagination, bulk assign), add activity logs, and expose APIs for admin operations.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-cover alignwide is-light\" style=\"min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffffff\"><\/span><div class=\"wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained\">\n<h2 class=\"wp-block-heading\"><strong>Grab a production-ready implementation<\/strong><\/h2>\n\n\n\n<p class=\"is-style-default\">If you don\u2019t want to wire up all the edge cases (UI, roles, permissions, settings toggles, demos), <strong>Grab a production-ready implementation<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center is-image-fill-element\" style=\"grid-template-columns:56% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"636\" src=\"https:\/\/1v0.net\/blog\/wp-content\/uploads\/2025\/08\/1-1024x636.jpg\" alt=\"\" class=\"wp-image-118 size-full\" style=\"object-position:50% 50%\" srcset=\"https:\/\/1v0.net\/blog\/wp-content\/uploads\/2025\/08\/1-1024x636.jpg 1024w, https:\/\/1v0.net\/blog\/wp-content\/uploads\/2025\/08\/1-300x186.jpg 300w, https:\/\/1v0.net\/blog\/wp-content\/uploads\/2025\/08\/1-768x477.jpg 768w, https:\/\/1v0.net\/blog\/wp-content\/uploads\/2025\/08\/1.jpg 1440w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000;font-size:32px\"><strong>Laravel Roles &amp; Permissions UI<\/strong><\/h2>\n\n\n\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">This lightweight Laravel starter kit helps you quickly integrate user roles and permissions using the popular spatie\/laravel-permission package.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button color--theme btn\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/1v0.net\/product\/laravel-roles-and-permissions-kit\">Learn more<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When building modern applications, one of the most common requirements is managing user roles and permissions. In this post, we\u2019ll break down the concepts, then show you how to implement them in a Laravel 12 app step by step \u2014 including a simple admin UI to manage roles and permissions. Definitions Role: A role is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":117,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[16,15,17],"class_list":["post-115","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-permissions","tag-roles","tag-roles-and-permissions"],"_links":{"self":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/comments?post=115"}],"version-history":[{"count":3,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/115\/revisions"}],"predecessor-version":[{"id":120,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/115\/revisions\/120"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media\/117"}],"wp:attachment":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/categories?post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/tags?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}