نسخه:

نماها

معرفی

در سراسر مستندات لاراول، نمونه‌هایی از کدهایی را مشاهده می‌کنید که از طریق «نما» با ویژگی‌های لاراول در تعامل هستند. نماها یک رابط "ایستا" را برای کلاس هایی که در کانتینر سرویس برنامه در دسترس هستند ارائه می کنند . لاراول دارای نماهای زیادی است که تقریباً به تمام ویژگی های لاراول دسترسی دارد.

نماهای لاراول به عنوان "پراکسی های استاتیک" برای کلاس های زیرین در کانتینر سرویس عمل می کنند و از یک نحو مختصر و رسا استفاده می کنند و در عین حال تست پذیری و انعطاف پذیری بیشتری نسبت به روش های استاتیک سنتی حفظ می کنند. اگر کاملاً نحوه عملکرد نماها را درک نکنید، کاملاً خوب است - فقط با جریان حرکت کنید و به یادگیری در مورد لاراول ادامه دهید.

تمام نماهای لاراول در 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 برای ریشه نما معین است. کلید صحافی کانتینر سرویس نیز در صورت لزوم گنجانده شده است.

نما کلاس صحافی کانتینر خدمات
برنامه Illuminate\Foundation\Application app
صنعتگر Illuminate\Contracts\Console\Kernel artisan
احراز هویت Illuminate\Auth\AuthManager auth
Auth (نمونه) Illuminate\Contracts\Auth\Guard auth.driver
تیغه Illuminate\View\Compilers\BladeCompiler blade.compiler
پخش Illuminate\Contracts\Radcasting\Factory  
پخش (نمونه) Illuminate\Contracts\Broadcasting\Broadcaster  
مسیر Illuminate\Contracts\Bus\Dispatcher  
حافظه پنهان Illuminate\Cache\CacheManager cache
حافظه پنهان (نمونه) Illuminate\Cache\Repository cache.store
پیکربندی Illuminate\Config\Repository config
کوکی Illuminate\Cookie\CookieJar cookie
سرداب Illuminate\Encryption\Encrypter encrypter
تاریخ Illuminate\Support\DateFactory date
DB Illuminate\Database\DatabaseManager db
DB (نمونه) Illuminate\Database\Connection db.connection
رویداد Illuminate\Events\Dispatcher events
فایل Illuminate\Filesystem\Filesystem files
دروازه Illuminate\Contracts\Auth\Access\Gate  
هش Illuminate\Contracts\Hashing\Hasher hash
Http Illuminate\Http\Client\Factory  
لنگ Illuminate\Translation\ Translator translator
ورود به سیستم Illuminate\Log\LogManager log
ایمیل Illuminate\Mail\Mailer mailer
اطلاع Illuminate\Notifications\ChannelManager  
کلمه عبور Illuminate\Auth\Passwords\PasswordBrokerManager auth.password
رمز عبور (نمونه) Illuminate\Auth\Passwords\PasswordBroker auth.password.broker
خط لوله (نمونه) Illuminate\Pipeline\Pipeline  
روند Illuminate\Process\Factory  
صف Illuminate\Queue\QueueManager queue
صف (نمونه) Illuminate\Contracts\Queue\Queue queue.connection
صف (کلاس پایه) روشن کردن\Queue\Queue  
RateLimiter Illuminate\Cache\RateLimiter  
تغییر مسیر Illuminate\Routing\Redirector redirect
ردیس Illuminate\Redis\RedisManager redis
Redis (نمونه) Illuminate\Redis\Connections\Connection redis.connection
درخواست Illuminate\Http\Request request
واکنش Illuminate\Contracts\Routing\ResponseFactory  
پاسخ (نمونه) Illuminate\Http\Response  
مسیر Illuminate\Routing\Router router
طرحواره Illuminate\Database\Schema\Builder  
جلسه Illuminate\Session\SessionManager session
جلسه (نمونه) Illuminate\Session\Store session.store
ذخیره سازی Illuminate\Filesystem\FilesystemManager filesystem
ذخیره سازی (نمونه) Illuminate\Contracts\Filesystem\Filesystem filesystem.disk
URL Illuminate\Routing\UrlGenerator url
اعتبار سنجی Illuminate\Validation\Factory validator
اعتبار سنجی (نمونه) Illuminate\Validation\Validator  
چشم انداز Illuminate\View\Factory view
مشاهده (نمونه) Illuminate\View\View  
وایت Illuminate\Foundation\Vite