وقتی کاربر وارد یک وبسایت میشود، معمولاً انتظار دارد یک صفحه HTML، اطلاعات یک محصول، لیست مقالات یا فرم خاصی را مشاهده کند.
در Laravel بخشی که مسئول آمادهسازی و نمایش رابط کاربری برنامه است، View نام دارد.
برای مثال ممکن است کاربر وارد این آدرس شود:
/products
در این حالت درخواست میتواند چنین مسیری را طی کند:
Browser
↓
Route
↓
Controller
↓
View
↓
HTML Response
↓
Browser
در مقاله قبلی درباره Controller در Laravel صحبت کردیم و دیدیم Controller میتواند داده را آماده کرده و به View ارسال کند.
حالا در این مقاله میخواهیم دقیقاً بررسی کنیم که View در Laravel چیست، کجا قرار دارد، چگونه ساخته میشود، چگونه از Controller داده دریافت میکند و چگونه برای ساخت صفحات مختلف استفاده میشود.
# View در Laravel چیست؟
View بخشی از برنامه است که مسئول نمایش اطلاعات به کاربر است.
در یک پروژه Laravel، View معمولاً شامل HTML و کدهای مربوط به نمایش دادهها است.
برای مثال یک View ساده:
<h1>Hello Laravel</h1>
میتواند خروجی HTML موردنظر را تولید کند.
Viewها معمولاً در مسیر زیر قرار میگیرند:
resources/views
برای مثال:
resources/views/welcome.blade.php
در Laravel، Viewها معمولاً با پسوند:
.blade.php
ساخته میشوند.
این موضوع ما را به یکی از مهمترین بخشهای Laravel یعنی Blade میرساند که در مقاله بعدی بهصورت کامل بررسی خواهد شد.
# View در معماری Laravel چه نقشی دارد؟
Laravel از ساختاری استفاده میکند که در بسیاری از پروژهها با مفهوم MVC توضیح داده میشود:
Model
View
Controller
هر بخش مسئولیت متفاوتی دارد.
| بخش | وظیفه |
|---|---|
| Model | کار با داده و منطق مرتبط با داده |
| View | نمایش اطلاعات به کاربر |
| Controller | پردازش درخواست و هماهنگ کردن بخشهای مختلف |
مثلاً در یک فروشگاه:
User
↓
Route
↓
ProductController
↓
Product Model
↓
View
↓
HTML
Controller میتواند محصولات را از Model دریافت کند و سپس آنها را به View ارسال کند.
View نیز داده را به شکل HTML نمایش میدهد.
# Viewها در Laravel کجا قرار دارند؟
Viewهای Laravel در:
resources/views
قرار میگیرند.
برای مثال:
resources
└── views
├── welcome.blade.php
├── home.blade.php
└── products
├── index.blade.php
├── show.blade.php
└── create.blade.php
این ساختار به ما اجازه میدهد Viewها را بر اساس بخشهای مختلف برنامه دستهبندی کنیم.
مثلاً:
products/
users/
orders/
admin/
auth/
میتوانند هر کدام Viewهای مربوط به خودشان را داشته باشند.
# چگونه یک View در Laravel بسازیم؟
ساخت View بسیار ساده است.
مثلاً فایل زیر را ایجاد میکنیم:
resources/views/about.blade.php
و داخل آن مینویسیم:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>درباره ما</title>
</head>
<body>
<h1>درباره ما</h1>
<p>به وبسایت ما خوش آمدید.</p>
</body>
</html>
حالا باید این View را از طریق Route یا Controller نمایش دهیم.
# نمایش View با Route
برای نمایش View میتوانیم از view() استفاده کنیم.
مثلاً:
Route::get('/about', function () {
return view('about');
});
حالا اگر کاربر به:
/about
مراجعه کند، Laravel View زیر را پیدا میکند:
resources/views/about.blade.php
و آن را نمایش میدهد.
# چرا پسوند Blade را در view() نمینویسیم؟
وقتی مینویسیم:
return view('about');
Laravel خودش View متناظر را پیدا میکند.
بنابراین نیازی نیست بنویسیم:
return view('about.blade.php');
بلکه:
return view('about');
روش معمول و صحیح برای ارجاع به این View است.
# نمایش View از Controller
در پروژههای واقعی معمولاً View را از Controller نمایش میدهیم.
مثلاً:
class AboutController extends Controller
{
public function index()
{
return view('about');
}
}
و Route:
Route::get('/about', [AboutController::class, 'index']);
جریان درخواست:
GET /about
↓
Route
↓
AboutController@index
↓
view('about')
↓
about.blade.php
↓
HTML
این ساختار از قرار دادن منطق زیاد داخل Route جلوگیری میکند.
# Viewهای داخل پوشه
برای پروژههای بزرگ بهتر است Viewها را دستهبندی کنیم.
مثلاً:
resources/views/products/index.blade.php
برای نمایش لیست محصولات.
برای نمایش این View میتوانیم بنویسیم:
return view('products.index');
نقطه (.) برای مشخص کردن پوشه استفاده میشود.
یعنی:
products.index
به این مسیر اشاره میکند:
resources/views/products/index.blade.php
# ساخت View برای نمایش محصول
فرض کنیم میخواهیم صفحه جزئیات یک محصول را ایجاد کنیم.
فایل:
resources/views/products/show.blade.php
را میسازیم.
محتوای ساده:
<h1>Product Details</h1>
<p>Product information will appear here.</p>
سپس در Controller:
public function show()
{
return view('products.show');
}
# ارسال داده از Controller به View
یکی از مهمترین قابلیتهای View این است که میتوانیم داده را از Controller به آن ارسال کنیم.
مثلاً:
public function index()
{
$name = 'Laptop';
return view('products.index', compact('name'));
}
در View:
<h1>{{ $name }}</h1>
خروجی:
Laptop
خواهد بود.
# ارسال چند متغیر به View
میتوانیم چند مقدار مختلف را نیز ارسال کنیم:
public function index()
{
$title = 'Products';
$description = 'Product List';
return view('products.index', compact(
'title',
'description'
));
}
در View:
<h1>{{ $title }}</h1>
<p>{{ $description }}</p>
# ارسال داده با آرایه
روش دیگر ارسال اطلاعات به View استفاده از آرایه است:
return view('products.index', [
'title' => 'Products',
'description' => 'Product List'
]);
سپس:
<h1>{{ $title }}</h1>
<p>{{ $description }}</p>
هر دو روش کاربرد دارند.
# ارسال لیست محصولات به View
فرض کنیم اطلاعات محصولات را در Controller داریم:
public function index()
{
$products = [
'Laptop',
'Phone',
'Tablet'
];
return view(
'products.index',
compact('products')
);
}
حالا View میتواند این داده را دریافت کند.
در این مرحله اگر فقط بخواهیم اطلاعات را چاپ کنیم، میتوانیم از ساختارهای Blade استفاده کنیم که در مقاله بعدی بهصورت کامل بررسی خواهند شد.
مثلاً:
@foreach ($products as $product)
<p>{{ $product }}</p>
@endforeach
خروجی:
Laptop
Phone
Tablet
# ارسال داده از Model به View
در پروژه واقعی، دادهها معمولاً از Database دریافت میشوند.
مثلاً:
use App\Models\Product;
public function index()
{
$products = Product::all();
return view(
'products.index',
compact('products')
);
}
در اینجا جریان داده به این صورت است:
Database
↓
Product Model
↓
Controller
↓
View
↓
HTML
این یکی از رایجترین الگوهای استفاده از View در Laravel است.
# نمایش یک محصول در View
فرض کنیم Controller یک محصول را دریافت کرده است:
public function show(Product $product)
{
return view(
'products.show',
compact('product')
);
}
در View:
<h1>{{ $product->name }}</h1>
<p>{{ $product->description }}</p>
<p>{{ $product->price }}</p>
به این ترتیب اطلاعات Model در HTML نمایش داده میشود.
# View و Blade چه تفاوتی دارند؟
این دو اصطلاح گاهی با یکدیگر اشتباه گرفته میشوند.
View به بخشی از برنامه گفته میشود که مسئول نمایش رابط کاربری است.
Blade موتور Template پیشفرض Laravel برای ساخت Viewهای پویاست.
مثلاً فایل:
products/index.blade.php
یک View است که از Blade استفاده میکند.
Blade امکاناتی مانند:
- نمایش متغیر
- شرطها
- حلقهها
- Layout
- Component
- Include
- Template inheritance
را در اختیار ما قرار میدهد.
مقاله بعدی دقیقاً به Blade در Laravel اختصاص دارد.
# نمایش مقدار متغیر در View
یکی از رایجترین کارها در View نمایش دادههای متغیر است.
مثلاً:
<h1>{{ $title }}</h1>
اگر:
$title = 'Laravel';
باشد، خروجی:
Laravel
خواهد بود.
یکی از مزیتهای مهم syntax مربوط به خروجی Blade، Escape شدن خروجی در حالت معمول است که به کاهش برخی ریسکهای XSS کمک میکند.
# نمایش HTML خام
گاهی لازم است یک مقدار HTML بهصورت خام نمایش داده شود.
در Blade میتوان از:
{!! $content !!}
استفاده کرد.
اما باید در استفاده از HTML خام بسیار دقت کرد.
اگر مقدار از ورودی کاربر یا منبع غیرقابل اعتماد دریافت شده باشد، نمایش مستقیم آن میتواند خطر امنیتی ایجاد کند.
بنابراین:
{{ $content }}
و:
{!! $content !!}
را نباید بدون توجه به منبع داده جایگزین یکدیگر کرد.
# شرطها در View
یکی از کاربردهای View این است که بر اساس وضعیت داده، خروجی متفاوتی نمایش دهیم.
مثلاً:
@if ($product->stock > 0)
<p>موجود است</p>
@else
<p>ناموجود است</p>
@endif
این ساختار باعث میشود View بتواند وضعیتهای مختلف را نمایش دهد.
در مقاله Blade، ساختارهای شرطی را با جزئیات بیشتری بررسی خواهیم کرد.
# حلقه در View
برای نمایش مجموعهای از دادهها میتوانیم از حلقه استفاده کنیم.
مثلاً:
@foreach ($products as $product)
<div>
<h2>{{ $product->name }}</h2>
<p>{{ $product->price }}</p>
</div>
@endforeach
این روش برای نمایش:
- محصولات
- مقالات
- کاربران
- سفارشها
- دستهبندیها
بسیار کاربردی است.
# Viewهای تو در تو
در پروژههای واقعی Viewها میتوانند ساختار پوشهای داشته باشند.
مثلاً:
resources/views/
├── home.blade.php
├── products/
│ ├── index.blade.php
│ ├── show.blade.php
│ └── create.blade.php
└── admin/
├── dashboard.blade.php
└── users/
└── index.blade.php
برای نمایش:
admin/users/index.blade.php
میتوان نوشت:
return view('admin.users.index');
این ساختار به مدیریت پروژههای بزرگ کمک میکند.
# استفاده مجدد از بخشهای View
اگر بخشهایی از صفحات مختلف تکراری باشند، بهتر است آنها را دوباره و دوباره کپی نکنیم.
برای مثال ممکن است Header در چند صفحه مشترک باشد.
میتوان آن را در یک فایل جدا قرار داد و در Viewهای مختلف استفاده کرد.
مثلاً:
resources/views/partials/header.blade.php
و سپس در View:
@include('partials.header')
این کار باعث میشود کدهای تکراری کمتر شوند.
# Layout در View چیست؟
در یک سایت معمولاً بسیاری از صفحات ساختار مشترکی دارند.
مثلاً:
Header
Navbar
Content
Footer
به جای اینکه این HTML را در تمام صفحات کپی کنیم، میتوانیم یک Layout مشترک بسازیم.
برای مثال:
resources/views/layouts/app.blade.php
سپس صفحات مختلف از این Layout استفاده میکنند.
این موضوع یکی از کاربردهای مهم Blade است و در مقاله بعدی با جزئیات بررسی خواهد شد.
# View Composer چیست؟
در بعضی پروژهها لازم است داده خاصی به تعداد زیادی View ارسال شود.
برای چنین سناریوهایی Laravel قابلیتهایی مانند View Composer در اختیار توسعهدهنده قرار میدهد.
مثلاً ممکن است Sidebar سایت همیشه نیاز به لیست دستهبندیها داشته باشد.
به جای اینکه در تکتک Controllerها این اطلاعات را ارسال کنیم، میتوان از مکانیزمهای مناسب Laravel برای آمادهسازی داده مشترک Viewها استفاده کرد.
این موضوع برای پروژههای بزرگتر اهمیت بیشتری پیدا میکند.
# بررسی وجود View
گاهی قبل از نمایش یک View میخواهیم مطمئن شویم فایل موردنظر وجود دارد.
Laravel امکان بررسی وجود View را نیز فراهم میکند.
برای مثال:
if (view()->exists('products.index')) {
// View exists
}
این قابلیت در بعضی سناریوهای داینامیک میتواند مفید باشد.
# برگرداندن View همراه با Response
در Laravel View میتواند بخشی از یک Response باشد.
مثلاً:
return response()
->view('products.index', [
'products' => $products
]);
این روش زمانی کاربرد دارد که بخواهیم Response را با کنترل بیشتری مدیریت کنیم.
# تفاوت View و Response
View مسئول تولید محتوای رابط کاربری است.
Response نتیجهای است که در نهایت به کاربر برگردانده میشود.
برای مثال:
return view('products.index');
یک View را بهعنوان خروجی درخواست برمیگرداند.
اما Response میتواند انواع مختلفی داشته باشد:
HTML
JSON
Redirect
File
بنابراین View را نباید با مفهوم کلی Response یکی دانست.
# ساخت یک صفحه کامل در Laravel
حالا یک مثال ساده و کامل ایجاد کنیم.
فرض کنیم میخواهیم صفحه محصولات بسازیم.
مرحله اول: ساخت Route
Route::get(
'/products',
[ProductController::class, 'index']
)->name('products.index');
مرحله دوم: ساخت Controller
public function index()
{
$products = [
[
'name' => 'Laptop',
'price' => 50000000
],
[
'name' => 'Phone',
'price' => 20000000
]
];
return view(
'products.index',
compact('products')
);
}
مرحله سوم: ساخت View
فایل:
resources/views/products/index.blade.php
محتوا:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>محصولات</title>
</head>
<body>
<h1>محصولات</h1>
@foreach ($products as $product)
<div>
<h2>{{ $product['name'] }}</h2>
<p>
قیمت:
{{ $product['price'] }}
</p>
</div>
@endforeach
</body>
</html>
حالا جریان کامل:
Browser
↓
GET /products
↓
Route
↓
ProductController@index
↓
products.index
↓
HTML
↓
Browser
این یکی از سادهترین نمونههای واقعی استفاده از View در Laravel است.
# View چه زمانی نباید مسئول منطق اصلی باشد؟
View برای نمایش اطلاعات ساخته شده است.
بنابراین بهتر است منطق سنگین کسبوکار را داخل View قرار ندهیم.
مثلاً بهتر است این کار را انجام ندهیم:
@php
// complex business logic
// database queries
// payment calculations
// order processing
@endphp
در عوض، بهتر است داده موردنیاز در Controller یا Service آماده شود و View فقط آن را نمایش دهد.
ساختار بهتر:
Controller / Service
↓
Prepared Data
↓
View
↓
HTML
این جداسازی باعث خوانایی و نگهداری بهتر پروژه میشود.
# اشتباهات رایج هنگام کار با View
۱. اشتباه در نام View
اگر فایل:
products/index.blade.php
باشد، باید بنویسیم:
view('products.index');
نه:
view('product.index');
۲. اشتباه در مسیر فایل
مسیر View باید با ساختار پوشهها مطابقت داشته باشد.
مثلاً:
resources/views/admin/products/index.blade.php
با:
view('admin.products.index');
فراخوانی میشود.
۳. ارسال نکردن متغیر موردنیاز
اگر View انتظار داشته باشد:
{{ $product }}
اما Controller متغیر product را ارسال نکرده باشد، ممکن است با خطا مواجه شوید.
۴. قرار دادن منطق پیچیده داخل View
View بهتر است تا حد امکان روی نمایش اطلاعات تمرکز داشته باشد.
۵. تکرار بیش از حد HTML
اگر Header، Footer یا Sidebar در صفحات زیادی تکرار شده، بهتر است از Layout، Include یا Componentهای Blade استفاده شود.
# بهترین روش سازماندهی Viewها
در یک پروژه متوسط میتوان ساختاری شبیه این داشت:
resources/views/
├── layouts/
│ └── app.blade.php
│
├── partials/
│ ├── header.blade.php
│ ├── footer.blade.php
│ └── sidebar.blade.php
│
├── home.blade.php
│
├── products/
│ ├── index.blade.php
│ ├── show.blade.php
│ ├── create.blade.php
│ └── edit.blade.php
│
├── orders/
│ ├── index.blade.php
│ └── show.blade.php
│
└── users/
├── index.blade.php
└── show.blade.php
این ساختار باعث میشود پیدا کردن فایلهای View سادهتر شود.
البته ساختار دقیق پروژه میتواند بر اساس اندازه و معماری برنامه متفاوت باشد.
# تفاوت View، Blade و Template
برای اینکه این مفاهیم را با یکدیگر اشتباه نگیریم:
View
بخشی از برنامه که خروجی رابط کاربری را تولید میکند.
Blade
Template Engine پیشفرض Laravel برای ساخت Viewهای پویا.
Template
یک قالب یا ساختار قابل استفاده برای تولید صفحات.
در Laravel معمولاً این سه مفهوم در کنار هم استفاده میشوند.
مثلاً:
products/index.blade.php
یک View است که با Blade نوشته شده و میتواند از یک Template یا Layout مشترک استفاده کند.
# View در Laravel چه نقشی در MVC دارد؟
اگر بخواهیم کل فرآیند را خلاصه کنیم:
Request
↓
Route
↓
Controller
↓
Model
↓
Controller
↓
View
↓
HTML Output
↓
Browser
این تفکیک باعث میشود هر بخش مسئولیت مشخصی داشته باشد.
# جمعبندی View در Laravel
View یکی از اجزای اصلی برنامه Laravel است که وظیفه نمایش اطلاعات و تولید رابط کاربری را بر عهده دارد.
در این مقاله یاد گرفتیم:
- View در Laravel چیست؟
- Viewها کجا قرار دارند؟
- چگونه View بسازیم؟
- چگونه View را از Route نمایش دهیم؟
- چگونه View را از Controller نمایش دهیم؟
- چگونه Viewهای داخل پوشه را فراخوانی کنیم؟
- چگونه داده به View ارسال کنیم؟
- چگونه اطلاعات Model را در View نمایش دهیم؟
- View و Blade چه تفاوتی دارند؟
- چگونه Viewهای تو در تو ایجاد کنیم؟
- چگونه بخشهای مشترک View را مدیریت کنیم؟
- Layout چیست؟
- View Composer چه کاربردی دارد؟
- چگونه وجود View را بررسی کنیم؟
- View و Response چه تفاوتی دارند؟
- چرا نباید منطق پیچیده را داخل View قرار دهیم؟
- خطاهای رایج View چیست؟
- چگونه Viewهای یک پروژه را سازماندهی کنیم؟
اکنون میدانیم که اطلاعات چگونه از Controller به View منتقل میشوند.
اما هنوز یک سؤال مهم باقی میماند:
چطور میتوانیم داخل Viewها به شکل حرفهای شرط بنویسیم، حلقه ایجاد کنیم، Layout بسازیم، Component ایجاد کنیم و HTML داینامیک تولید کنیم؟
پاسخ این سؤال Blade است.
به همین دلیل مقاله بعدی کلاستر:
«Blade چیست؟»
خواهد بود.
# سوالات متداول
View در Laravel چیست؟
View بخشی از برنامه Laravel است که برای نمایش اطلاعات و تولید رابط کاربری استفاده میشود.
Viewهای Laravel کجا قرار دارند؟
معمولاً در:
resources/views
قرار میگیرند.
پسوند Viewهای Laravel چیست؟
Viewهای رایج Laravel با پسوند:
.blade.php
ساخته میشوند.
چگونه یک View را نمایش دهیم؟
از تابع view() استفاده میکنیم:
return view('home');
چگونه View را از Controller نمایش دهیم؟
مثلاً:
public function index()
{
return view('products.index');
}
چگونه داده را به View ارسال کنیم؟
مثلاً:
return view('products.index', [
'products' => $products
]);
یا:
return view(
'products.index',
compact('products')
);
Blade چیست؟
Blade موتور Template پیشفرض Laravel است که برای ساخت Viewهای پویا استفاده میشود.
آیا میتوان Model را مستقیماً داخل View استفاده کرد؟
از نظر فنی ممکن است، اما بهتر است View تا حد امکان مسئول نمایش باشد و آمادهسازی داده و منطق برنامه در Controller، Service یا بخشهای مناسب دیگر انجام شود.
View و Controller چه تفاوتی دارند؟
Controller درخواست را پردازش و داده موردنیاز را آماده میکند؛ View این دادهها را برای کاربر نمایش میدهد.
آیا میتوان یک View را در چند صفحه استفاده کرد؟
بله. با قابلیتهایی مانند Include، Layout و Componentهای Blade میتوان بخشهای مشترک رابط کاربری را قابل استفاده مجدد کرد.





