Gates Tutorial in Laravel 11
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
class UserController extends Controller
{
public function register(Request $request)
{
$data = $request->validate([
"name" => "required",
"email" => "required|email",
"password" => "required|confirmed",
"age" => "required",
"role" => "required"
]);
$user = User::create($data);
if ($user) {
return redirect()->route("login");
}
}
// public function loginPage()
// {
// if (Auth::id()) {
// return redirect()->route("dashboard");
// }
// return view("login");
// }
public function login(Request $request)
{
$credentials = $request->validate([
"email" => "required|email",
"password" => "required"
]);
if (Auth::attempt($credentials)) {
return redirect()->route("dashboard");
}
return redirect()->back();
}
public function logout()
{
Auth::logout();
return redirect()->route("login");
}
public function dashboardPage()
{
return view("dashboard");
// First way of usage of "Gate"
// Here below, authorize() method checks whether loggedin user's role is "admin" OR not, if user is admin
// then next line of code will be executed and if user is not admin then execution will be exit and a message
// will show of 403 page.
// Gate::authorize("isAdmin");
// return view("dashboard");
// Second way of usage of "Gate"
// if(Gate::allows("isAdmin")) {
// return view("dashboard");
// } else {
// return "Access Denied.";
// }
}
public function ViewProfile(int $userid)
{
// First way of "Gate" usage
// if (Gate::allows("view-profile", $userid)) {
// $user = User::findorfail($userid);
// return view("profile", compact("user"));
// } else {
// // return redirect()->route("dashboard");
// abort(403);
// }
// we can check multiple Gate methods simultaneously using any() method
// if we use any() method at that time we have to use array and inside array, if any one or all Gate methods
// become true then only execution will be true and further code will execute and
// if all Gate methods are false then only execution will be false and further code will not execute
// if (Gate::any(["view-profile","update-post"], $userid)) {
// $user = User::findorfail($userid);
// return view("profile", compact("user"));
// } else {
// // return redirect()->route("dashboard");
// abort(403);
// }
// Below condition will only true when both Gate methods false simultaneously then only condition will true
// and execution will go ahead
// if (Gate::none(["view-profile","update-post"], $userid)) {
// $user = User::findorfail($userid);
// return view("profile", compact("user"));
// } else {
// // return redirect()->route("dashboard");
// abort(403);
// }
// Second way of "Gate" usage
Gate::authorize("view-profile", $userid);
$user = User::findorfail($userid);
return view("profile", compact("user"));
}
public function ViewPost()
{
$posts = Post::where("user_id", Auth::id())->get();
// return $post;
return view("posts", compact("posts"));
}
public function UpdatePost($postid)
{
$post = Post::find($postid);
$targetUser = $post->user_id;
Gate::authorize("update-post", $targetUser);
// $post = Post::findorfail($postid);
return $post;
}
public function innerPage()
{
return view("inner");
}
}
Above File is app\Http\Controllers\UserController File
Below File is app\Http\Middleware\TestUser File
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class TestUser
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
echo "<h3 class='text-primary'>Test User Middleware</h3>";
return $next($request);
}
}
Below File is app\Http\Middleware\ValidUser File
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class ValidUser
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, string $role): Response
{
echo "<h3 class='text-primary'>We are now in ValidUser Middleware.</h3>";
echo "<h3 class='text-primary'>$role</h3>";
if (Auth::check() && Auth::user()->role == $role) {
return $next($request);
} else if (Auth::user()->role == "reader") {
return redirect()->route("user");
} else {
return redirect()->route("login");
}
}
public function terminate(Request $request, Response $response): void
{
// When user's request completed then after "terminate()" method will call
echo "<h3 class='text-danger'>We are now Terminating ValidUser Middleware.</h3>";
}
}
Below File is app\Models\Post File
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
public $timestamps = true;
protected $table = "posts";
protected $fillable = ["title", "description", "user_id"];
}
Below File is app\Models\User File
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable;
public $timestamps = true;
protected $table = "users";
/**
* The attributes that are mass assignable.
*
* @var list<string>
*/
protected $fillable = [
'name',
'email',
'password',
"age",
"role"
];
/**
* The attributes that should be hidden for serialization.
*
* @var list<string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
Below File is app\Providers\AppServiceProvider File
<?php
namespace App\Providers;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Gate::define("isAdmin", function (User $user) {
return $user->role === "admin";
});
Gate::define("view-profile", function (User $user, $profileUser) {
return $user->id === $profileUser;
});
// Below "$targetUser" value will get from URL
Gate::define("update-post", function (User $user, $targetUser) {
return $user->id === $targetUser;
});
Gate::define("delete-post", function (User $user, $targetUser) {
return $user->id === $targetUser;
});
// before() method will execute before any of Gate methods, generally we use before() method to check
// user is already loggedin or not
Gate::before(function (User $user) {
echo "Before Gate";
});
// after() method will execute after all Gate methods execution
Gate::after(function (User $user) {
echo "After Gate";
});
}
}
Below File is bootstrap\app File
<?php
use App\Http\Middleware\TestUser;
use App\Http\Middleware\ValidUser;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__ . '/../routes/web.php',
commands: __DIR__ . '/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
"IsUserValid" => ValidUser::class
]);
// Middleware groups
// we can use "prependToGroup()" instead of "appendToGroup()" method
// $middleware->appendToGroup("ok-user",[
// ValidUser::class,
// TestUser::class
// ]);
// Global Middleware
// $middleware->append(TestUser::class);
// If we want to apply multiple Global Middleware simultaneously then we can do as shown below :
// $middleware->use([
// TestUser::class,
// ValidUser::class
// ]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Below File is database\json\posts File
[
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"description": "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
"user_id": 1
},
{
"title": "Ut enim ad minim veniam, quis nostrud exercitation",
"description": "ullamco laboris nisi ut aliquip ex ea commodo consequat",
"user_id": 2
},
{
"title": "Duis aute irure dolor in reprehenderit in voluptate velit",
"description": "esse cillum dolore eu fugiat nulla pariatur",
"user_id": 1
},
{
"title": "Excepteur sint occaecat cupidatat non proident",
"description": "sunt in culpa qui officia deserunt mollit anim id est laborum",
"user_id": 3
},
{
"title": "Sed ut perspiciatis unde omnis iste natus error sit",
"description": "voluptatem accusantium doloremque laudantium",
"user_id": 3
},
{
"title": "totam rem aperiam, eaque",
"description": "ipsa quae ab illo inventore veritatis et quasi architecto",
"user_id": 2
},
{
"title": "beatae vitae dicta sunt explicabo",
"description": "Nemo enim ipsam voluptatem quia",
"user_id": 1
},
{
"title": "voluptas sit aspernatur aut odit aut fugit",
"description": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt",
"user_id": 2
},
{
"title": "Neque porro quisquam est",
"description": "qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit",
"user_id": 3
},
{
"title": "sed quia non numquam eius modi",
"description": "tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem",
"user_id": 2
}
]
Below File is database\migrations\2024_12_26_051021_create_users_table File
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string("name");
$table->string("email");
$table->string("password");
$table->integer("age");
$table->string("role");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
}
};
Below File is database\migrations\2024_12_26_054403_create_posts_table File
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string("title");
$table->longText("description");
$table->unsignedBigInteger("user_id");
$table->foreign("user_id")->references("id")->on("users")->onUpdate("cascade")->onDelete("cascade");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('posts');
}
};
Below File is database\seeders\DatabaseSeeder File
<?php
namespace Database\Seeders;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// User::factory(10)->create();
// User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
$this->call([
PostSeeder::class
]);
}
}
Below File is database\seeders\PostSeeder File
<?php
namespace Database\Seeders;
use App\Models\Post;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;
class PostSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$json = File::get(path: "database/json/posts.json");
$posts = collect(json_decode($json));
$posts->each(function ($post) {
Post::create([
"title" => $post->title,
"description" => $post->description,
"user_id" => $post->user_id
]);
});
}
}
Below File is resources\views\dashboard.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Dashboard</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h1>Welcome, {{ Auth::user()->name }}</h1>
</div>
<div class="card-body">
{{ Auth::user() }}
<a href="{{ route("inner") }}" class="btn btn-primary mt-5">Go to Inner Page</a>
{{-- Below is the First way usage of "Gate" in blade file --}}
@if(Gate::allows("isAdmin"))
<a href="#" class="btn btn-success mt-5">Admin Panel</a>
@endif
{{-- Below is the Second way usage of "Gate" in blade file --}}
{{-- @can("isAdmin")
<a href="#" class="btn btn-success mt-5">Admin Panel</a>
@else
<a href="#" class="btn btn-success mt-5">Other Link</a>
@endcan --}}
{{-- Below is the opposite of above condition for "Gate" usage in blade file --}}
{{-- @cannot("isAdmin")
<a href="#" class="btn btn-success mt-5">Admin Panel</a>
@endcannot --}}
<a href="{{ route("profile.show",Auth::id()) }}" class="btn btn-primary mt-5">Profile</a>
<a href="{{ route("posts.show",Auth::id()) }}" class="btn btn-warning mt-5">Post</a>
<a href="{{ route("login") }}" class="btn btn-danger mt-5">Logout</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\inner.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Inner Page</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h1>Inner Page</h1>
</div>
<div class="card-body">
<a href="{{ route("dashboard") }}" class="btn btn-primary">Back to Dashboard</a>
<a href="{{ route("login") }}" class="btn btn-danger">Logout</a><br><br>
@if(auth()->check())
Id : {{ auth()->id() }},
Name : {{ Auth::user()->name }},
Email : {{ Auth::user()->email }},
Age : {{ Auth::user()->age }},
Role : {{ Auth::user()->role }}
@endif
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\login.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Login</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h3>Login</h3>
</div>
<div class="card-body">
<form action="{{ route("loginMatch") }}" method="POST">
@csrf
<div class="mb-3">
<label for="useremail" class="form-label">Email Address</label>
<input type="email" value="{{ old("email") }}" name="email" class="form-control @error("email") is-invalid @enderror" id="useremail" placeholder="Enter email"/>
<span class="text-danger">
@error("email")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="userpassword" class="form-label">Password</label>
<input type="password" value="{{ old("password") }}" name="password" class="form-control @error("password") is-invalid @enderror" id="userpassword" placeholder="Enter password"/>
<span class="text-danger">
@error("password")
{{ $message }}
@enderror
</span>
</div>
<button type="submit" class="btn btn-primary">Login</button>
<a href="{{ route("welcomeTwo") }}" class="btn btn-secondary">Back</a>
</form>
</div>
@if($errors->any())
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\posts.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Post</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-10 mt-5">
<div class="card">
<div class="card-header">
<h1>Posts</h1>
</div>
<div class="card-body">
<table class="table table-bordered table-striped table-hover">
<thead>
<th>Id</th>
<th>Title</th>
<th>Description</th>
<th>Update</th>
<th>Delete</th>
</thead>
@foreach($posts as $data)
<tbody>
<td>{{ $data->id }}</td>
<td>{{ $data->title }}</td>
<td>{{ $data->description }}</td>
<td><a href="{{ route("post.update",$data->id) }}" class="btn btn-success">Update</a></td>
<td><a href="" class="btn btn-danger">Delete</a></td>
</tbody>
@endforeach
</table>
<a href="{{ route("dashboard") }}" class="btn btn-secondary">Back</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\profile.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Profile</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h1>Profile</h1>
</div>
<div class="card-body">
<table class="table">
<tr>
<th>Id</th>
<td>{{ $user->id }}</td>
</tr>
<tr>
<th>Name</th>
<td>{{ $user->name }}</td>
</tr>
<tr>
<th>Email</th>
<td>{{ $user->email }}</td>
</tr>
<tr>
<th>Age</th>
<td>{{ $user->age }}</td>
</tr>
<tr>
<th>Role</th>
<td>{{ $user->role }}</td>
</tr>
</table>
<a href="{{ route("dashboard") }}" class="btn btn-secondary">Back</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\register.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Register</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h3>Register</h3>
</div>
<div class="card-body">
<form action="{{ route("registerSave") }}" method="POST">
@csrf
<div class="mb-3">
<label for="username" class="form-label">Name</label>
<input type="text" value="{{ old("name") }}" name="name" class="form-control @error("name") is-invalid @enderror" id="username" placeholder="Enter username"/>
<span class="text-danger">
@error("name")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="useremail" class="form-label">Email address</label>
<input type="email" value="{{ old("email") }}" name="email" class="form-control @error("email") is-invalid @enderror" id="useremail" placeholder="Enter email"/>
<span class="text-danger">
@error("email")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="userage" class="form-label">Age</label>
<input type="text" value="{{ old("age") }}" name="age" class="form-control @error("age") is-invalid @enderror" id="userage" placeholder="Enter age"/>
<span class="text-danger">
@error("age")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="userpassword" class="form-label">Password</label>
<input type="password" value="{{ old("password") }}" name="password" class="form-control @error("password") is-invalid @enderror" id="userpassword" placeholder="Enter password"/>
<span class="text-danger">
@error("password")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="userpassword-confirm" class="form-label">Confirm Password</label>
<input type="password" value="{{ old("password_confirmation") }}" name="password_confirmation" class="form-control @error("password-confirmation") is-invalid @enderror" id="userpassword-confirm" placeholder="Enter confirm password"/>
<span class="text-danger">
@error("password_confirmation")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label for="userrole" class="form-label">Role</label>
<input type="text" value="{{ old("role") }}" name="role" class="form-control @error("role") is-invalid @enderror" id="userrole" placeholder="Enter role"/>
<span class="text-danger">
@error("role")
{{ $message }}
@enderror
</span>
</div>
<button type="submit" class="btn btn-primary">Register</button>
<a href="{{ route("welcomeTwo") }}" class="btn btn-secondary">Back</a>
</form>
</div>
@if($errors->any())
<div class="card-footer text-body-secondary">
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
@endif
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\user.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Readers Page</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h3>Readers Page</h3>
</div>
<div class="card-body">
Hello, Reader
<a href="{{ route("logout") }}" class="btn btn-danger">Logout</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is resources\views\welcomeTwo.blade.php File
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>welcomeTwo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-5 mt-5">
<div class="card">
<div class="card-header">
<h1 class="mb-5">Laravel Authentication</h1>
</div>
<div class="card-body">
<a href="{{ route("register") }}" class="btn btn-primary">Register</a>
<a href="{{ route("login") }}" class="btn btn-primary">Login</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Below File is routes\web.php File
<?php
use App\Http\Controllers\UserController;
use App\Http\Middleware\TestUser;
use App\Http\Middleware\ValidUser;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Route::get("/user", function () {
return view("user");
})->name("user");
Route::view("welcomeTwo", "welcomeTwo")->name("welcomeTwo");
Route::view("/register", "register")->name("register");
Route::view("/login", "login")->name("login");
Route::controller(UserController::class)->group(function () {
Route::post("registerSave", "register")->name("registerSave");
Route::post("/loginMatch", "login")->name("loginMatch");
Route::post("/logout", "logout")->name("logout");
Route::get("/dashboard", "dashboardPage")->name("dashboard");
// we can pass "Gate" with route as shown below :
// Route::get("/dashboard", "dashboardPage")->name("dashboard")->middleware("can:isAdmin");
Route::get("dashboard/inner", "innerPage")->name("inner");
Route::get("/profile/{id}", "ViewProfile")->name("profile.show");
Route::get("/posts/{id}", "ViewPost")->name("posts.show");
Route::get("/single-post/{id}", "UpdatePost")->name("post.update");
});
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
Comments
Post a Comment