یادگیری مقدماتی لاراول - پارت دوم

تذکر: این یک پست آموزشی برای عموم نیست! بلکه تنها جایی برای یادداشت‌های من حین یادگیریه تا بهتر به خاطر بسپارم و در صورت لزوم به اون‌ها مراجعه کنم.(هر پارت شامل ۲۰ قسمت)اینجا قراره که دو تا directive جدید به نام‌های section و show رو یاد بگیریم. با مثال توضیح داده میشه:@section('something') Some Default Value... @showاین directive به جای yield توی master layout میشینه و یک مقدار Default رو برای اون بخش تعیین می‌کنه، بنابراین اگر توی یک صفحه‌ای master layout رو extend کردیم؛ و مقداری برای اون section در نظر نگرفتیم؛ مقدار default که توی master تعریف شده، میاد و جاش می‌شینه.حالا می‌ریم سراغ Component و Slot:در واقع Componentها خیلی شبیه به Partials کار می‌کنند؛ حالا این Partials چی هستن؟همون پوشه ای که اومدیم و قسمت‌های مختلف master layout رو توش جداسازی کردیم؛ یعنی فوتر و هدر و سایدبار و نو و... .ما می‌تونیم موارد مختلف رو تبدیل کنیم به یک component، مثلا یک کامپوننت برای دکمه‌ها و...چطوری میشه این کار رو کرد؟برای دسته‌بندی و نظم دادن به کار، کافیه یک پوشه به اسم components توی Views ایجاد کنیم؛ و یک فایل مثلا button.blade.php ایجاد می‌کنیم. این محتویات این فایل فرضی می‌تونه باشه:<button class=&quot{{ $class }}&quot> {{ $title }} </button>حالا می‌تونیم از این کامپوننت هرجایی استفاده کنیم، مثلا توی about یا index و... از syntax زیر برای به کار گیری کامپوننت و پاس دادن آرگومان‌ها استفاده میشه:@component('components.button', ['title' => 'something', 'class' => 'btn btn-primary'])@endcomponentحالا اگر از یک کامپوننت استفاده کنیم و یک آرگومان رو ارسال نکنیم؛ با خطا روبرو می شیم؛ اما کافیه که با php directive چک کنیم که اصلا اون متغیر خاص ست شده یا نه، و اگر ست نشده، براش یه مقدار default در نظر بگیریم:به جای ارسال آرگومان‌ها با استفاده از یک آرایهٔ associative کافیه که از slotها استفاده کنیم. اسلات یک پارامتر داره که در واقع همون اسم متغیری هست که قراره مقداردهی و توی کامپوننت بارگذاری بشه، مقداری که بین directive اسلات قرار می‌گیره در واقع مقدار اون متغیر خواهد بود:@slot('name_of_variable') value of variable @endslotاگر بدون اینکه متغیری رو به کامپوننت بفرستیم (چه با اسلات و چه با آرایه) و فقط یک قطعه کد یا متن رو بین component directive قرار بدیم؛ می‌تونیم به اون از طریق متغیر $slot دسترسی داشته باشیم.ساخت کامپوننت سفارشی در لاراول:...ساخت یک directive سفارشی:فرض کنید می‌خوایم یک directive طراحی کنیم که قراره یک نوشته رو bold کنه، پس باید دایرکتیو ما یک چنین چیزی باشه:@bold(text blah blah)برای این کار باید یک Service Provider طراحی کنیم که در مسیر app\providers\AppServiceProvider.php قرار داره، این یک Service Provider پیش‌فرض هست که از طرف خود لاراول ارائه شده و برای اینکه ما سرویس‌های سفارشی خودمون رو توش بنویسیم:<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // } حالا توش متد بوت از قطعه کد زیر استفاده می‌کنیم:Blade::directive('name_of_directive', function($directive_argument){ return 'something'; });برای مثال، bold directive ما یک چنین چیزی میشه:Bold Directiveحالا کافیه که توی blade template از کد زیر برای دسترسی به directive سفارشی خودمون استفاده کنیم؛ اصلا نیاز هم نیست که آرگومان رو بین دابل یا سینگل کوت قرار بدیم.@bold(Argument)حالا بریم سراغ نوشتن conditional directives:Blade::if('isint', function($value=null){ return is_int($value); });نحوهٔ استفاده از Directiveهای شرطی:@isint(num) do_something @else do_something_else @endifفایل‌های استاتیک و استفاده از آن‌ها در لاراول:منظور از فایل‌های Static چیزهایی مثل javascript و CSS و... هست که توی پوشهٔ public قرار خواهند گرفت. در نهایت وقتی پروژه به اتمام رسید؛ فایل‌های این پوشه رو توی پوشهٔ public_html روی سرور/هاست آپلود می‌کنیم تا بهش دسترسی داشته باشیم. بهتره که محتویات پوشهٔ public ما دسته‌بندی شده و مرتب باشه، برای این کار باید اون رو پوشه‌بندی کنیم؛ مثلا پوشه‌هایی به نام‌های css و js و... ایجاد کنیم و فایل‌های css و اسکریپت‌هامون رو توی اون ها قرار بدیم که البته سلیقه‌ای هست.حالا برای استفاده از این فایل‌ها داخل پوشهٔ resources\views و فایل‌های blade کافیه که داخل head بهشون link بدیم و نکتهٔ مهم اینکه نیازی نیست که آدرس دقیق بدیم و آدرس نسبت به پوشهٔ public داده میشه، مثلا اینطوری:<link rel=&quotstylesheet&quot href=&quot/css/style.css&quot>علت این مسردهی نسبی هم مربوط به این میشه که فایل‌های قالب blade بعد از کامپایل/ترجمه شدن، داخل index.php که توی public هست لود میشن، بنابراین از نظر منطقی به پوشه‌های داخل اون به‌طور نسبی دسترسی دارن.یک helper function داریم به اسم asset که می‌تونیم به فایل های موجود در resource اشاره کنیم. یعنی به این شکل:<link rel=&quotstylesheet&quot link=&quot{{ asset('/css/style.css') }}&quot>آشنایی با پوشهٔ Resource و فایل‌های static و SASS و همین‌طور Laravel Mix:بحث Compiling Assets یا Mix که مربوط به بخش فرانت پروژه میشه. تکلیف فایل‌های static که مشخصه، اما اگر قرار باشه که از SASS یا LESS یا کتابخونه‌های مختلف جاوا اسکریپتی مثل Vue استفاده کنیم؛ قبل از اینکه کاربر بتونه خروجی رو ببینه، این‌ها باید کامپایل بشن تا بتونیم خروجی رو ببینیم.ابزار Mix لاراول کار compiling رو به راحتی برای ما انجام میده، برای استفاده از این ابزار باید با package.json به خوبی آشنا بشیم. npm یک پکیج منجر برای javascript هست که ما می‌تونیم این پکیج‌ها رو با استفاده از package.json مدیریت کنیم.داخل پوشهٔ روت یک برنامهٔ لاراولی یک فایل داریم به اسم webpack.mix.js که به صورت دیفالت موجوده و داخل این فایل میاد و laravel-mix رو require می‌کنه و با استفاده از دستوراتی که این کتابخونه برای ما فراهم می‌کنه، کارهای مختلفی انجام میده، مثلا میاد و فایل resources/js/app.js رو کامپایل می‌کنه و خروجی رو داخل public/js قرار می‌ده.برای نصب پکیج‌های package.js باید node.js رو نصب کنیم و با دستور زیر پکیج‌ها رو نصب کنیم:npm install حالا برای کامپایل کردن و خروجی گرفتن از کانفیگ های webpack.mix.js باید از کد زیر استفاده کنیم:npm run devاین dev مربوط میشه به راهنمایی که داخل خود webpack اومده و دستورات دیگه‌ای هم داریم مثل production و watch و... .مبحث Javascript and CSS Scaffolding:منظور از Scaffolding اسکلت‌بندی است. منظور اینه که ما برای طراحی فرانت و اسکلت کارمون به ابزارها و کتابخونه‌هایی مثل bootstrap، ویو، ری‌اکت و... نیاز داریم و برای برای استفاده از scaffolding اول باید با دستور زیر، پکیج laravel/ui رو نصب کنیم:composer require laravel/ui --devاستفاده از این بسته هم خیلی راحته.با دستورات زیر، بوت‌استرپ، ویو یا ری‌اکت رو دانلود می‌کنه و با laravel mix ترکیب می‌کنه و می‌تونیم توی viewهای خودمون ازش استفاده کنیم:php artisan ui bootstrap php artisan ui vue php artisan ui reactو حتی سیستم authentication هم توی لاراول به شکل دیفالت وجود داره و با استفاده از scaffolding به راحتی می‌تونیم ui کار رو آماده کنیم:php artisan ui bootstrap --auth php artisan ui vue --auth php artisan react --authشروع مبحث Routing:فساد Route دارای چند تا متد هست که در قسمت پایین اون‌ها رو توضیح می‌دیم:get: برای خوندن، مثلا نمایش لیست محصول(ات).post: برای ایجاد کردن استفاده میشه، مثلا ایجاد یک محصول جدیدput: برای بروزرسانی هست؛ یعنی یک record رو پاک می‌کنه و اطلاعات جدید به جاش قرار میدهpatch: فقط فیلدهای دارای مقدار رو تغییر میدهdelete: حذف یک ریکورد در پایگاه دادهany: باعث رد شدن هر چیزی میشه و می‌تونیم توی Controller مدیریتش کنیم.با استفاده از artisan می‌تونیم لیست روت‌های موجود رو ببینیم؛ برای این کار کافیه که دستور زیر رو بزنیم:php artisan route:listدریافت اطلاعات از URL:Route::get('/page/{name_of_parameter}', function($name_of_parameter) { return 'the parameter is: '.$name_of_parameter; });پارامترهای اختیاری:در ورودی اول تابع get که متغیرها را تعریف می‌کنیم باید انتهای نام متغیر یک علامت سوال قرار دهیم و در قسمت دوم که مربوط به تابع بی‌نام ماست، برای آن متغیر باید یک مقدار default تعریف کنیم.آشنایی با Route Name:برای لینک دادن به یک صفحه می‌تونیم خیلی راحت لینکش رو توی اون view خاص وارد کنیم؛ اما از اونجایی که مسیردهی ممکنه کمی سخت باشه، کافیه که برای هر Route یک name ست کنیم و از اون name برای دسترسی به هر روتی که خواستیم استفاده کنیم:Route::get('/page/{name_of_parameter}', function($name_of_parameter) { return 'the parameter is: '.$name_of_parameter; })->name('A_Name_For_This_Route');حالا خیلی راحت می‌تونیم توی view بهش لینک بدیم:<a href=&quot/page&quot>GO TO PAGE</a> <a href=&quot{{ url('/page') }}&quot>GO TO PAGE</a> <a href=&quot{{ route('route name') }}&quot>GO TO PAGE</a>اگر Route ما ورودی دریافت کنه، می‌تونیم توی لینک، این ورودی‌ها رو بهش پاس بدیم:<a href=&quot{{ route('course', ['course' => 'Laravel', 'id' => '65']) }}&quot>GO TO PAGE</a>مبحث Route Group:فرض کنیم که یک سری Route مشابه داریم؛ ما با استفاده از Route Group Prefixed Route Groupاستفاده از آرایه به جای متد prefix:Associative array instead of prefix methodمبحث کنترلر در لاراول:برای تعریف یک کنترلر جدید باید به مسیر زیر بریم:app/http/Controllers/Controller.phpداخل این فایل یک کلاس Controller داریم که از یک کلاس دیگه‌ای به نام BaseController مشتق شده.کنترلرهای ما باید داخل این پوشه باشند و از کلاس Controller مشتق بشن. برای ایجاد یک کنترلر جدید می‌تونیم از artisan استفاده کنیم:php artisan make:controller AdminControllerحالا محتویات کنترلر ما اینطوریه:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AdminController extends Controller { // }** نکته: برای اینکه ببینیم که هر دستور artisan چه آرگومان‌هایی داره و... می‌تونیم از help با دابل دش استفاده کنیم.** نکته: همیشه باید سعی کنیم که آخرین نسخه از nodejs استفاده کنیم، برای این کار بهتره که نود رو از داخل سایت خودش دانلود کنیم و مسیر فایل اجرایی رو به PATH اضافه کنیم.حالا ما می‌تونیم داخل کلاس AdminController متدهای مختلفی رو ایجاد کنیم که در اصلاح لاراولی بهشون Action هم گفته میشه، برای اینکه بتونیم از Route کنترلر و یک اکشن از اون کنترلر رو فراخوانی کنیم؛ باید از روش زیر استفاده کنیم؛ و اینکه کنترلر میاد و با مدل ارتباط برقرار می‌کنه و مدل هم با DB و نهایتا مدل دیتا رو به کنترلر می‌فرسته و کنترلر به View.تعریف یک اکشن:class AdminController extends Controller { public function hello_world(){ return view('admin'); } }و توی روت:Route::get('/admin', 'AdminController@hello_world')->name('admin');ما می‌تونیم Controllerهای خودمون رو به راحتی پوشه‌بندی کنیم؛ برای این کار می‌تونیم مثلا:php artisan make:controller Admin\AdminControllerمبحث resource controller:فرض کنیم که ما یک Route داریم به اسم Article، حالا برای عملیات مختلفی که قراره با این articles انجام بدیم؛ باید روت‌های مختلفی بنویسیم و برای هر روت یک اکشن مناسب توی controller بنویسیم؛ به جای نوشتن دستی هر اکشن، کافیه که از resource controller استفاده کنیم:php artisan make:controller ArticleController -rRoutes for articlesحالا دستور artisan برای ما کنترلر به همراه متدهای اون رو ساخته.باز هم می تونیم عملیات بالا رو ساده‌تر کنیم؛ به جای نوشتن تک تک روت‌ها، کافیه که از روت زیر استفاده کنیم؛ خود تمامی اکشن‌های کنترلر رو برای ما می‌سازه:Route:resource('articles', 'ArticleController');حالا اگر یک Route list بگیریم، می‌بینیم که خود لاراول برای ما اتوماتیک اون روت‌ها رو جنریت می‌کنه:php artisan route:listحالا گاهی پیش میاد که ما نخوایم یک سری روت برای ما جنریت بشه، یا فقط یک سری روت خاص رو بخوایم؛ برای این کار:Route::resource('articles', 'ArticleController')->only(['index', 'show']); Route::resource('articles', 'ArticleController')->except(['index', 'show']);مبحث Request یا درخواست در لاراولدر تصویر زیر یک کنترلر به نام HomeController رو می‌بینیم که داخلش Request مورد استفاده (use) قرار گرفته، حالا می‌تونیم این Request رو به عنوان پارامتر متد home داخل کلاس کنترلر دریافت کنیم.حالا این Request کجا کاربرد داره؟ اینجا بحث DI یا Dependency Injection مطرحه، Service Container میاد Request رو می‌گیره و با توجه به نیازهایی که داره یک شی ازش ایجاد می‌کنه (کلاس Request طبیعتا یک سری ورودی و آرگومان داره، اینجا Service Container این وابستگی‌های رو بهش میده) و توی $request قرار میده. حالا می‌تونیم ببینم که محتویات این شی request چیه، کافیه که با dd helper function اون رو ببینیم.استفاده از Request در متدهای کنترلراینجا نمونه‌ای از محتویات $request که dd شده رو می‌تونیم ببینیم:محتویات شی $requestشی $request یک متد داره به اسم all که برای ما محتویات مقادیر ارسالی با get رو به نمایش می‌ذاره، توی تصویر زیر این رو می‌تونیم ببینیم:خروجی کد بالا:حالا اگر قرار باشه که مقادیری رو از طریق Route دریافت کنیم؛ باید به ترتیب این تغییرات رو در Route و Controller ایجاد کنیم:دریافت مقدار id از طریق Routeنحوه دریافت $id از طریق کنترلرنمایش خروجی کدهای بالاتا اینجای کار، مقادیری که از طریق $request هندل کردیم؛ از طریق get دریافت شده بودند؛ حالا توی این بخش می‌خوایم ببینیم که اگر مقادیر رو از POST یا فرم‌های ارسال کنیم؛ چطور باید مقادیر رو از طریق شی Request هندل کنیم.هندل کردن مقادیر ارسالی با POST از طریق شی $request در کنترلر:ما می‌خوایم که ui پروژه خودمون رو با بوت استرپ ایجاد کنیم، برای این کار از دستورات artisan کمک می‌گیریم:php artisan ui bootstrapحالا دستور زی رو می‌زنیم:npm install && npm run devبعد از اجرای دستور npm install پکیج‌های موجود در package.json توی یک پوشه به اسم node_modules نصب میشن و بعد می‌تونیم از این پکیج‌ها استفاده کنیم. حالا با زدن دستور npm run dev پکیج‌های مورد نیاز ما کامپایل می‌شن و توی public قرار می‌گیرن و ما می‌تونیم به راحتی به اون‌ها دسترسی داشته باشیم؛ مثلا بوت استرپ داخل پوشهٔ css و فایل app.css قرار گرفته.** یادآوری فرآیند MVC:ما یه سری Route داریم که در واقع مسیر دسترسی ما به قسمت‌های مختلف سایت رو مشخص می‌کنه، حالا این Route می‌تونه مستقیما یه مقداری رو توی view نمایش بده (با فراخوانی view helper function) و یا اینکه اگر بخوایم دقیقا مثل مدل MVC عمل کنیم؛ روت ما یک متد از یک Controller رو فراخوانی می‌کنه و حالا می‌تونه یک View رو نمایش بده و یا اینکه کار دیگه‌ای بکنه...** نکتهٔ مهم:این آموزش (حداقل تا اینجای کار) بر مبنای نسخه‌های قبل از ۸ هست؛ بنابراین باید توجه داشته باشیم که نحوهٔ دسترسی به کنترلرها از Route تغییر کرده و به این شکله:Route::get('/page', [\App\Http\Controllers\YourController::class,'your_method']); اگر یک فرم رو با POST ارسال کنیم (Route هم باید post باشد)، و میان‌افزار VerifyCsrfToken فعال باشه، با خطای ... روبرو می‌شیم.توی فایل app/Http/Kernel.php یک سری Middleware قرار داره که این‌ها، روی Routeهای داخل web یا api و... اجرا می‌شن. یکی از مهم‌ترین Middlewareها، VerifyCsrfToken هست که اگر ما بیاییم و غیرفعالش کنیم؛ اطلاعات فرم ما به راحتی با POST از مجرای post Route عبور می‌کنند و با خطا رو برو نمی‌شیم. در واقع این Middlewareها یک سری میان‌افزار هستن که درخواست‌های ارسالی ما به یک Route رو بررسی می‌کنن و اگر OK بود به Controller پاس می‌دن. در واقع باید از فیلتر این میان‌افزارها عبور کنند.حالا این CSRF Token چی هست؟این عبارت کوتاه شدهٔ Cross-site Request Forgery هست؛ حالا معنیش چیه؟ «درخواست جعلی از سایتی دیگر» که توی لینک بالا کامل توضیح داده شده، راه حل این مشکل استفاده از توکن‌های auto-generateای هست که هر کاربر لاگین شده تعلق می‌گیره و جلوی این رو می گیره که هکر از یک سایت میانی از session فعال ما استفاده کنه.متدهای نوع POST DELETE PUT نیاز به این توکن دارن. حالا چطوری توی یک فرم این توکن رو فراخوانی کنیم؟{{ csrf_token }}استفاده از helper function توکن CSRFبه جای استفاده از csrf helper function ما می‌تونیم از دایرکتیو زیر هم استفاده کنیم:@csrfآشنایی بیشتر با آپشن‌های شی request:برای دسترسی به value یک key از شی request باید از متد get استفاده کنیم:$value = $request->get('key');علاوه بر متد get می‌تونیم از setter و getter هم برای دسترسی به مقادیر شی req استفاده کنیم:$value = $request->key;اما بین دو روش بالا تفاوت‌هایی هم وجود داره، مثلا اگر در هر یک از روش‌های بالا یک key غیر معتبر وارد کنیم؛ برنامه مقدار null رو برای ما برمی‌گردونه، اما متد get این قابلیت رو هم داره که یک مقدار default هم براش تعریف کنیم تا اگر یک invalid key وارد کردیم، به جای مقدار null برای ما اون مقدار default رو برگردونه:$value = $request->get('key', 'default_value');یک متد کاربردی دیگه از شی request، متد has هست که میاد چک می کنه که آیا اصلا اون key وجود داره یا خیر!// returns true or false $value = $request->has('key')متد کاربردی بعدی، متد only هست که فقط اون مقادیری که ما نیاز داریم رو برمی‌گردونه:$values = $request->only(['key0', 'key1']);متد کاربردی بعدی، متد except هست که همهٔ مقادیر به جز اون‌هایی که ازش نام بردیم رو برمی‌گردونه:$values = $request->except(['key0', 'key1']);متد query میاد و طبق query string مقادیر مورد نظر رو برمی‌گردونه:localhost:8000/page?id=20 $value = $request->query('key', 'default_value');اما باید دقت داشته باشیم که حتما Route و فرم ما از متد get استفاده کنه.اما چطوری می‌تونیم به پارامترهای URI تعریف شده در Route دسترسی داشته باشیم؟// routes/web.php Route::get('/home/{val0}/{val1}', [app\Http\Controllers\HomeController::class, 'method'])->name('home'); // * app/Http/Controllers/HomeController.php public function method(Request $request, $val0, $val1){ dd($data->all()); dd($val0); // another way to access URI parameters $value = $request->route()->parameter('val0'); dd($value);استفاده از روشی که با * مشخص شده به روش دوم برتری داره.فایل‌ها در لاراولآپلود فایلروش‌های دسترسی به فایل‌ها در کنترلر، با استفاده از شی request و متدهای کاربردی آن:متدهای مربوط به دسترسی به فایل از طریق شی requestایجاد Requestهای سفارشی:برای این کار می‌تونیم از artisan کمک بگیریم:php artisan make:request NameRequestدر حالت Default ما داخل app/Http، موارد زیر رو داریم:Controllers Middlewares Kernel.phpاما با اجرای دستور ساخت یک request جدید، یک پوشه به اسم Requests هم ایجاد میشه که requestهای ما داخل اون قرار می‌گیره:Controllers Middlewares Requests Kernel.phpنمونه ای از محتویات یک Request به نام LoginRequest:<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class LoginRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } }حالا کافیه که به جای Request بذاریم LoginRequest و در ابتدای فایل use کنیم؛ یک میانبر برای vscode وجود داره که خط use رو اضافه می‌کنه:Ctrl + Shift + iحالا Service Container یک شی از LoginRequest ایجاد می‌کنه و توی شی $request قرار میده. این Request شخصی‌سازی شده تمامی امکانات Request اولیه رو داره به اضافهٔ Authorize و Rules که اولی برای تعیین سطح دسترسی هست؛ اگر authorize مقدار false رو برگردونه، به ارور 403 برخورد می‌کنیم و اجازه دسترسی به اون action رو از ما می‌گیره.و rules مربوط به قوانینی هست که روی پارامترها قرار می‌دیم؛ ما باید صحت و درستی درخواست‌های کاربر رو Validation می‌کنیم؛ مثلا آیا فایلی که کاربر داره می‌فرسته، حتما باید متنی باشه، یا فلان فیلد ۱۰ کاراکتر باشه و...مبحث Validation:اعتبارسنجی حتما باید در سمت سرور و کلاینت اجرا بشه. خود لاراول یک سری قوانین از پیش تعریف شده داره که می‌تونیم اون‌ها رو توی بخش The Basics و Validation و نهایتا Validation Rules ببینیم.یک مثال:نمونه ای از Validation در Laravelخب، ما اینجا اومدیم و توی متد loginUser کنترلر خودمون، مقادیری که از طریق فرم submit میشن رو Validate می‌کنیم؛ شی request ما یک متد داره به اسم validate که یک آرایهٔ Associative دریافت می‌کنه که توش Ruleها تعریف شده، مثلا اینجا ما می‌دونیم که یک ورودی داریم به نام email، پس براش یک rule ست کردیم که این فیلد اجباریه، حالا اگر کاربر، این مقدار رو نفرسته، دوباره redirect میشه به همون view و اگر اوکی باشه مقدار Request Validated برگشت داده میشه.وقتی که این validation انجام میشه یه flash session ایجاد میشه که فقط یک بار نشون داده میشه و توی $errors ذخیره میشه و حالا کافیه که مقادیر موجود در اون رو بخونیم:dd($errors->all());اینطوری می‌تونیم این ارورها رو بخونیم.نمایش errorهای validationچک و نمایش error مربوط به یک فیلد خاصمثال بالا، با این تفاوت که از Directive استفاده شده و کار ما راحت شده، اون message هم مربوط به خود دایرکتیوه*** نکتهٔ مهم: اینجا ما Validation رو توی Controller انجام دادیم؛ حالا کافیه که این Validation رو منتقل کنیم به Request سفارشی خودمون:اعتبارسنجی در rulesپایان قسمت ۴۰