پنل مدیریت یکی از بخشهای مهم بسیاری از وبسایتها و نرمافزارهای تحت وب است. مدیر سایت از طریق این بخش میتواند کاربران را مدیریت کند، اطلاعات را تغییر دهد، محتوای جدید منتشر کند و وضعیت کلی سیستم را بررسی کند.
فریمورک Laravel ابزارهای متعددی برای پیادهسازی پنل مدیریت در اختیار توسعهدهندگان قرار میدهد؛ از سیستم مسیریابی و کنترلرها گرفته تا احراز هویت، مجوزهای دسترسی، قالب Blade و ارتباط با پایگاه داده.
در این آموزش یاد میگیریم چگونه یک پنل مدیریت ساده و قابل توسعه در Laravel بسازیم. تمرکز ما بر ساخت دستی پنل با ابزارهای اصلی لاراول است تا ساختار آن را بهخوبی درک کنیم. در پایان نیز با راهکارهای سریعتر برای ساخت پنلهای حرفهای آشنا میشویم.
پنل مدیریت در Laravel چیست؟
پنل مدیریت یا Admin Panel بخشی از یک نرمافزار تحت وب است که امکانات مدیریتی را در اختیار کاربران مجاز قرار میدهد.
برای مثال، در یک فروشگاه اینترنتی، پنل مدیریت میتواند امکانات زیر را داشته باشد:
- مشاهده آمار سفارشها و فروش
- افزودن، ویرایش و حذف محصولات
- مدیریت کاربران و سفارشها
- انتشار و ویرایش مقالات
- مدیریت تنظیمات سایت
- بررسی گزارشها و فعالیتهای کاربران
نکته مهم این است که پنل مدیریت صرفاً یک صفحه با ظاهر متفاوت نیست. یک پنل امن باید احراز هویت، کنترل مجوزها، اعتبارسنجی اطلاعات و محافظت از عملیات حساس را نیز پیادهسازی کند.
پیشنیازهای ساخت پنل مدیریت
برای دنبال کردن این آموزش بهتر است با مفاهیم پایه لاراول آشنا باشید:
- تعریف Route و استفاده از Controller
- ساخت View با Blade
- کار با Migration و مدلهای Eloquent
- اعتبارسنجی اطلاعات فرمها
- آشنایی با Middleware و احراز هویت
اگر هنوز با این مفاهیم آشنا نیستید، پیشنهاد میکنیم ابتدا مقالات آموزش Route در Laravel، آموزش Controller در Laravel، آموزش Blade در Laravel و آموزش احراز هویت در Laravel را مطالعه کنید.
روشهای ساخت پنل مدیریت در Laravel
برای ساخت پنل مدیریت لاراول چند راهکار مختلف وجود دارد.
| روش | مزایا | مناسب برای |
|---|---|---|
| ساخت دستی با Blade | کنترل کامل روی ظاهر و منطق | پنلهای اختصاصی و آموزشی |
| استفاده از Livewire | ساخت رابطهای تعاملی با کدنویسی کمتر سمت JavaScript | پنلهای تعاملی |
| استفاده از Filament | ساخت سریع فرمها، جدولها و صفحات مدیریتی | پنلهای CRUD و داشبوردهای متداول |
| استفاده از Vue یا React | آزادی عمل بالا برای رابطهای پیچیده | برنامههای تحت وب تعاملی |
در این مقاله پنل را بهصورت دستی میسازیم. این روش کمک میکند ساختار داخلی پنل را بشناسید و بعداً بتوانید آن را با ابزارهایی مانند Filament توسعه دهید.
مرحله اول: ایجاد ساختار مسیرهای پنل مدیریت
ابتدا باید مسیرهایی را تعریف کنیم که کاربران از طریق آنها به بخش مدیریت دسترسی پیدا کنند.
فایل routes/web.php را باز کنید و مسیرهای پنل را به شکل زیر تعریف کنید:
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Admin\DashboardController;
Route::prefix('admin')
->name('admin.')
->middleware(['auth', 'admin'])
->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
});
در این مثال سه نکته مهم وجود دارد:
prefix('admin')باعث میشود مسیرهای این گروه با/adminشروع شوند.name('admin.')پیشوند نام مسیرها را مشخص میکند.middleware(['auth', 'admin'])دسترسی را به کاربران واردشدهای محدود میکند که Middleware مربوط به مجوز مدیریت را نیز پشت سر بگذارند.
با این تنظیمات، مسیر داشبورد به شکل /admin/dashboard خواهد بود و نام آن admin.dashboard است.
توجه: استفاده از auth بهتنهایی برای حفاظت از پنل مدیریت کافی نیست؛ زیرا ممکن است هر کاربر واردشدهای مدیر نباشد. در مرحله بعد، Middleware مربوط به دسترسی مدیر را پیادهسازی میکنیم.
مرحله دوم: کنترل دسترسی مدیران
یکی از مهمترین بخشهای ساخت پنل مدیریت، مشخص کردن این موضوع است که چه کاربرانی اجازه ورود به پنل را دارند.
برای نمونه، فرض میکنیم مدل User دارای ستونی به نام is_admin از نوع Boolean است. این ستون باید از طریق Migration به پایگاه داده اضافه شده باشد.
برای ایجاد Middleware میتوانیم از دستور زیر استفاده کنیم:
php artisan make:middleware EnsureUserIsAdmin
سپس فایل app/Http/Middleware/EnsureUserIsAdmin.php را به شکل زیر تکمیل میکنیم:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsureUserIsAdmin
{
public function handle(
Request $request,
Closure $next
): Response {
$user = $request->user();
if (! $user || ! $user->is_admin) {
abort(403, 'شما اجازه دسترسی به این بخش را ندارید.');
}
return $next($request);
}
}
این Middleware ابتدا کاربر درخواست را بررسی میکند. اگر کاربر مدیر نباشد، پاسخ خطای 403 Forbidden برگردانده میشود.
ثبت Middleware در Laravel
برای استفاده از نام admin در مسیرها باید Middleware را با این نام مستعار ثبت کنید.
در Laravel 11 و نسخههای جدیدتر، معمولاً این کار در فایل bootstrap/app.php انجام میشود:
use App\Http\Middleware\EnsureUserIsAdmin;
use Illuminate\Foundation\Configuration\Middleware;
->withMiddleware(function (Middleware $middleware): void {
$middleware->alias([
'admin' => EnsureUserIsAdmin::class,
]);
})
این قطعه را داخل زنجیره پیکربندی موجود در bootstrap/app.php قرار دهید؛ نباید یک زنجیره جدید و مستقل در انتهای فایل ایجاد کنید.
در نسخههای قدیمیتر Laravel، محل ثبت نام مستعار Middleware معمولاً فایل app/Http/Kernel.php است.
اگر پروژه شما از قبل سیستم نقشها و مجوزها را دارد، بهتر است بهجای اضافه کردن ستون جدید، از همان سیستم موجود استفاده کنید. برای پروژههای بزرگتر نیز ابزارهایی مانند spatie/laravel-permission میتوانند مدیریت نقشها و مجوزها را سادهتر کنند.
مرحله سوم: ساخت کنترلر داشبورد
حالا باید کنترلری بسازیم که اطلاعات داشبورد را آماده کرده و به View ارسال کند.
دستور زیر را اجرا کنید:
php artisan make:controller Admin/DashboardController
سپس فایل app/Http/Controllers/Admin/DashboardController.php را باز کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\View\View;
class DashboardController extends Controller
{
public function index(): View
{
$usersCount = User::count();
return view('admin.dashboard', [
'usersCount' => $usersCount,
]);
}
}
در این مثال، تعداد کاربران از پایگاه داده دریافت میشود و به View داشبورد ارسال میشود.
با گسترش برنامه میتوانید اطلاعات دیگری مانند تعداد سفارشها، محصولات، مقالات منتشرشده یا درآمد را نیز در همین بخش محاسبه کنید. البته نام مدلها و نحوه محاسبه آمار باید با ساختار واقعی پروژه شما هماهنگ باشد.
مرحله چهارم: ساخت قالب اصلی پنل با Blade
بهتر است تمام صفحات پنل مدیریت از یک قالب مشترک استفاده کنند. این کار باعث میشود سربرگ، منوی کناری و ساختار کلی صفحه در تمام بخشها یکسان باقی بماند.
ابتدا پوشه زیر را ایجاد کنید:
resources/views/admin/layouts
سپس فایل resources/views/admin/layouts/app.blade.php را بسازید:
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title', 'پنل مدیریت')</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="min-h-screen bg-gray-100 text-gray-800">
<div class="flex min-h-screen">
<aside class="w-64 bg-gray-900 p-5 text-white">
<h1 class="mb-8 text-xl font-bold">
پنل مدیریت
</h1>
<nav class="space-y-3">
<a
href="{{ route('admin.dashboard') }}"
class="block rounded p-2 hover:bg-gray-800"
>
داشبورد
</a>
</nav>
</aside>
<main class="flex-1 p-6">
<header class="mb-6 rounded-lg bg-white p-4 shadow-sm">
<h2 class="text-xl font-semibold">
@yield('page_heading', 'داشبورد')
</h2>
</header>
@yield('content')
</main>
</div>
</body>
</html>
در این قالب از Tailwind CSS استفاده شده است. اگر Tailwind در پروژه شما نصب و پیکربندی نشده باشد، باید ابتدا آن را راهاندازی کنید یا کلاسها را با CSS معمولی جایگزین کنید.
همچنین از دستور @vite استفاده کردهایم تا فایلهای CSS و JavaScript پروژه از طریق Vite بارگذاری شوند.
مرحله پنجم: ساخت صفحه داشبورد
اکنون پوشه resources/views/admin را ایجاد کنید و فایل dashboard.blade.php را داخل آن بسازید:
@extends('admin.layouts.app')
@section('title', 'داشبورد مدیریت')
@section('page_heading', 'داشبورد مدیریت')
@section('content')
<div class="grid grid-cols-1 gap-5 md:grid-cols-3">
<div class="rounded-lg bg-white p-6 shadow-sm">
<p class="text-sm text-gray-500">
تعداد کاربران
</p>
<p class="mt-3 text-3xl font-bold">
{{ number_format($usersCount) }}
</p>
</div>
<div class="rounded-lg bg-white p-6 shadow-sm">
<p class="text-sm text-gray-500">
وضعیت پنل
</p>
<p class="mt-3 text-xl font-semibold">
فعال
</p>
</div>
<div class="rounded-lg bg-white p-6 shadow-sm">
<p class="text-sm text-gray-500">
حساب کاربری
</p>
<p class="mt-3 text-lg font-semibold">
{{ auth()->user()->name }}
</p>
</div>
</div>
@endsection
این صفحه یک داشبورد ساده شامل تعداد کاربران، وضعیت پنل و نام کاربر واردشده نمایش میدهد.
در Blade، عبارتهایی مانند {{ $usersCount }} بهصورت خودکار با سازوکار Escape لاراول نمایش داده میشوند؛ بنابراین برای خروجی متنی معمولی، از این روش استفاده کنید و تا حد امکان از {!! !!} برای نمایش محتوای کنترلنشده کاربران خودداری کنید.
مرحله ششم: افزودن بخش مدیریت کاربران
یک پنل واقعی معمولاً به بخشهای مختلفی مانند کاربران، محصولات، سفارشها و مقالات نیاز دارد. بهتر است برای هر بخش، مسیر و کنترلر مشخصی داشته باشید.
برای نمونه، کنترلر کاربران را ایجاد کنید:
php artisan make:controller Admin/UserController
سپس مسیر نمایش فهرست کاربران را به گروه مسیرهای مدیریت اضافه کنید:
use App\Http\Controllers\Admin\UserController;
Route::get('/users', [UserController::class, 'index'])
->name('users.index');
این مسیر باید داخل همان گروه prefix('admin')، name('admin.') و Middlewareهای مدیریتی قرار بگیرد.
حالا متد index را در UserController پیادهسازی کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\View\View;
class UserController extends Controller
{
public function index(): View
{
$users = User::query()
->select(['id', 'name', 'email', 'created_at'])
->latest()
->paginate(15);
return view('admin.users.index', [
'users' => $users,
]);
}
}
در این مثال، فقط ستونهای موردنیاز دریافت میشوند و نتایج با صفحهبندی ۱۵تایی نمایش داده خواهند شد. برای آشنایی بیشتر با این قابلیت، مقاله آموزش Pagination در Laravel را مطالعه کنید.
سپس فایل resources/views/admin/users/index.blade.php را بسازید:
@extends('admin.layouts.app')
@section('title', 'مدیریت کاربران')
@section('page_heading', 'مدیریت کاربران')
@section('content')
<div class="overflow-x-auto rounded-lg bg-white p-5 shadow-sm">
<table class="w-full text-right">
<thead>
<tr class="border-b">
<th class="p-3">شناسه</th>
<th class="p-3">نام</th>
<th class="p-3">ایمیل</th>
<th class="p-3">تاریخ عضویت</th>
</tr>
</thead>
<tbody>
@forelse ($users as $user)
<tr class="border-b">
<td class="p-3">{{ $user->id }}</td>
<td class="p-3">{{ $user->name }}</td>
<td class="p-3">{{ $user->email }}</td>
<td class="p-3">
{{ $user->created_at?->format('Y-m-d') ?? '—' }}
</td>
</tr>
@empty
<tr>
<td colspan="4" class="p-5 text-center">
کاربری برای نمایش وجود ندارد.
</td>
</tr>
@endforelse
</tbody>
</table>
<div class="mt-5">
{{ $users->links() }}
</div>
</div>
@endsection
برای دسترسی به این صفحه، لینک آن را به منوی کناری قالب اصلی اضافه کنید:
<a
href="{{ route('admin.users.index') }}"
class="block rounded p-2 hover:bg-gray-800"
>
مدیریت کاربران
</a>
توجه کنید که این نمونه صرفاً فهرست کاربران را نمایش میدهد. برای افزودن عملیات ویرایش یا حذف، باید مجوزهای لازم را جداگانه بررسی کنید. همچنین بهتر است از حذف حساب مدیر فعلی یا تغییر نقشهای حساس بدون کنترلهای مناسب جلوگیری شود.
مرحله هفتم: تفاوت احراز هویت و مجوز دسترسی
در طراحی پنل مدیریت، دو مفهوم را نباید با یکدیگر اشتباه بگیرید:
- Authentication یا احراز هویت: مشخص میکند کاربر چه کسی است.
- Authorization یا مجوز دسترسی: مشخص میکند کاربر اجازه انجام چه کاری را دارد.
برای مثال، ممکن است کاربری وارد سایت شده باشد، اما اجازه مشاهده فهرست تمام کاربران را نداشته باشد. حتی در میان مدیران نیز ممکن است یک نفر فقط اجازه مدیریت محتوا داشته باشد و شخص دیگری بتواند تنظیمات مالی را تغییر دهد.
در پروژههای ساده، میتوان از Middleware استفاده کرد. در پروژههای بزرگتر، Policyها، Gateها و سیستم نقش و مجوز به مدیریت دقیقتر دسترسیها کمک میکنند.
برای مطالعه بیشتر، مقاله آموزش Authorization در Laravel را ببینید.
مرحله هشتم: نکات امنیتی پنل مدیریت
امنیت پنل مدیریت باید از ابتدای طراحی در نظر گرفته شود، نه پس از تکمیل آن.
۱. تمام مسیرهای مدیریتی را محافظت کنید
فقط صفحه داشبورد را با Middleware محدود نکنید. مسیرهای مربوط به کاربران، سفارشها، تنظیمات، گزارشها و عملیات حساس نیز باید کنترل دسترسی داشته باشند.
۲. برای عملیات تغییر اطلاعات از متدهای مناسب استفاده کنید
برای ایجاد، ویرایش و حذف اطلاعات، از درخواستهای مناسب مانند POST، PUT، PATCH و DELETE استفاده کنید. عملیات تغییردهنده نباید صرفاً با باز کردن یک لینک GET اجرا شود.
۳. اعتبارسنجی اطلاعات را فراموش نکنید
اطلاعات فرمها باید در سمت سرور اعتبارسنجی شوند. مخفی کردن دکمه یا اعتبارسنجی سمت مرورگر، جایگزین اعتبارسنجی در Laravel نیست.
برای نمونه، پیش از ذخیره اطلاعات از قواعد اعتبارسنجی مناسب استفاده کنید یا اعتبارسنجی را در یک Form Request جداگانه قرار دهید.
۴. از CSRF Protection استفاده کنید
در فرمهای وب Laravel، برای درخواستهای تغییردهنده از توکن CSRF استفاده کنید:
<form method="POST" action="{{ route('admin.users.store') }}">
@csrf
<!-- فیلدهای فرم -->
<button type="submit">ذخیره</button>
</form>
در این مثال باید مسیر admin.users.store را نیز تعریف کرده باشید. اگر فرم و مسیر واقعی شما متفاوت است، نام مسیر را مطابق پروژه تغییر دهید.
۵. از Mass Assignment ناامن جلوگیری کنید
هنگام ذخیره اطلاعات مدل، فقط فیلدهای مجاز را دریافت و ذخیره کنید. برای مثال، اجازه ندهید یک کاربر عادی با ارسال فیلد is_admin نقش خود را به مدیر تغییر دهد.
۶. عملیات حساس را ثبت کنید
تغییر نقش مدیران، تغییر تنظیمات پرداخت، حذف اطلاعات مهم و سایر عملیات حساس بهتر است با جزئیات مناسب در لاگ یا سیستم ثبت رویدادها نگهداری شوند.
۷. به محدودسازی درخواستها توجه کنید
برای بخشهایی مانند ورود، ارسال کد تأیید و عملیات حساس، محدودسازی تعداد درخواستها میتواند از برخی حملات و سوءاستفادهها جلوگیری کند. برای جزئیات بیشتر مقاله Rate Limiting در Laravel را مطالعه کنید.
مرحله نهم: تست پنل مدیریت
پس از پیادهسازی، باید رفتار پنل را در شرایط مختلف بررسی کنید.
حداقل این سناریوها را آزمایش کنید:
- کاربر مهمان به صفحه مدیریت دسترسی نداشته باشد.
- کاربر واردشده اما غیرمدیر، با پاسخ مناسب مانند
403مواجه شود. - مدیر بتواند داشبورد را مشاهده کند.
- فهرست کاربران بهدرستی صفحهبندی شود.
- مسیرهای مدیریتی جدید نیز همان کنترلهای دسترسی را داشته باشند.
برای تست خودکار، میتوانید از Feature Testهای لاراول استفاده کنید. برای مثال، فرض میکنیم در مدل User ستون is_admin وجود دارد و مسیر داشبورد مطابق آموزش تعریف شده است:
<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminDashboardTest extends TestCase
{
use RefreshDatabase;
public function test_guest_cannot_access_admin_dashboard(): void
{
$response = $this->get(route('admin.dashboard'));
$response->assertRedirect();
}
public function test_admin_can_access_admin_dashboard(): void
{
$admin = User::factory()->create([
'is_admin' => true,
]);
$response = $this->actingAs($admin)
->get(route('admin.dashboard'));
$response->assertOk();
}
public function test_regular_user_cannot_access_admin_dashboard(): void
{
$user = User::factory()->create([
'is_admin' => false,
]);
$response = $this->actingAs($user)
->get(route('admin.dashboard'));
$response->assertForbidden();
}
}
این تستها فرض میکنند احراز هویت پروژه بهدرستی تنظیم شده و Factory مدل User قابل استفاده است. اگر در پروژه شما کاربران با Guard دیگری احراز هویت میشوند یا ورود به پنل مسیر متفاوتی دارد، تستها را متناسب با تنظیمات پروژه تغییر دهید.
برای اجرای تستها میتوانید از دستور زیر استفاده کنید:
php artisan test
ساخت پنل مدیریت با Filament؛ راهکار سریعتر
اگر هدف شما ساخت سریع یک پنل حرفهای برای مدیریت کاربران، محصولات، سفارشها و سایر دادههاست، لازم نیست همه اجزا را از ابتدا بنویسید.
Filament یکی از ابزارهای شناختهشده اکوسیستم Laravel است که امکاناتی مانند فرمها، جدولهای مدیریتی، فیلترها، عملیات گروهی و داشبورد را فراهم میکند. این ابزار برای بسیاری از پروژههای مدیریتی و CRUD مناسب است.
بااینحال، استفاده از Filament نیز به معنای حذف نیاز به طراحی مجوزها و کنترل دسترسی نیست. باید نسخه سازگار با Laravel و PHP پروژه خود را انتخاب کنید و دسترسی به پنل و منابع مدیریتی را بهدرستی محدود کنید.
اگر نیاز شما یک پنل کاملاً اختصاصی با رفتارهای پیچیده و رابط کاربری ویژه است، ساخت دستی با Blade یا ترکیب Laravel با ابزارهای تعاملی دیگر نیز میتواند انتخاب مناسبی باشد.
جمعبندی
برای ساخت پنل مدیریت در Laravel باید چند بخش را کنار هم قرار دهید: مسیرهای مدیریتی، Middleware دسترسی، کنترلرها، قالبهای Blade، ارتباط با پایگاه داده و تستهای امنیتی.
در این آموزش یک داشبورد ساده و صفحه فهرست کاربران ایجاد کردیم. این ساختار میتواند پایهای برای توسعه امکاناتی مانند مدیریت محصولات، سفارشها، مقالات، نقشها و تنظیمات باشد.
به یاد داشته باشید که مهمترین بخش یک پنل مدیریت فقط ظاهر آن نیست؛ کنترل دسترسی در سمت سرور، اعتبارسنجی اطلاعات و تست مسیرهای حساس نقش اساسی در امنیت آن دارند.
اگر میخواهید یادگیری Laravel را بهصورت مرحلهبهمرحله ادامه دهید، مقاله بعدی این مجموعه به ساخت رابطهای تعاملی با Laravel و Livewire میپردازد.
سوالات متداول
آیا Laravel بهصورت پیشفرض پنل مدیریت دارد؟
خیر. Laravel امکانات پایهای مانند مسیریابی، احراز هویت، مجوزهای دسترسی و قالبسازی را فراهم میکند، اما پنل مدیریت کامل باید با کدنویسی یا ابزارهایی مانند Filament ساخته شود.
آیا برای ساخت پنل مدیریت باید از Bootstrap یا Tailwind استفاده کنم؟
خیر. این ابزارها اجباری نیستند. میتوانید از CSS معمولی، Bootstrap، Tailwind یا هر ابزار مناسب دیگری استفاده کنید. انتخاب آنها به نیاز رابط کاربری و ساختار پروژه بستگی دارد.
آیا احراز هویت برای محافظت از پنل مدیریت کافی است؟
خیر. احراز هویت مشخص میکند چه کسی وارد سیستم شده است، اما مجوز دسترسی تعیین میکند چه کاری میتواند انجام دهد. پنل مدیریت باید علاوه بر احراز هویت، مجوزهای مناسب داشته باشد.
برای ساخت سریع پنل ادمین در Laravel چه ابزاری مناسب است؟
Filament برای بسیاری از پنلهای مدیریتی مبتنی بر فرم و جدول گزینه مناسبی است. بااینحال، انتخاب نهایی به پیچیدگی پروژه، نسخه Laravel و میزان سفارشیسازی موردنیاز بستگی دارد.
آیا میتوان پنل مدیریت را با Vue یا React ساخت؟
بله. Laravel میتواند بکاند برنامه را فراهم کند و Vue یا React برای ساخت رابط کاربری تعاملی استفاده شوند. در این معماری، طراحی API، احراز هویت و کنترل مجوزها نیز باید متناسب با روش ارتباطی انتخابشده انجام شود.





