نماها
معرفی
در سراسر مستندات لاراول، نمونههایی از کدهایی را مشاهده میکنید که از طریق «نما» با ویژگیهای لاراول در تعامل هستند. نماها یک رابط "ایستا" را برای کلاس هایی که در کانتینر سرویس برنامه در دسترس هستند ارائه می کنند . لاراول دارای نماهای زیادی است که تقریباً به تمام ویژگی های لاراول دسترسی دارد.
نماهای لاراول به عنوان "پراکسی های استاتیک" برای کلاس های زیرین در کانتینر سرویس عمل می کنند و از یک نحو مختصر و رسا استفاده می کنند و در عین حال تست پذیری و انعطاف پذیری بیشتری نسبت به روش های استاتیک سنتی حفظ می کنند. اگر کاملاً نحوه عملکرد نماها را درک نکنید، کاملاً خوب است - فقط با جریان حرکت کنید و به یادگیری در مورد لاراول ادامه دهید.
تمام نماهای لاراول در
Illuminate\Support\Facades
فضای نام تعریف شده اند. بنابراین، ما به راحتی می توانیم به نماهایی مانند این دسترسی داشته باشیم:
use Illuminate\Support\Facades\Cache;use Illuminate\Support\Facades\Route; Route::get('/cache', function () { return Cache::get('key');});
در سراسر مستندات لاراول، بسیاری از نمونه ها از نماها برای نشان دادن ویژگی های مختلف چارچوب استفاده می کنند.
توابع کمکی
برای تکمیل نماها، لاراول انواع مختلفی از "عملکردهای کمکی" جهانی را ارائه می دهد که تعامل با ویژگی های رایج لاراول را آسان تر می کند. برخی از توابع کمکی رایجی که ممکن است با آنها تعامل داشته باشید عبارتند از
view
,
response
,
url
,
config
و بیشتر. هر تابع کمکی ارائه شده توسط لاراول با ویژگی مربوطه خود مستند شده است. با این حال، یک لیست کامل در
اسناد کمکی
اختصاصی موجود است
.
به عنوان مثال، به جای استفاده از
Illuminate\Support\Facades\Response
نما برای تولید پاسخ JSON، ممکن است به سادگی از
response
تابع استفاده کنیم. از آنجایی که توابع کمکی در سطح جهانی در دسترس هستند، برای استفاده از آنها نیازی به وارد کردن کلاس ندارید:
use Illuminate\Support\Facades\Response; Route::get('/users', function () { return Response::json([ // ... ]);}); Route::get('/users', function () { return response()->json([ // ... ]);});
زمان استفاده از نما
نماها مزایای زیادی دارند. آنها یک نحو مختصر و به یاد ماندنی ارائه می دهند که به شما امکان می دهد از ویژگی های لاراول بدون به خاطر سپردن نام کلاس های طولانی استفاده کنید که باید به صورت دستی تزریق یا پیکربندی شوند. علاوه بر این، به دلیل استفاده منحصر به فرد آنها از روش های پویا PHP، آزمایش آنها آسان است.
با این حال در استفاده از نما باید کمی دقت کرد. خطر اولیه نماها کلاس "خزش دامنه" است. از آنجایی که استفاده از نماها بسیار آسان است و نیازی به تزریق ندارند، می توان به راحتی اجازه داد کلاس های شما به رشد خود ادامه دهند و از نماهای زیادی در یک کلاس استفاده کنند. با استفاده از تزریق وابستگی، این پتانسیل با بازخورد بصری که یک سازنده بزرگ به شما می دهد که کلاس شما بیش از حد بزرگ می شود، کاهش می یابد. پس در استفاده از نما به اندازه کلاس خود توجه ویژه ای داشته باشید تا دامنه مسئولیت آن باریک بماند. اگر کلاس شما خیلی بزرگ می شود، آن را به چند کلاس کوچکتر تقسیم کنید.
نماها در مقابل تزریق وابستگی
یکی از مزایای اولیه تزریق وابستگی، امکان تعویض پیاده سازی کلاس تزریق شده است. این در حین آزمایش مفید است زیرا میتوانید یک مدل ساختگی یا خرد تزریق کنید و ادعا کنید که روشهای مختلفی در مقاله خرد خوانده شده است.
به طور معمول، تقلید یا خرد کردن یک روش کلاس واقعاً ایستا ممکن نیست. با این حال، از آنجایی که نماها از روشهای پویا برای فراخوانی متدهای پراکسی به اشیاء حلشده از کانتینر سرویس استفاده میکنند، ما در واقع میتوانیم نماها را درست مانند نمونه کلاس تزریقی آزمایش کنیم. به عنوان مثال، با توجه به مسیر زیر:
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key');});
با استفاده از روشهای تست نمای لاراول، میتوانیم تست زیر را بنویسیم تا تأیید کنیم که متد
Cache::get
با آرگومان مورد انتظار فراخوانی شده است:
use Illuminate\Support\Facades\Cache; test('basic example', function () { Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $response = $this->get('/cache'); $response->assertSee('value');});
use Illuminate\Support\Facades\Cache; /** * A basic functional test example. */public function test_basic_example(): void{ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $response = $this->get('/cache'); $response->assertSee('value');}
نماها در مقابل توابع کمکی
علاوه بر نماها، لاراول شامل انواع مختلفی از توابع کمکی است که می تواند وظایف رایجی مانند تولید نماها، شلیک رویدادها، ارسال کارها یا ارسال پاسخ های HTTP را انجام دهد. بسیاری از این توابع کمکی همان عملکرد یک نمای مربوطه را انجام می دهند. برای مثال، این فراخوانی نما و فراخوانی کمکی معادل هستند:
return Illuminate\Support\Facades\View::make('profile'); return view('profile');
مطلقاً هیچ تفاوت عملی بین نما و عملکرد کمکی وجود ندارد. هنگام استفاده از توابع کمکی، همچنان می توانید آنها را دقیقاً مانند نمای مربوطه آزمایش کنید. به عنوان مثال، با توجه به مسیر زیر:
Route::get('/cache', function () { return cache('key');});
کمک
cache
کننده می خواهد
get
متد را در کلاس زیر
Cache
نما فراخوانی کند. بنابراین، حتی اگر از تابع helper استفاده میکنیم، میتوانیم تست زیر را بنویسیم تا تأیید کنیم که متد با آرگومان مورد انتظار فراخوانی شده است:
use Illuminate\Support\Facades\Cache; /** * A basic functional test example. */public function test_basic_example(): void{ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $response = $this->get('/cache'); $response->assertSee('value');}
نحوه کار نماها
در برنامه لاراول، نما کلاسی است که دسترسی به یک شی را از کانتینر فراهم می کند. ماشین آلاتی که این کار را می کند در
Facade
کلاس است. نماهای لاراول و هر نمای سفارشی که ایجاد می کنید،
Illuminate\Support\Facades\Facade
کلاس پایه را گسترش می دهد.
کلاس پایه از
روش جادویی برای به تعویق انداختن تماس ها از نمای شما به یک شی که از کانتینر حل شده است
Facade
استفاده می کند .
__callStatic()
در مثال زیر، یک تماس با سیستم کش لاراول برقرار شده است. با نگاهی اجمالی به این کد، می توان فرض کرد که
get
متد static در کلاس فراخوانی می شود
Cache
:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Cache;use Illuminate\View\View; class UserController extends Controller{ /** * Show the profile for the given user. */ public function showProfile(string $id): View { $user = Cache::get('user:'.$id); return view('profile', ['user' => $user]); }}
توجه داشته باشید که در نزدیکی بالای فایل ما در حال "وارد کردن"
Cache
نما هستیم. این نما به عنوان یک پروکسی برای دسترسی به پیاده سازی اساسی رابط عمل می کند
Illuminate\Contracts\Cache\Factory
. هر تماسی که با استفاده از نما انجام دهیم به نمونه اصلی سرویس کش لاراول منتقل می شود.
اگر به آن کلاس نگاه کنیم
Illuminate\Support\Facades\Cache
، خواهید دید که هیچ متد ثابتی وجود ندارد
get
:
class Cache extends Facade{ /** * Get the registered name of the component. */ protected static function getFacadeAccessor(): string { return 'cache'; }}
در عوض،
Cache
نما کلاس پایه را گسترش می دهد
Facade
و روش را تعریف می کند
getFacadeAccessor()
. وظیفه این روش برگرداندن نام یک کانتینر سرویس است. هنگامی که کاربر به هر روش ایستا در
Cache
نما ارجاع می دهد، لاراول
cache
اتصال از
کانتینر سرویس
را حل می کند و متد درخواستی (در این مورد،
get
) را بر روی آن شی اجرا می کند.
نماهای بلادرنگ
با استفاده از نماهای بلادرنگ، ممکن است با هر کلاسی در برنامه خود به گونه ای رفتار کنید که گویی یک نما است. برای نشان دادن اینکه چگونه می توان از آن استفاده کرد، اجازه دهید ابتدا کدهایی را بررسی کنیم که از نماهای بلادرنگ استفاده نمی کنند. برای مثال، فرض کنید
Podcast
مدل ما یک
publish
روش دارد. با این حال، برای انتشار پادکست، باید یک
Publisher
نمونه را تزریق کنیم:
<?php namespace App\Models; use App\Contracts\Publisher;use Illuminate\Database\Eloquent\Model; class Podcast extends Model{ /** * Publish the podcast. */ public function publish(Publisher $publisher): void { $this->update(['publishing' => now()]); $publisher->publish($this); }}
تزریق یک اجرای ناشر به متد به ما این امکان را می دهد که به راحتی روش را به صورت مجزا آزمایش کنیم زیرا می توانیم ناشر تزریق شده را تقلید کنیم. با این حال، از ما میخواهد که همیشه هر بار که متد را فراخوانی میکنیم، یک نمونه ناشر ارسال کنیم
publish
. با استفاده از نماهای بلادرنگ، میتوانیم همان تستپذیری را حفظ کنیم، در حالی که نیازی به تصویب صریح یک
Publisher
نمونه نیست. برای ایجاد یک نمای بلادرنگ، فضای نام کلاس وارد شده را با پیشوند
Facades
:
<?php namespace App\Models; use App\Contracts\Publisher; use Facades\App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class Podcast extends Model{ /** * Publish the podcast. */ public function publish(Publisher $publisher): void public function publish(): void { $this->update(['publishing' => now()]); $publisher->publish($this); Publisher::publish($this); }}
وقتی از نمای بلادرنگ استفاده میشود، پیادهسازی ناشر با استفاده از بخشی از رابط یا نام کلاس که بعد از پیشوند ظاهر میشود، خارج از ظرف سرویس حل میشود
Facades
. هنگام آزمایش، میتوانیم از کمککنندههای تست نمای داخلی لاراول برای تقلید این فراخوانی استفاده کنیم:
<?php use App\Models\Podcast;use Facades\App\Contracts\Publisher;use Illuminate\Foundation\Testing\RefreshDatabase; uses(RefreshDatabase::class); test('podcast can be published', function () { $podcast = Podcast::factory()->create(); Publisher::shouldReceive('publish')->once()->with($podcast); $podcast->publish();});
<?php namespace Tests\Feature; use App\Models\Podcast;use Facades\App\Contracts\Publisher;use Illuminate\Foundation\Testing\RefreshDatabase;use Tests\TestCase; class PodcastTest extends TestCase{ use RefreshDatabase; /** * A test example. */ public function test_podcast_can_be_published(): void { $podcast = Podcast::factory()->create(); Publisher::shouldReceive('publish')->once()->with($podcast); $podcast->publish(); }}
مرجع کلاس نما
در زیر هر نما و طبقه زیرین آن را خواهید یافت. این یک ابزار مفید برای کاوش سریع در اسناد API برای ریشه نما معین است. کلید صحافی کانتینر سرویس نیز در صورت لزوم گنجانده شده است.