| AmirHossein |
الذهاب إلى القناة على Telegram
610
المشتركون
لا توجد بيانات24 ساعات
+27 أيام
+230 أيام
أرشيف المشاركات
\n@endpush\n\n// Parent File:\n\n @stack('scripts')\n\n\n4- دستور pushOnce:\nمشابه @push است اما تضمین میکند که محتوای اضافه شده تنها یک بار نمایش داده شود، حتی اگر چندین بار @pushOnce استفاده شده باشد.\n@pushOnce('scripts')\n \n@endpushOnce\n\n5- دستور pushIf:\nترکیبی از @push و شرایط است که اگر شرط برقرار باشد، محتوای آن به بخش مربوطه اضافه میشود.\n@pushIf($condition, 'scripts')\n \n@endpushIf\n\n6- دستور prepend:\nبرای اضافه کردن محتوای جدید به ابتدای یک بخش خاص.\n// Childe File:\n@prepend('scripts')\n \n@endprepend\n\n// Parent File:\n\n @stack('scripts')\n\n\n7- دستور inject:\nبرای تزریق یک سرویس یا متغیر به یک نمای Blade.\n@inject('metrics', 'App\\Services\\MetricsService')\n\n @yield('header')\n \n\n\nهمانطور که مشخص است، yield سکشن header در فایل مادر انجام شده در صورتی که سکشن header در فایل فرزند تعریف شده و با استفاده از extends فایل مادر در فایل فرزند، هر دو به هم مرتبط شده اند.\n\n11- دستور show:\nاین دستور برای پایان دادن به یک بخش و همزمان نمایش محتوای آن استفاده میشود. این دستور معمولاً زمانی استفاده میشود که بخشی از قالب بخواهد محتوای بخش خود را قبل از پایان قالب فعلی نمایش دهد.\n@section('sidebar')\n {{ $user->name }} \n@empty\n {{ $user->name }} \n \n @break($user->number == 5)\n@endforeach\n\n#laravel #فصل_۳\n@AmirhDeveloper\n.","datePublished":"2024-08-01T14:14:28Z","dateModified":"2024-08-01T14:14:28Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":3,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":208},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":6},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3}]}},{"@type":"ListItem","position":6,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/284","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/284","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/284","headline":"فصل سه - Views بخش اول - موتور قالبسازی Blade موتور قالبسازی Blade یک سیستم قالبسازی ساده و انعطافپذیر اس…","articleBody":"فصل سه - Views\n\nبخش اول - موتور قالبسازی Blade\n\nموتور قالبسازی Blade یک سیستم قالبسازی ساده و انعطافپذیر است که به صورت پیشفرض در فریمورک لاراول استفاده میشود. این موتور قالبسازی به شما امکان میدهد تا با استفاده از سینتکس ساده و تمیز، قالبهای وبسایت خود را طراحی و مدیریت کنید. در ادامه به توضیح کامل اجزای مختلف و امکانات موتور قالبسازی Blade میپردازیم:\n\nفایلهای Blade با پسوند .blade.php شناخته میشوند و معمولاً در دایرکتوری resources/views قرار میگیرند. به عنوان مثال:\n\nresources/views/welcome.blade.php\n\n\nبخش دوم - ساختار و سینتکس Blade\n\nBlade از سینتکس سادهای برای جایگذاری دادهها و استفاده از دستورالعملهای کنترلی استفاده میکند.\n\nبرای نمایش دادهها در قالب Blade از دستور {{ }} استفاده میشود. به عنوان مثال:\n
\n Monthly Revenue: {{ $metrics->monthlyRevenue() }}\n
\n\n8- دستور each:\nبرای رندر کردن یک نما برای هر آیتم در یک مجموعه.\n@each('view.name', $items, 'item', 'view.empty')\nview.name : نمایی که باید برای هر آیتم رندر شود.\n$items : مجموعهای از آیتمها.\nitem : نام متغیری که هر آیتم به آن ارجاع داده میشود.\nview.empty : نمایی که باید نمایش داده شود اگر مجموعه خالی باشد.\n\n9- دستور required:\nبرای تنظیم ویژگی required یک عنصر HTML به صورت شرطی.\n\n\n10- دستور readonly:\nبرای تنظیم ویژگی readonly یک عنصر HTML به صورت شرطی.\n\n\n11- دستور disabled:\nبرای تنظیم ویژگی disabled یک عنصر HTML به صورت شرطی.\n\n\n12- دستور selected:\nبرای تنظیم ویژگی selected یک گزینه در یک منوی انتخابی به صورت شرطی.\n\n\n13- دستور checked:\nبرای تنظیم ویژگی checked یک چکباکس یا رادیو باتن به صورت شرطی.\n\n\n14- دستور style:\nبرای اضافه کردن ویژگی style به یک عنصر HTML به صورت شرطی یا بدون شرط.\n// conditional\n $isHidden])>\n Content\n
\n\n// unconditionally\n\n Content\n
\n\n15- دستور class:\nبرای اضافه کردن کلاس CSS به یک عنصر HTML به صورت شرطی یا بدون شرط.\n// conditional\n $isHidden])>\n Content\n
\n\n// unconditionally\n\n Content\n
\n#laravel #فصل_۳\n@AmirhDeveloper\n.","datePublished":"2024-08-08T12:56:27Z","dateModified":"2024-08-08T12:56:27Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":191},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":3,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/287","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/287","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/287","headline":"فصل سه - Views بخش دوم - آشنایی با دستورات Blade - قسمت سوم 1- دستور csrf: این دستور برای تولید یک توکن CSRF…","articleBody":"فصل سه - Views\n\nبخش دوم - آشنایی با دستورات Blade - قسمت سوم\n\n1- دستور csrf:\nاین دستور برای تولید یک توکن CSRF استفاده میشود که به محافظت از فرمهای شما در برابر حملات CSRF کمک میکند.\n\n\n2- دستور method:\nاین دستور برای تعریف متد HTTP فرمها در صورت استفاده از روشهای غیر از GET و POST مانند PUT یا DELETE استفاده میشود.\n\n\n\n3- دستور error:\n این دستور برای نمایش پیامهای خطا استفاده میشود. معمولاً در فرمها برای نمایش خطاهای اعتبارسنجی به کار میرود.\n\n\n4- دستور use:\nاین دستور برای use کردن کلاس ها، کانستنت ها و... استفاده می شود.\n@use('App\\Models\\Flight')\n\n5- دستور php:\nاین دستور برای اجرای کد PHP درون قالب Blade استفاده میشود.\n@php\n $name = 'John Doe';\n@endphp\nHello, {{ $name }}
\n\n6- دستور env:\nاین دستور برای بررسی محیط فعلی برنامه استفاده میشود.\n@env('local')\nYou're in the local environment.
\n@endenv\n\n7- دستور production:\nاین دستور به شما امکان میدهد تا کدهایی را فقط در محیط تولید اجرا کنید.\n@production\nThis code runs only in the production environment.
\n@endproduction\n\n8- دستور verbatim:\nاین دستور برای جلوگیری از پردازش دستورات Blade در داخل بلوکهای HTML استفاده میشود.\n@verbatim\n\n This is a Blade directive: {{ $name }}\n
\n@endverbatim\n\nکد های درون این دستور توسط Blade تفسیر نخواهند شد و به همان شکل نمایش داده می شوند.\nهمچنین با قرار دادن یک @ اضافه قبل از دستورات Blade از تفسیر آن ها جلوگیری می شود:\n@@if()\n\n// HTML Output:\n@if()\n\n9- دستور fragment:\nاین دستور به شما امکان میدهد که یک بخش از کد را در یک نام خاص بستهبندی کنید و در جای دیگر فقط آن قطعه را رندر کنید.\n// Blade File:\n@fragment('user-list')\n - \n
- Item 1 \n
The S3 disk is available.
\n@elsedisk\nThe S3 disk is not available.
\n@enddisk\n\n@unlessdisk('local')\nThe local disk is not available.
\n@endunlessdisk\n\n#laravel #فصل_۳\n@AmirhDeveloper\n.","datePublished":"2024-08-07T11:30:17Z","dateModified":"2024-08-07T11:30:17Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":189},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":6},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2}]}},{"@type":"ListItem","position":4,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/286","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/286","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/286","headline":"فصل سه - Views بخش دوم - آشنایی با دستورات Blade - قسمت دوم 1- دستور include: این دستور برای درج یک ویو (view…","articleBody":"فصل سه - Views\n\nبخش دوم - آشنایی با دستورات Blade - قسمت دوم\n\n1- دستور include:\nاین دستور برای درج یک ویو (view) دیگر در ویوی فعلی استفاده میشود، و محتویات یک فایل را درون فایل دیگر قرار می دهد.\n\n @include('partials.header')\n\n\nاگر فایل partials/header.blade.php وجود داشته باشد، محتویات آن در محل استفاده از @include درج خواهد شد.\n\n2- دستور includeIf:\nاین دستور همانند @include عمل میکند، با این تفاوت که اگر ویو مورد نظر وجود نداشته باشد، خطایی رخ نمیدهد و دستور به سادگی نادیده گرفته میشود.\n\n @includeIf('partials.header')\n\n\n3- دستور includeWhen:\nاین دستور برای درج یک ویو در شرایط خاص استفاده میشود. این دستور دو پارامتر میگیرد: یک شرط و نام ویو.\n// $showHeader = true;\n\n @includeWhen($showHeader, 'partials.header')\n\n\n4- دستور includeUnless:\nاین دستور برعکس @includeWhen عمل میکند، یعنی ویو را زمانی درج میکند که شرط برقرار نباشد.\n// $hideHeader = false;\n\n @includeUnless($hideHeader, 'partials.header')\n\n\n5- دستور includeFirst:\nاین دستور برای درج اولین ویو موجود در لیست ویوهای داده شده استفاده میشود. این دستور یک آرایه از نام ویوها را به عنوان پارامتر دریافت میکند.\n\n @includeFirst(['custom.header', 'partials.header'])\n\n\nدر این مثال، اگر ویوی custom.header وجود داشته باشد، درج میشود و اگر وجود نداشته باشد، ویوی partials.header درج میشود.\n\n6- دستور section:\nاین دستور برای تعریف یک بخش (section) از قالب استفاده میشود که میتواند در قالب اصلی (layout) یا قالبهای فرزند مورد استفاده قرار گیرد.\n@section('content')\nThis is the content section.
\n@endsection\n\nاین دستور به تنهایی کاربرد ندارد و نیازمند دستور yield نیز می باشد(مورد بعدی).\n\n\n7- دستور yield\nاین دستور برای نمایش محتوای یک بخش در قالب اصلی (layout) استفاده میشود.\n\n @yield('content')\n\n\nاین دستور سکشن content که بالاتر تعریف کرده ایم را نمایش می دهد.\n\n8- دستور sectionMissing:\nاین دستور بررسی میکند که آیا یک section در ویو فعلی تعریف نشده است. اگر آن بخش تعریف نشده باشد، کد داخل sectionMissing اجرا میشود. و درصورتی که تعریف شده باشد محتوای sectionMissing نادیده گرفته می شود و محتوای section نمایش داده می شود.\n@sectionMissing('sidebar')\n \n@endsectionMissing\n\n9- دستور hasSection:\nاین دستور بررسی میکند که آیا یک section مشخص در ویو فعلی تعریف شده است یا نه. این دستور به شما امکان میدهد که بر اساس وجود یا عدم وجود یک بخش، رفتار خاصی را در قالب خود اعمال کنید.\n@hasSection('navigation')\n\n @yield('navigation')\n
\n@endif\n\n10- دستور extends:\nاین دستور برای تعریف اینکه یک ویو از کدام قالب (layout) ارثبری میکند استفاده میشود.\n// resources/views/welcome.blade.php\n@extends('layouts.app') //layouts/app.blade.php\n\n@section('header')\n Header Section in Child View
\n@endsection\n\nاین دستور برای ارثبری از قالب اصلی استفاده شده است. سپس با استفاده از دستورات section، محتوای هر بخش در قالب اصلی که از آن ارث بری شده جایگذاری شده است.\nدر واقع یک فایل مادر وجود دارد که در فایل های فرزند extends می شود و گسترش می یابد.\nنمایی از فایل layouts/app.blade.php یا همان فایل مادر:\n// resources/views/layouts/app.blade.php\n\nThis is the sidebar.
\n@show\n\n#laravel #فصل_۳\n@AmirhDeveloper\n.","datePublished":"2024-08-04T14:00:57Z","dateModified":"2024-08-04T14:00:57Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":185},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":5,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/285","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/285","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/285","headline":"فصل سه - Views بخش دوم - آشنایی با دستورات Blade - قسمت اول همانطور که در قسمت های قبل گفته شد View ها یا فای…","articleBody":"فصل سه - Views\n\nبخش دوم - آشنایی با دستورات Blade - قسمت اول\n\nهمانطور که در قسمت های قبل گفته شد View ها یا فایل های نمایشی مثل فایل های HTML در پوشه resources/views قرار می گیرند و فرمت آنها .blade.php می باشد.\nبا اجرای دستور زیر می توانید یک فایل view ایجاد کنید:\nphp artisan make:view greeting\n\nدستور بالا یک فایل با فرمت .blade.php را در مسیر resources/views با نام greeting ایجاد می کند. همچنین می توانید این عمل را به صورت دستی انجام دهید.\n\nدر لاراول به واسطه موتور قالب سازی Blade به جای نوشتن مستقیم کد های PHP از دستورات Blade استفاده می کنیم تا ساختار تمیزتر، ساده تر و خواناتری داشته باشیم.\n\nدر ادامه با دستورات Blade آشنا می شویم:\n\n 1- دستور {{ x }} و {!! x !!}\n\nاز {{ }} برای چاپ محتوای متغیرها و دادهها در فایلهای قالب استفاده میشود. این نوع استفاده معمولاً برای جلوگیری از حملات XSS (Cross-Site Scripting) است و محتوای داخل {{ }} به صورت امن نمایش داده میشود.\nHello, {{ $name }}!
\n\nم.تور Blade به صورت پیشفرض دادههای داخل {{ }} را escape میکند. این به این معنی است که هر محتوایی که شامل کاراکترهای ویژه HTML باشد به صورت امن نمایش داده میشود.\nاگر میخواهید دادهای را بدون escape کردن نمایش دهید، میتوانید از سه علامت تعجب {{{ }}} یا تابع {!! !!} استفاده کنید. اما باید خیلی مراقب باشید که این نوع استفاده ممکن است منجر به حملات XSS شود اگر دادهها به درستی اعتبارسنجی نشده باشند.\nHello, {!! $name !!}!
\n\nهمچنین می توانید خروجی توابع را نیز نمایش دهید:\nThe current UNIX timestamp is {{ time() }}.
\n\n2- دستورات if، elseif، else، unless\n\nدستورات بالا همانند دستورات شرطی PHP عمل میکنند.\n@if ($user->isAdmin())\nWelcome, admin!
\n@elseif ($user->isModerator())\nWelcome, moderator!
\n@else\nWelcome, user!
\n@endif\n\nدستور @unless برای اجرای یک بلوک کد در صورتی که یک شرط برقرار نباشد، استفاده میشود. این دستور معکوس دستور @if است.\n@unless ($user->isGuest())\nWelcome back, {{ $user->name }}!
\n@endunless\n\n3- دستورات isset و empty\nاین دستورات برای بررسی خالی بود یا تعریف شدن یک مقدار استفاده می شوند همانند توابع همان آنها در PHP.\n@isset($records)\n // $records is defined and is not null...\n@endisset\n \n@empty($records)\n // $records is \"empty\"...\n@endempty\n\n4- دستورات auth و guest\nبرای نمایش یا عدم نمایش محتوا بر اساس وضعیت احراز هویت (authentication) کاربر استفاده میشوند. این دستورات به شما امکان میدهند تا به سادگی محتوای خاصی را برای کاربران احراز هویت شده یا کاربران مهمان (غیر احراز هویت شده) نمایش دهید.\n@auth\n // The user is authenticated...\n@endauth\n \n@guest\n // The user is not authenticated...\n@endguest\n\nهمچنین این دو دستور پارامتری که نام گارد احراز هویت می باشد را نیز دریافت میکنند تا به وسیله آن وضعیت احراز هویت را بررسی کنند.\nدر فصل های مربوطه با گارد ها آشنا می شویم.\n@auth('admin')\n ...\n@endauth\n\n@guest('admin')\n ...\n@endguest\n\n5- دستورات switch case\nاین دستورات نیز همانند switch case در PHP هستند:\n@switch($i)\n @case(1)\n First case...\n @break\n \n @case(2)\n Second case...\n @break\n \n @default\n Default case...\n@endswitch\n\n6- حلقه ها\nحلقه ها در Blade نیز مانند حلقه ها در PHP نوشته می شوند:\n@for ($i = 0; $i < 10; $i++)\n The current value is {{ $i }}\n@endfor\n\n@foreach ($users as $user)\nThis is user {{ $user->id }}
\n@endforeach\n\n@while (true)\nI'm looping forever.
\n@endwhile\n\nدستور جدیدی با نام forelse وجود دارد تا در صورت خالی بودن متغیر شرط دیگری اجرا شود.\n@forelse ($users as $user)\nNo users
\n@endforelse\n\n7- دستورات continue و break\nاین دستورات برای کنترل حلقه ها استفاده می شوند، همچنین می توانند یک شرط برای ورودی دریافت کنند و در صورت برقرار بودن شرط اجرا شوند:\n@foreach ($users as $user)\n @continue($user->type == 1)\n \nHello, {{ $name }}
\n\nدر این مثال، مقدار متغیر $name در مکان مورد نظر جایگذاری میشود.\n\nBlade از دستورات کنترلی مانند شرطها و حلقهها پشتیبانی میکند.\n\nبرای استفاده از شرطها از دستور @if و @endif استفاده میشود:\n@if ($age >= 18)\nAdult
\n@else\nChild
\n@endif\n\nهمچنین می توان به همین صورت از حلقه ها نیست استفاده کرد:\n@foreach ($users as $user)\n{{ $user->name }}
\n@endforeach\n\n@for($i = 0; $i <= 10; $i++)\n{{ $i }}
\n@endfor\n\n@while (true)\nI'm looping forever.
\n@endwhile\n\nBlade امکان وراثت قالبها را نیز فراهم میکند. این ویژگی به شما امکان میدهد تا یک ساختار پایه برای قالبهای خود تعریف کنید و قالبهای دیگر را از آن به ارث ببرید.\n\nهمچنین امکان تعریف کامپوننتهای قابل استفاده مجدد را فراهم میکند. به عنوان مثال، شما میتوانید یک کامپوننت برای نمایش کارتهای کاربر تعریف کنید.\n\nشما میتوانید دادههایی را که در تمام قالبها به صورت مشترک استفاده میشوند، از طریق Service Provider ها به اشتراک بگذارید.\n// app/Providers/AppServiceProvider.php\npublic function boot()\n{\n View::share('key', 'value');\n}\n\n// view.blade.php\n{{ $key }}
\n\nاز شرطهای پیچیده و حلقهها نیز پشتیبانی میکند. به عنوان مثال، شما میتوانید از حلقههای تو در تو استفاده کنید:\n@foreach ($users as $user)\n{{ $user->name }}
\n @foreach ($user->posts as $post)\n{{ $post->title }}
\n @endforeach\n@endforeach\n\nنکته : در این قسمت صرفا با ساختار و کاربرد های Blade آشنا شدیم، و در قسمت های بعدی با تمام دستورات Blade، ارث بری قالب ها، ایجاد کامپوننت ها و همچنین ایجاد دستورات Blade سفارشی آشنا می شویم.\n\nموتور قالبسازی Blade یک ابزار قدرتمند و انعطافپذیر برای مدیریت قالبهای وبسایتها در فریمورک لاراول است. با استفاده از سینتکس ساده و قابلیتهای گستردهای که ارائه میدهد، میتوانید قالبهای پویا و قابل توسعهای ایجاد کنید.\n\n#laravel #فصل_۳ \n@AmirhDeveloper\n.","datePublished":"2024-07-30T13:57:12Z","dateModified":"2024-07-30T13:57:12Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":184},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":7},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":7,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/283","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/283","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/283","headline":"فصل دو - Controllers بخش دوم - کنترلر های API و Dependency Injection کنترلر های API: کنترلرهای API بهطور خاص…","articleBody":"فصل دو - Controllers\n\nبخش دوم - کنترلر های API و Dependency Injection\n\nکنترلر های API:\n\nکنترلرهای API بهطور خاص برای مدیریت درخواستهای API استفاده میشوند. در اینجا توضیحاتی درباره کنترلرهای API در لاراول ارائه میشود:\n\nبرای ایجاد یک کنترلر API، میتوانید از دستور زیر استفاده کنید:\nphp artisan make:controller Api/UserController --api\n\nاین دستور یک کنترلر جدید در مسیر app/Http/Controllers/Api ایجاد میکند که شامل متدهای پایهای مانند index, store, show, update و destroy میشود.\n\nبرای دسترسی به متدهای کنترلر API، باید مسیرهای مناسب را تعریف کنید. در فایل routes/api.php، میتوانید مسیرها را به صورت زیر تعریف کنید:\n\nبرای تعریف این مسیر ها از متد جدیدی از فساد Route استفاده می کنیم:\nuse App\\Http\\Controllers\\Api\\MyController;\n\nRoute::apiResource('users', MyController::class);\n\nدر صورتی که فایل api.php برای شما در پوشه routes وجود ندارد با دستور زیر آن را ایجاد کنید:\nphp artisan install:api\n\nتفاوت یک کنترلر API با کنترلر Resource در این است که متد های create و edit در کنترلر API وجود ندارد، زیرا در API ها نیازی به رندر کردن View نیست.\n\nدپندنسی اینجکشن در کنترلر ها:\n\nدپندنسی اینجکشن (Dependency Injection) یکی از اصول مهم طراحی شیءگرا است که به شما کمک میکند وابستگیهای کلاسها را مدیریت کنید و کد قابل تست و قابل نگهداری بنویسید. در لاراول، دپندنسی اینجکشن به سادگی با استفاده از سیستم سرویس کانتینر (Service Container) این فریمورک امکانپذیر است.\n\nنکته: درمورد سرویس کانتینر و پروایدر ها در فصل های آینده به طور مفصل توضیح داده می شود.\n\nدپندنسی اینجکشن به این معنا است که یک کلاس به جای اینکه خودش مسئول ایجاد وابستگیهایش باشد، این وابستگیها از بیرون به آن تزریق میشوند. به عبارت دیگر، وابستگیهای یک کلاس به عنوان پارامترهای سازنده (constructor) یا متدهای دیگر به آن تحویل داده میشوند.\n\nفرض کنید میخواهیم یک کنترلر ایجاد کنیم که برای انجام عملیاتهای مربوط به یک مخزن داده (Repository) نیاز به یک سرویس دارد.\n\nابتدا یک اینترفیس برای مخزن داده تعریف میکنیم:\n// app/Repositories/UserRepositoryInterface.php\nnamespace App\\Repositories;\n\ninterface UserRepositoryInterface {\n public function all();\n}\n\nسپس یک پیادهسازی برای این اینترفیس ایجاد میکنیم:\n// app/Repositories/UserRepository.php\nnamespace App\\Repositories;\n\nuse App\\Models\\User;\n\nclass UserRepository implements UserRepositoryInterface {\n public function all() {\n return User::all();\n }\n}\n\nباید پیادهسازی مخزن را در سرویس کانتینر لاراول ثبت کنیم تا بتوانیم آن را به کنترلر تزریق کنیم. برای این کار، از یک سرویس پروایدر استفاده میکنیم.\n\nمی توانید با دستور زیر یک پروایدر ایجاد کنید:\nphp artisan make:provider RepositoryServiceProvider \n\n// app/Providers/RepositoryServiceProvider.php\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\nuse App\\Repositories\\UserRepositoryInterface;\nuse App\\Repositories\\UserRepository;\n\nclass RepositoryServiceProvider extends ServiceProvider {\n public function register() {\n $this->app->bind(UserRepositoryInterface::class, UserRepository::class);\n }\n}\n\nسپس این سرویس پروایدر را به لیست پروایدرهای اپلیکیشن اضافه میکنیم:\n\n// config/providers.php\nreturn [\n App\\Providers\\AppServiceProvider::class,\n App\\Providers\\RepositoryServiceProvider::class,\n];\n\nحالا میتوانیم این مخزن را به کنترلر تزریق کنیم:\n// app/Http/Controllers/UserController.php\nnamespace App\\Http\\Controllers;\n\nuse App\\Repositories\\UserRepositoryInterface;\n\nclass UserController extends Controller {\n protected $userRepository;\n\n public function __construct(UserRepositoryInterface $userRepository) {\n $this->userRepository = $userRepository;\n }\n\n public function index() {\n $users = $this->userRepository->all();\n return view('users.index', compact('users'));\n }\n}\n\nدر این مثال، کلاس UserController وابستگی خود را به UserRepositoryInterface از طریق کانستراکتور دریافت میکند. لاراول به صورت خودکار پیادهسازی صحیح را از طریق سرویس کانتینر تزریق میکند.\n\n#laravel #فصل_۲\n@AmirhDeveloper\n.","datePublished":"2024-07-29T12:06:01Z","dateModified":"2024-07-29T12:06:01Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":162},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":8,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/282","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/282","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/282","headline":"فصل دو - Controllers بخش اول - ایجاد و استفاده از کنترلرها کنترلرها (Controllers) یکی از اجزای اصلی معماری MV…","articleBody":"فصل دو - Controllers\n\nبخش اول - ایجاد و استفاده از کنترلرها\n\nکنترلرها (Controllers) یکی از اجزای اصلی معماری MVC (Model-View-Controller) هستند. کنترلرها وظیفه دارند درخواستهای ورودی را مدیریت کرده و پاسخهای مناسب را به سمت کاربر ارسال کنند.\n\nتعریف کنترلرها:\n\nکنترلرها در لاراول فایلهایی هستند که در پوشه app/Http/Controllers قرار میگیرند و شامل کلاسهایی هستند که مسئولیت کنترل جریان درخواستها و پاسخها را بر عهده دارند. به طور کلی، کنترلرها به منظور جداسازی منطق تجاری (Business Logic) از منطق نمایش (Presentation Logic) استفاده میشوند.\n\nایجاد کنترلر:\nبرای ایجاد یک کنترلر در لاراول، میتوانید از کامند Artisan استفاده کنید. به عنوان مثال:\nphp artisan make:controller UserController\n\nاین دستور یک کنترلر جدید به نام UserController در پوشه app/Http/Controllers ایجاد میکند.\n\nانواع کنترلرها:\n\nلاراول چندین نوع کنترلر را پشتیبانی میکند:\n\n1- کنترلرهای پایه (Plain Controllers): کنترلرهای سادهای که شامل متدهای مختلف برای مدیریت درخواستها هستند.\n\n2- کنترلرهای منبع (Resource Controllers): کنترلرهایی که برای عملیات CRUD (ایجاد، خواندن، بهروزرسانی، حذف) بهینه شدهاند. میتوانید با استفاده از دستور زیر یک کنترلر منبع ایجاد کنید:\nphp artisan make:controller UserController --resource\n\n این کنترلر شامل 7 متد پیشفرض است:\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\nuse App\\Models\\User;\n\nclass UserController extends Controller\n{\n public function index()\n {\n // show users list\n }\n\n public function create()\n {\n // show create form\n }\n\n public function store(Request $request)\n {\n // store user data\n }\n\n public function show($id)\n {\n // show user data\n }\n\n public function edit($id)\n {\n // show edit form\n }\n\n public function update(Request $request, $id)\n {\n // update user data\n }\n\n public function destroy($id)\n {\n // delete user\n }\n}\n\n3- کنترلرهای قابل توزیع (Singleton Controllers): کنترلرهایی که تنها یک نمونه از آنها در طول عمر درخواست ایجاد میشود.\nphp artisan make:controller SingletonController --invokable\n\nنمونه کنترلر برای انجام یک عملیات:\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nclass SingletonController extends Controller\n{\n public function __invoke()\n {\n // \n }\n}\n\nمسیر دهی کنترلرها در روتینگ\n\nبرای اتصال یک route به کنترلر روش های متنوعی وجود دارد که در ادامه بررسی خواهیم کرد:\n1-\nRoute::get(\"/users\", \"app\\Http\\Controllers\\UserController@index\");\n\nدر مثال بالا پارامتر دوم به متد index از کنترلر UserController اشاره دارد.\nابتدا نام کامل کنترلر سپس @ و بعد نام متد.\n\n2-\nuse app\\Http\\Controllers\\UserController;\nRoute::get(\"/users\", [UserController::class, 'index']);\n\nروش بالا یک روش دیگر برای فراخوانی یک متد از کنترلر است، به این صورت که در یک آرایه، اندیس صفر برابر کلاس کنترلر و اندیس یک برابر نام متد.\n\nبرای فراخوانی کنترلر های resource میتوانید از متد دیگری از فساد Route استفاده کنید.\nRoute::resource('users', UserController::class);\n\nاین متد به صورت خودکار 7 متد کنترلر را مسیردهی می کند.\n\nهمچنین متد دیگری از فساد Route برای کنترلر ها در دسترس است:\nRoute::controller(UserController::class)->group(function(){\nRoute::get(\"/users\", 'index');\n});\n\nدر روش بالا یک گروه برای یک کنترلر ایجاد می کنید و پس از آن تنها نام متد کنترلر را به عنوان اکشن وارد می کنید.\n\n#laravel #فصل_۲\n@AmirhDeveloper\n.","datePublished":"2024-07-28T13:55:33Z","dateModified":"2024-07-28T13:55:33Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":163},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":9,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/281","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/281","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/281","headline":"فصل یک - Routing بخش چهارم - معرفی کامند های روتینگ Artisan ابزار خط فرمانی است که به شما کمک میکند تا کاره…","articleBody":"فصل یک - Routing\n\nبخش چهارم - معرفی کامند های روتینگ\n\nArtisan ابزار خط فرمانی است که به شما کمک میکند تا کارهای مختلفی را در پروژه لاراول خود انجام دهید. این کامندها به توسعهدهندگان اجازه میدهند تا به سرعت وظایف مختلفی را مانند مدیریت مسیرها، پیکربندیها، و کشها انجام دهند.\n\nدر این قسمت با کامند های مربوط به بخش روتینگ آشنا می شویم:\n\n1-\nphp artisan install:api\n\nدر نسخه جدید لاراول مسیر های مربوط به API به طور پیش فرض وجود ندارد، اگر پروژه شما نیاز به API دارد با این دستور مسیر های API را ایجاد و پیکربندی کنید.\nبا اجرای این دستور فایل api.php در پوشه route برای شما ایجاد می شود.\nهمچنین Laravel Sanctum که یک پکیج برای احراز هویت و محافظ API ها می باشد به طور خودکار برای شما نصب می شود.\n\n2-\nphp artisan route:list\n\nاین دستور لیستی از تمام مسیرهای ثبت شده در پروژه را نمایش میدهد. اطلاعاتی مانند HTTP Method, URL، نام مسیر و کنترلری که درخواستها را مدیریت میکند، را نمایش میدهد.\n\n3- \nphp artisan route:list -v\n\nتمامی اطلاعات پیشفرض به علاوه جزئیات بیشتری از Action، مانند نام کنترلر و متد، و میدلورهای مورد استفاده در مسیر را نمایش میدهد.\nاطلاعات دقیقتر درباره namespace و گروهبندیهای اعمال شده به مسیرها نیز ممکن است نمایش داده شود.\n\n4- \nphp artisan route:list -vv\n\nتمامی اطلاعات -v به علاوه اطلاعات بیشتری درباره پارامترهای مسیر، نامهای کامل کلاسها و متدها، و جزئیات دقیقتر دیگری که ممکن است در مسیر استفاده شده باشند را نمایش میدهد.\nاین سطح از جزئیات میتواند شامل اطلاعات دقیقتر درباره dependency injection و هر نوع تنظیمات خاص دیگر مربوط به مسیر باشد.\n\n5- \nphp artisan route:list --path=api\n\nاین کامند لیست مسیرهایی را نمایش میدهد که شامل رشته api در URL خود هستند. این میتواند برای فیلتر کردن و نمایش مسیرهای مرتبط مفید باشد.\n\n6- \nphp artisan route:list --except-vendor\n\nاین کامند لیست مسیرها را به استثنای مسیرهایی که از پکیجهای vendor آمدهاند، نمایش میدهد.\n\n7-\nphp artisan route:list --only-vendor\n\nاین کامند تنها مسیرهایی را نمایش میدهد که از پکیجهای vendor آمدهاند.\n\n8- \nphp artisan config:publish cors\n\nاین کامند برای انتشار تنظیمات پیکربندی CORS (Cross-Origin Resource Sharing) استفاده میشود. این پیکربندیها میتواند شامل تنظیمات امنیتی برای مدیریت درخواستهای API از دامنههای مختلف باشد.\n\n9- \nphp artisan route:cache\n\nاین کامند برای کش کردن (ذخیره موقت) تمامی مسیرهای ثبت شده در پروژه استفاده میشود. این کار به بهبود عملکرد برنامه کمک میکند زیرا نیاز به تحلیل دوباره مسیرها در هر درخواست کاهش مییابد.\n\n10-\nphp artisan route:clear\n\nاین کامند برای پاک کردن کش مسیرها استفاده میشود. بعد از اجرای این کامند، لاراول مسیرها را دوباره از نو تحلیل و ثبت میکند.\n\nاین کامندها به توسعهدهندگان کمک میکند تا مدیریت بهتری بر روی پروژه لاراول خود داشته باشند و به راحتی بتوانند وظایف روزمره توسعه را انجام دهند.\n\n#laravel #فصل_۱ \n@AmirhDeveloper\n.","datePublished":"2024-07-27T09:55:31Z","dateModified":"2024-07-27T09:55:31Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":170},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":10,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/280","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/280","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/280","headline":"فصل یک - Routing بخش سوم - میدلورها - قسمت دوم در قسمت قبل آموختیم پس از ساخت یک میدلور، باید آن را در برنامه…","articleBody":"فصل یک - Routing\n\nبخش سوم - میدلورها - قسمت دوم\n\nدر قسمت قبل آموختیم پس از ساخت یک میدلور، باید آن را در برنامه ثبت کنیم.\nبرای این کار میدلور ها را در متد withMiddleware در فایل bootstrap/app.php ثبت می کردیم:\n->withMiddleware(function (Middleware $middleware) {\n // $middleware->\n})\nمتد های مختلفی از متغیر $middleware برای ثبت میدلور ها در دسترس است که به بررسی آنها خواهیم پرداخت:\n\n1- متد use\nاین متد استک سراسری میدلور ها را به صورت دستی تنظیم میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->use([\n TrustHosts::class,\n // ...\n ]);\n})\n\n2- متد append\nاین متد یک میدلور را به آخر لیست میدلور ها اضافه میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->append(TrustHosts::class);\n})\n\n3- متد prepend\nاین متد یک میدلور را به اول لیست میدلور ها اضافه میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->prepend(TrustHosts::class);\n})\n\n4- متد remove\nاین متد یک میدلور را از لیست میدلور ها حذف میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->remove(TrustHosts::class);\n})\n\n5- متد replace\nاین متد یک میدلور را چایگزین میدلور موجود در استک میدلور ها می کند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->replace(First::class, Second:class);\n})\n\n6- متد group\nاین متد یک گروه از چندین میدلور را ایجاد میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->group('my-group', [\n TrustHosts::class,\n StartSession::class,\n // ...\n ]);\n})\n\n// Use\nRoute::get('/', function () {\n // ...\n})->middleware('my-group');\n\n7- متد alias\nاین متد یک میدلور را با نام مستعار ثبت میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->alias([\n 'permission' => Permission::class,\n ]);\n})\n\n8- متد api\nاین متد یک میدلور را به گروه پیشفرض api اضافه/حذف/جایگزین میکند.\n->withMiddleware(function (Middleware $middleware) {\n // append middleware\n $middleware->api(append: [\n StartSession::class,\n ]);;\n\n // prepend middleware\n $middleware->api(prepend: [\n StartSession::class,\n ]);;\n\n // remove middleware\n $middleware->api(remove: [\n StartSession::class,\n ]);;\n\n // replace middleware\n $middleware->api(replace: [\n First::class => Second::class,\n ]);;\n})\n\n9- متد web\nاین متد یک میدلور را به گروه پیشفرض web اضافه/حذف/جایگزین میکند.\n->withMiddleware(function (Middleware $middleware) {\n // append middleware\n $middleware->web(append: [\n StartSession::class,\n ]);;\n\n // prepend middleware\n $middleware->web(prepend: [\n StartSession::class,\n ]);;\n\n // remove middleware\n $middleware->web(remove: [\n StartSession::class,\n ]);;\n\n // replace middleware\n $middleware->web(replace: [\n First::class => Second::class,\n ]);;\n})\n\n10- متد appendToGroup\nاین متد یک یا چند میدلور را به آخر یک گروه اضافه میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->appendToGroup('group-name', [\n StartSession::class,\n ]);\n})\n\n11- متد prependToGroup\nاین متد یک یا چند میدلور را به اول یک گروه اضافه میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->prependToGroup('group-name', [\n StartSession::class,\n ]);\n})\n\n\n12- متد removeFromGroup\nاین متد یک یا چند میدلور را از یک گروه حذف میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->removeFromGroup('group-name', [\n StartSession::class,\n ]);\n})\n\n13- متد replaceInGroup\nاین متد یک یا چند میدلور را از یک گروه حذف میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->replaceInGroup('group-name', First::class, Second::class);\n})\n\n14- متد priority\nاین متد اجرای میدلور ها را الویت بندی میکند.\n->withMiddleware(function (Middleware $middleware) {\n $middleware->priority([\n First::class,\n Second::class,\n Third::class,\n ]);\n})\n\n#laravel #فصل_۱ \n@AmirhDeveloper\n.","datePublished":"2024-07-26T12:26:15Z","dateModified":"2024-07-26T12:26:15Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":196},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":11,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/279","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/279","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/279","headline":"فصل یک - Routing بخش سوم - میدلورها میدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HT…","articleBody":"فصل یک - Routing\n\nبخش سوم - میدلورها\n\nمیدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HTTP ورودی به برنامه شما فراهم میکنند. \n\nبه عنوان مثال، لاراول یک میدلور دارد که بررسی میکند آیا کاربر وارد سیستم شده است یا خیر. اگر کاربر وارد نشده باشد، او را به صفحه ورود هدایت میکند. اما اگر وارد شده باشد، درخواست را به مسیر بعدی هدایت میکند.\n\nلاراول شامل میدلورهای متنوعی از جمله تأیید هویت و حفاظت CSRF است. \n\nهمچنین کاربر می تواند میدلور های خود را بنویسد، تمامی میدلورهای تعریف شده توسط کاربر معمولاً در مسیر app/Http/Middleware قرار میگیرند.\n\nساخت میدلور اختصاصی:\n\nبرای ساخت میدلور اختصاصی، از دستور زیر در ترمینال استفاده کنید:\nphp artisan make:middleware {MiddlewareName}\n\nاین دستور یک میدلور با نام داده شده در مسیر app/Http/Middleware ایجاد میکند.\n\nتمامی عملیات بررسی در متد handle انجام میشود. میتوانید شروطی را بر روی درخواستها اعمال کنید. در صورتی که شروط برقرار باشند، متد handle میدلور بعدی را فراخوانی میکند و درخواست را ادامه میدهد. در غیر این صورت، درخواست متوقف و نتیجه تغییر خواهد کرد. مثال:\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckAge\n{\n public function handle(Request $request, Closure $next)\n {\n if ($request->age <= 18) {\n return redirect('home');\n }\n\n return $next($request);\n }\n}\nاگر سن کاربر کمتر یا مساوی ۱۸ باشد، به صفحه خانه هدایت میشود. در غیر این صورت، درخواست ادامه پیدا میکند.\n\nثبت میدلور:\n\nبرای استفاده از یک میدلور اختصاصی، ابتدا باید آن را در برنامه خود ثبت کنید. برای این کار وارد فایل bootstrap/app.php شوید و دنبال بخش زیر بگردید:\n->withMiddleware(function (Middleware $middleware) {\n //\n})\n\nبرای ثبت میدلور جدید، میتوانید متد append را از $middleware صدا بزنید و نام میدلور را به صورت کامل به آن پاس بدهید:\n->withMiddleware(function (Middleware $middleware) {\n $middleware->append(CheckAge::class);\n})\n\nهمچنین میتوانید یک نام مستعار برای میدلور خود ثبت کنید تا سادهتر به آن دسترسی داشته باشید:\n->withMiddleware(function (Middleware $middleware) {\n $middleware->alias([\n 'age' => CheckAge::class\n ]);\n})\n\nبا سایر متد قابل دسترس از $middleware در قسمت بعدی آشنا می شویم.\n\nاستفاده از میدلور در مسیرها:\n\nبرای اعمال یک میدلور بر روی route ها با متد جدیدی از فساد Route آشنا می شویم:\nRoute::get('profile', function () {\n // Only executed if age > 18\n})->middleware(CheckAge::class);\n\n// Or use alias:\nRoute::get('profile', function () {\n // Only executed if age > 18\n})->middleware('age');\n\nمتد middleware یک یا چند میدلور را بر روی یک مسیر اعمال میکند و در صورتی که شروط میدلور برقرار باشد، مسیر اجرا خواهد شد. در مثال ما، تنها در صورتی که سن بیشتر از ۱۸ باشد، مسیر اجرا خواهد شد.\n\nغیرفعال کردن میدلور برای مسیرها:\n\nمتد دیگری از فساد Route با نام withoutMiddleware نیز در دسترس است که میدلور های داده شده را بر روی مسیر مورد نظر اجرا نخواهد کرد:\nRoute::withoutMiddleware([CheckAge::class])->group(function () {\n Route::get('/profile', function () {\n // ...\n });\n});\n\nارسال پارامتر به میدلور:\n\nمیتوانید پارامترهایی را به میدلور خود اختصاص دهید:\nRoute::get('profile', function () {\n // Only executed if age > 20\n})->middleware('age:20');\n\nپارامترهای ورودی را میتوانید در متد handle دریافت کنید:\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckAge\n{\n public function handle(Request $request, Closure $next, $minAge)\n {\n if ($request->age <= $minAge) {\n return redirect('home');\n }\n\n return $next($request);\n }\n}\n\nدر مثال بالا، یک میدلور داینامیک ایجاد کردهایم که میتوانیم هر سنی را به واسطه آن بررسی کنیم.\n\nهمچنین می توانید پارامتر های بیشتری را ارسال و دریافت کنید:\nRoute::get('profile', function () {\n\n})->middleware('age:20,gt');\n\nو همینطور در متد handle:\nclass CheckAge\n{\n public function handle(Request $request, Closure $next, $minAge, $type)\n {\n //\n }\n}\n#laravel #فصل_۱ \n@AmirhDeveloper\n.","datePublished":"2024-07-25T13:38:13Z","dateModified":"2024-07-25T13:38:13Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":165},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}]}},{"@type":"ListItem","position":12,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/278","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/278","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/278","headline":"فصل یک - Routing بخش سوم - میدلورها میدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HT…","articleBody":"فصل یک - Routing\n\nبخش سوم - میدلورها\n\nمیدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HTTP ورودی به برنامه شما فراهم میکنند. \n\nبه عنوان مثال، لاراول یک میدلور دارد که بررسی میکند آیا کاربر وارد سیستم شده است یا خیر. اگر کاربر وارد نشده باشد، او را به صفحه ورود هدایت میکند. اما اگر وارد شده باشد، درخواست را به مسیر بعدی هدایت میکند.\n\nلاراول شامل میدلورهای متنوعی از جمله تأیید هویت و حفاظت CSRF است. \n\nهمچنین کاربر می تواند میدلور های خود را بنویسد، تمامی میدلورهای تعریف شده توسط کاربر معمولاً در مسیر app/Http/Middleware قرار میگیرند.\n\nساخت میدلور اختصاصی:\n\nبرای ساخت میدلور اختصاصی، از دستور زیر در ترمینال استفاده کنید:\nphp artisan make:middleware {MiddlewareName}\n\nاین دستور یک میدلور با نام داده شده در مسیر app/Http/Middleware ایجاد میکند.\n\nتمامی عملیات بررسی در متد handle انجام میشود. میتوانید شروطی را بر روی درخواستها اعمال کنید. در صورتی که شروط برقرار باشند، متد handle میدلور بعدی را فراخوانی میکند و درخواست را ادامه میدهد. در غیر این صورت، درخواست متوقف و نتیجه تغییر خواهد کرد. مثال:\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckAge\n{\n public function handle(Request $request, Closure $next)\n {\n if ($request->age <= 18) {\n return redirect('home');\n }\n\n return $next($request);\n }\n}\nاگر سن کاربر کمتر یا مساوی ۱۸ باشد، به صفحه خانه هدایت میشود. در غیر این صورت، درخواست ادامه پیدا میکند.\n\nثبت میدلور:\n\nبرای استفاده از یک میدلور اختصاصی، ابتدا باید آن را در برنامه خود ثبت کنید. برای این کار وارد فایل bootstrap/app.php شوید و دنبال بخش زیر بگردید:\n->withMiddleware(function (Middleware $middleware) {\n //\n})\n\nبرای ثبت میدلور جدید، میتوانید متد append را از $middleware صدا بزنید و نام میدلور را به صورت کامل به آن پاس بدهید:\n->withMiddleware(function (Middleware $middleware) {\n $middleware->append(CheckAge::class);\n})\n\nهمچنین میتوانید یک نام مستعار برای میدلور خود ثبت کنید تا سادهتر به آن دسترسی داشته باشید:\n->withMiddleware(function (Middleware $middleware) {\n $middleware->alias([\n 'age' => CheckAge::class\n ]);\n})\n\nبا سایر متد قابل دسترس از $middleware در قسمت بعدی آشنا می شویم.\n\nاستفاده از میدلور در مسیرها:\n\nبرای اعمال یک میدلور بر روی route ها با متد جدیدی از فساد Route آشنا می شویم:\nRoute::get('profile', function () {\n // Only executed if age > 18\n})->middleware(CheckAge::class);\n\n// Or use alias:\nRoute::get('profile', function () {\n // Only executed if age > 18\n})->middleware('age');\n\nمتد middleware یک یا چند میدلور را بر روی یک مسیر اعمال میکند و در صورتی که شروط میدلور برقرار باشد، مسیر اجرا خواهد شد. در مثال ما، تنها در صورتی که سن بیشتر از ۱۸ باشد، مسیر اجرا خواهد شد.\n\nغیرفعال کردن میدلور برای مسیرها:\n\nمتد دیگری از فساد Route با نام withoutMiddleware نیز در دسترس است که میدلور های داده شده را بر روی مسیر مورد نظر اجرا نخواهد کرد:\nRoute::withoutMiddleware([CheckAge::class])->group(function () {\n Route::get('/profile', function () {\n // ...\n });\n});\n\nارسال پارامتر به میدلور:\n\nمیتوانید پارامترهایی را به میدلور خود اختصاص دهید:\nRoute::get('profile', function () {\n // Only executed if age > 18\n})->middleware('age:20');\n\nپارامترهای ورودی را میتوانید در متد handle دریافت کنید:\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass CheckAge\n{\n public function handle(Request $request, Closure $next, $minAge)\n {\n if ($request->age <= $minAge) {\n return redirect('home');\n }\n\n return $next($request);\n }\n}\n\nدر مثال بالا، یک میدلور داینامیک ایجاد کردهایم که میتوانیم هر سنی را به واسطه آن بررسی کنیم.\n\nهمچنین می توانید پارامتر های بیشتری را ارسال و دریافت کنید:\nRoute::get('profile', function () {\n\n})->middleware('age:20,gt');\n\nو همینطور در متد handle:\nclass CheckAge\n{\n public function handle(Request $request, Closure $next, $minAge, $type)\n {\n //\n }\n}\n#laravel #فصل_۱ \n@AmirhDeveloper\n.","datePublished":"2024-07-25T13:36:54Z","dateModified":"2024-07-25T13:37:30Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":1}]}},{"@type":"ListItem","position":13,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/277","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/277","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/277","headline":"فصل یک - Routing بخش دوم - معرفی متد های روتینگ - قسمت سوم در این قسمت به سایر متد های روتینگ می پردازیم: 1-…","articleBody":"فصل یک - Routing\n\nبخش دوم - معرفی متد های روتینگ - قسمت سوم\n\nدر این قسمت به سایر متد های روتینگ می پردازیم:\n\n1- متد redirect برای ریدایرکت کردن یک URL به URL دیگر استفاده میشود.\nRoute::redirect('/from-url', '/to-url');\n// OR\nRoute::redirect('/from-home', '/to', 301);\n\n2- متد permanentRedirect برای ریدایرکت دائمی (کد وضعیت HTTP 301) به کار میرود.\nRoute::permanentRedirect('/from-url', '/to-url');\n\n3- متد view برای بازگرداندن یک ویو به کار میرود و یک صفحه HTML را رندر می کند.\nنام فایل view بدون پسوند داده می شود.\nRoute::view('/welcome', 'welcome');\n// welcome -> resources/views/welcome.blade.php\nهمچنین می توانید پارامتر هایی را همراه آن ارسال کنید:\nRoute::view('/about', 'about', ['key' => 'value']);\nدر فصل های بعدی به طور مفصل درمورد view ها توضیح داده می شود.\n\n4- متد name برای نامگذاری یک مسیر استفاده میشود که به شما امکان میدهد تا به سادگی به آن مسیر ارجاع دهید.\nRoute::get('/user/profile', $action)->name('profile');\n\nroute('profile'); // domain.example/user/profile\n\n5- متد group برای گروهبندی روتها و استفاده از تنظیمات مشترک بین آنها به کار میرود.\nRoute::group(['prefix' => 'admin'], function () {\n Route::get('/dashboard', $action);\n});\n\n6- متد domain برای تعریف روتهای وابسته به یک دامنه خاص استفاده میشود.\nRoute::domain('api.example.com')->group(function () {\n Route::get('/users', function () {\n // api.example.com/users\n });\n // ...\n});\n\n7- متد prefix برای اضافه کردن پیشوند به یک گروه از روتها به کار میرود.\nRoute::prefix('admin')->group(function () {\n Route::get('/users', function () {\n // domain.example/admin/users\n });\n // ...\n});\n\n8- متد fallback برای تعریف مسیری استفاده میشود که در صورتی که هیچ یک از روتها مطابقت نداشته باشند، فراخوانی میشود.\nRoute::fallback(function () {\n return 404;\n});\n\n9- متد current برای بازگرداندن اطلاعات مربوط به مسیر فعلی به کار میرود.\n$currentRoute = Route::current();\n\n10- متد currentRouteName برای بازگرداندن نام مسیر فعلی به کار میرود.\n$routeAction = Route::currentRouteAction();\n\n11- متد currentRouteAction برای بازگرداندن اکشن کنترلر مربوط به مسیر فعلی به کار میرود.\n$currentRouteAction = Route::currentRouteAction();\n\nبقیه متد های روتینگ در فصل های آینده پس از آموزش پیش نیاز ها توضیح داده می شود.\n\n#laravel #فصل_۱\n@AmirhDeveloper\n.","datePublished":"2024-07-24T14:30:18Z","dateModified":"2024-07-24T14:30:18Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":157},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":12},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2}]}},{"@type":"ListItem","position":14,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/276","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/276","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/276","headline":"فصل یک - Routing بخش دوم - معرفی متد های روتینگ - قسمت دوم در ادامه معرفی متد های Routing به 9 متد دیگر از فس…","articleBody":"فصل یک - Routing\n\nبخش دوم - معرفی متد های روتینگ - قسمت دوم\n\nدر ادامه معرفی متد های Routing به 9 متد دیگر از فساد Route می پردازیم. این متد ها برای اعتبارسنجی پارامتر های داینامیک دریافتی از URL، کاربرد دارند.\nدر ادامه هر یک از این متد ها را با مثال معرفی میکنیم:\n\n1- متد where به شما امکان میدهد تا یک محدودیت سفارشی برای پارامترهای مسیر تعیین کنید. این محدودیتها بر اساس یک الگوی منظم (regex) تعریف میشوند. به عنوان مثال، میتوانید تعیین کنید که پارامتر id باید عددی باشد.\nRoute::get('user/{id}', function ($id) {\n return \"User ID: $id\";\n})->where('id', '[0-9]+');\nدر این مثال، پارامتر id باید فقط شامل اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n2- متد whereAlpha تضمین میکند که پارامترهای مشخص شده فقط حروف الفبایی باشند. یعنی پارامتر مورد نظر باید فقط شامل حروف باشد و هیچ عدد یا کاراکتر دیگری نباید در آن باشد.\nRoute::get('user/{name}', function ($name) {\n return \"User Name: $name\";\n})->whereAlpha('name');\nدر این مثال، پارامتر name باید فقط شامل حروف باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n3- متد whereAlphaNumeric پارامترها را محدود به حروف و اعداد میکند. یعنی پارامتر مورد نظر میتواند شامل حروف و اعداد باشد ولی هیچ کاراکتر خاصی نباید در آن باشد.\nRoute::get('product/{code}', function ($code) {\n return \"Product Code: $code\";\n})->whereAlphaNumeric('code');\nدر این مثال، پارامتر code باید فقط شامل حروف و اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n4- متد whereNumber پارامترها را فقط به اعداد محدود میکند. یعنی پارامتر مورد نظر باید فقط شامل اعداد باشد و هیچ حرف یا کاراکتر دیگری نباید در آن باشد.\nRoute::get('order/{id}', function ($id) {\n return \"Order ID: $id\";\n})->whereNumber('id');\nدر این مثال، پارامتر id باید فقط شامل اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n5- متد whereUlid پارامترها را محدود به ULID (Unique Lexicographically Sortable Identifier) میکند که یک نوع شناسه منحصر به فرد و مرتب شونده است.\nRoute::get('item/{ulid}', function ($ulid) {\n return \"Item ULID: $ulid\";\n})->whereUlid('ulid');\nدر این مثال، پارامتر ulid باید یک ULID معتبر باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n6- متد whereUuid پارامترها را محدود به UUID (Universally Unique Identifier) میکند.\nRoute::get('user/{uuid}', function ($uuid) {\n return \"User UUID: $uuid\";\n})->whereUuid('uuid');\nدر این مثال، پارامتر uuid باید یک UUID معتبر باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n7- متد whereIn تضمین میکند که پارامترها یکی از مقادیر تعیین شده باشند. یعنی پارامتر مورد نظر باید یکی از مقادیر مشخص شده در آرایه باشد.\nRoute::get('status/{state}', function ($state) {\n return \"Status: $state\";\n})->whereIn('state', ['active', 'inactive', 'pending']);\nدر این مثال، پارامتر state باید یکی از مقادیر active، inactive یا pending باشد، در غیر این صورت مسیر مطابقت نمیکند.\n\n8- متد pattern برای تعیین یک الگوی پیشفرض برای پارامترهای مسیر بکار می رود. این متد برای تنظیم الگوها به طور کلی برای تمام مسیرها در برنامه استفاده میشود.\nRoute::pattern('slug', '[A-Za-z0-9-]+');\n\nRoute::get('post/{slug}', function ($slug) {\n return \"Post Slug: $slug\";\n});\nاین متد یک regex را به طور کلی برای تمامی پارامتر ها با نام slug تعیین میکند. به عبارتی در تمام مسیر ها اعمال می شود و محدود به یک مسیر نیست.\n\n9- متد patterns مشابه متد pattern است با این تفاوت که می توانید چندین الگوی سفارشی برای چندین پارامتر به طور همزمان تعیین کنید.\nRoute::patterns([\n 'id' => '[0-9]+',\n 'slug' => '[A-Za-z0-9-]+',\n]);\n\nRoute::get('article/{id}/{slug}', function ($id, $slug) {\n return \"Article ID: $id, Slug: $slug\";\n});\nدر مثال بالا یک regex برای پارامتر های id و slug تعریف شده که در تمام مسیر ها اعمال می شود و محدود به یک مسیر نیست.\n\nاین روشها به شما امکان میدهند تا الگوهای پیشفرض برای پارامترهای مسیرها را تعیین کنید تا اطمینان حاصل شود که درخواستها به درستی پردازش میشوند و از دادههای نامعتبر جلوگیری شود.\n\n#laravel #فصل_۱\n@AmirhDeveloper\n.","datePublished":"2024-07-22T14:30:27Z","dateModified":"2024-07-22T14:30:27Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":28,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":185},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":3},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":28}]}},{"@type":"ListItem","position":15,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/275","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/275","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/275","headline":"فصل یک - Routing بخش دوم - معرفی متد های روتینگ - قسمت اول در این قسمت به 8 تا از پر کاربرد ترین و اصلی ترین…","articleBody":"فصل یک - Routing\n\nبخش دوم - معرفی متد های روتینگ - قسمت اول\n\nدر این قسمت به 8 تا از پر کاربرد ترین و اصلی ترین متد های موجود در فساد Route می پردازیم:\n\n1- متد get برای تعریف مسیری استفاده میشود که به درخواستهای HTTP GET پاسخ میدهد. این نوع درخواست معمولاً برای دریافت اطلاعات استفاده میشود.\nRoute::get('/users', function () {\n return 'List of users';\n});\nکد بالا به معنی این است که اگر درخواستی را با متد GET به آدرس domain.example/users بدهیم، تابع ناشناس داده شده به متد(اکشن) اجرا خواهد شد.\n\nحال فرض کنید میخواهیم مسیری ایجاد کنیم که اطلاعات یک کاربر خاص را بر اساس شناسه (ID) او نمایش دهد. در این صورت، میتوانیم از پارامترهای داینامیک استفاده کنیم:\nRoute::get('/user/{id}', function ($id) {\n return \"User ID is $id\";\n});\nدر اینجا، {id} یک پارامتر داینامیک است که میتواند هر مقداری باشد. این مقدار از URL استخراج شده و به تابع بسته میشود.\nتوجه داشته باشید که پارامتر id یک پارامتر اجباری است و درصورتی که در url وارد نشود route ما اجرا نخواهد شد.\n\nبرای پارامتر های اختیاری می توان به صورت زیر عمل کرد:\nRoute::get('/user/{id?}', function ($id = 0) {\n if ($id == 0){\n return \"Hello!\";\n }\n return \"User ID is $id\";\n});\nپارامتر {id?} یک پارامتر اختیاری است و حتی اگر آن را وارد نکنیم route ما اجرا خواهد شد، اما توجه داشته باشید که مقدار پیشفرض آن را در اکشن تعریف نمایید.\n\nپارامتر های داینامیک برای تمامی متد ها در دسترس هستند.\n\n2- متد post برای تعریف مسیری استفاده میشود که به درخواستهای HTTP POST پاسخ میدهد. این نوع درخواست معمولاً برای ارسال داده به سرور و ایجاد منابع جدید استفاده میشود.\n\nRoute::post('/users', function () {\n return 'User created';\n});\n\n3- متد put برای تعریف مسیری استفاده میشود که به درخواستهای HTTP PUT پاسخ میدهد. این نوع درخواست معمولاً برای بهروزرسانی کامل یک منبع موجود استفاده میشود.\nRoute::put('/users/{id}', function ($id) {\n return 'User ' . $id . ' updated';\n});\n\n4- متد patch برای تعریف مسیری استفاده میشود که به درخواستهای HTTP PATCH پاسخ میدهد. این نوع درخواست معمولاً برای بهروزرسانی جزئی یک منبع موجود استفاده میشود.\nRoute::patch('/users/{id}', function ($id) {\n return 'User ' . $id . ' partially updated';\n});\n\n5- متد delete برای تعریف مسیری استفاده میشود که به درخواستهای HTTP DELETE پاسخ میدهد. این نوع درخواست معمولاً برای حذف یک منبع موجود استفاده میشود.\nRoute::delete('/users/{id}', function ($id) {\n return 'User ' . $id . ' deleted';\n});\n\n6- متد options برای تعریف مسیری استفاده میشود که به درخواستهای HTTP OPTIONS پاسخ میدهد. این نوع درخواست برای بازگشت اطلاعاتی در مورد ارتباطات مجاز برای یک منبع خاص استفاده میشود.\nRoute::options('/users', function () {\n return ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];\n});\n\n7- متد any برای تعریف مسیری استفاده میشود که به تمامی انواع درخواستهای HTTP پاسخ میدهد. این نوع مسیر معمولاً برای مسیرهایی استفاده میشود که باید به تمامی درخواستها پاسخ دهند.\nRoute::any('/contact', function () {\n return 'Contact form';\n});\n\n 8- متد match به شما اجازه میدهد تا یک مسیر را برای چندین نوع درخواست HTTP تعریف کنید. این متد زمانی مفید است که میخواهید یک مسیر خاص به چندین متد HTTP مانند GET و POST پاسخ دهد.\nRoute::match(['get', 'post'], '/contact', function () {\n //\n});\nاین متد برخلاف سایر متد های توضیح داده شده یک پارامتر اضافه تر حاوی آرایه ای از متدهای مجاز را در ابتدا دریافت می کند و پس از آن مانند سایر متد ها عمل میکند.\n\n#laravel #فصل_۱\n@AmirhDeveloper\n.","datePublished":"2024-07-21T14:44:08Z","dateModified":"2024-07-21T14:44:08Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":186},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":12},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":4}]}},{"@type":"ListItem","position":16,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/274","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/274","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/274","headline":"فصل یک - Routing بخش اول - روتینگ چیست؟ مسیریابی (Routing) یکی از مهمترین و پایهایترین قابلیتها به شمار م…","articleBody":"فصل یک - Routing\n\nبخش اول - روتینگ چیست؟\n\nمسیریابی (Routing) یکی از مهمترین و پایهایترین قابلیتها به شمار میآید که امکان مدیریت درخواستهای ورودی به برنامه را فراهم میکند. مسیریابی در واقع تعیین میکند که درخواستهای کاربران به کدام قسمت از برنامه ارسال شوند و چه عملیاتی روی آنها انجام شود. به عبارت دیگر، مسیریابی مسئولیت اتصال URLهای مختلف به کنترلرها و اکشنهای مشخصی را بر عهده دارد.\n\nهر مسیر میتواند به یک کنترلر یا یک کلوژر اشاره کند. همچنین، امکان تعریف مسیرهای پویا با استفاده از پارامترهای مسیریابی نیز وجود دارد که این قابلیت، انعطافپذیری بیشتری به برنامه میبخشد.\n\nچندین فایل اصلی برای مدیریت مسیرها وجود دارد که هر کدام کاربرد خاص خود را دارند. این فایلها در دایرکتوری routes قرار دارند و به شما این امکان را میدهند که مسیرهای مختلف برنامه خود را سازماندهی و مدیریت کنید. در ادامه توضیح مختصری از هر فایل ارائه میشود:\n\n1- web.php\nاین فایل برای تعریف مسیرهای وب استفاده میشود. مسیرهای تعریف شده در این فایل معمولاً به کنترلرهایی متصل میشوند که صفحات وب را رندر میکنند. \nRoute::get('/', function () {\n return view('welcome');\n});\n\n2- api.php\nاین فایل برای تعریف مسیرهای API استفاده میشود. این مسیرها معمولاً برای ارائه داده به برنامههای فرانتاند یا سایر سرویسها استفاده میشوند.\nRoute::get('/', function () {\n return response()->json([\"hello\"]);\n});\n\n3- console.php\nاین فایل برای تعریف فرمانهای کنسول (artisan commands) استفاده میشود. شما میتوانید فرمانهای کنسول خود را در این فایل تعریف کنید که از طریق خط فرمان قابل اجرا هستند. این فرمانها به شما اجازه میدهند تا کارهای مختلفی مانند پاکسازی دیتابیس یا ایجاد کاربران نمونه را انجام دهید.\nArtisan::command('inspire', function () {\n $this->comment(Inspiring::quote());\n})->describe('Display an inspiring quote');\n\n4- channels.php\nاین فایل برای تعریف کانالهای بروزرسانی لحظهای (broadcasting channels) استفاده میشود. این کانالها برای ارسال پیامها و دادهها به صورت لحظهای به مرورگرهای وب یا سایر سرویسها استفاده میشوند. شما میتوانید دسترسی به کانالها را در این فایل کنترل کنید.\nBroadcast::channel('order.{orderId}', function ($user, $orderId) {\n return $user->id === Order::find($orderId)->user_id;\n});\n\nدر این فصل تنها با route های web و api آشنا می شویم.\n\nمتد های Route از کلاس خاصی(Facade-فَساد) با نام Route در دسترس هستند.\nuse Illuminate\\Support\\Facades\\Route;\n\nدر فساد Route متد های متعددی وجود دارد که به تمامی آنها خواهیم پرداخت. اما برخی در این فصل توضیح داده می شود و برخی دیگر در فصل های آینده.\n\n#laravel #فصل_1\n@AmirhDeveloper\n.","datePublished":"2024-07-20T14:45:06Z","dateModified":"2024-07-20T14:45:06Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":7,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":201},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":13},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":4},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7}]}},{"@type":"ListItem","position":17,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/273","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/273","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/273","headline":"▫️ فصل صفر - مقدمات 🔴🔴🔴 ◀️بخش سوم - ساختار پوشهها در لاراول : پروژه لاراول دارای ساختار پوشهای منظم و مشخصی…","articleBody":"▫️ فصل صفر - مقدمات \n🔴🔴🔴\n ◀️بخش سوم - ساختار پوشهها در لاراول :\n\nپروژه لاراول دارای ساختار پوشهای منظم و مشخصی است. در ادامه، به توضیح مختصر هر یک از پوشهها و فایلهای مهم میپردازیم:\n \n📂 app/\nشامل کدهای اصلی برنامه است. این پوشه شامل زیرپوشههای مدلها (Models)، کنترلرها (Controllers)، میانافزارها (Middleware) و غیره میباشد.\n\n📂 bootstrap/\nشامل فایلهای بوتاسترپینگ برنامه (مانند بوت کردن ServiceProviderها و MiddleWareها) و تنظیمات اولیه است.\n\n📂 config/\nشامل فایلهای تنظیمات برنامه است.\n\n📂 database/\nشامل فایلهای مرتبط با پایگاه داده مانند مایگریشن ها (Migrations)، Factory ها و Seeder ها می باشد.\n\n📂 public/\nشامل فایلهای عمومی قابل دسترسی از طریق وب است. فایلهای CSS، JavaScript، تصاویر و فایل اصلی index.php در این پوشه قرار دارند.\n\n📂 resources/\nشامل منابع برنامه مانند ویوها (views)، فایلهای زبان و فایلهای استاتیک است.\n\n📂 routes/\nشامل فایلهای مربوط به مسیریابی برنامه است.\n\n📂 storage/\nشامل فایلهای ذخیرهسازی مانند لاگها، کشها و فایلهای آپلود شده است.\n\n📂 tests/\nشامل تستهای واحد و یکپارچهسازی برنامه است.\n\n📂 vendor/\nشامل کتابخانهها و پکیجهای نصب شده توسط Composer است.\n🔴🔴🔴\n ◀️بخش چهارم - تنظیمات اولیه :\n\nلاراول امکان تنظیمات مختلف برای محیطهای کاری مختلف (مثل توسعه، تست، و تولید) را فراهم میکند. فایل تنظیمات اصلی .env نام دارد و در ریشه پروژه قرار دارد. \nدر این فایل، میتوانید تنظیمات مربوط به پایگاه داده، سرور ایمیل، کش و سایر تنظیمات محیطی را تعیین کنید.\n\nبا تغییر مقدار APP_ENV میتوانید محیط کاری را تغییر دهید. مقادیر معمول برای این متغیر عبارتند از:\n\n local (توسعه)،\n production (تولید)،\n staging (آزمایش)،\n\nهمچنین، میتوانید تنظیمات خاصی را برای هر محیط در فایلهای تنظیمات موجود در پوشه config/ مشخص کنید.\n\nبا استفاده از فایلهای تنظیمات و ساختار پوشهای منظم، لاراول به توسعهدهندگان امکان میدهد برنامههای وب پیچیده و قدرتمندی را به سرعت و با کیفیت بالا توسعه دهند.","datePublished":"2024-07-19T17:23:30Z","dateModified":"2024-07-19T17:23:30Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":249},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":16},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":18,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/272","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/272","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/272","headline":"▫️ فصل صفر - مقدمات 🔴🔴🔴 ◀️بخش اول - معرفی لاراول: لاراول یک فریمورک PHP متنباز و قدرتمند است که برای توسعه…","articleBody":"▫️ فصل صفر - مقدمات\n🔴🔴🔴\n ◀️بخش اول - معرفی لاراول:\n\nلاراول یک فریمورک PHP متنباز و قدرتمند است که برای توسعه برنامههای وب طراحی شده است. \nلاراول از ساختار MVC پیروی میکند که به توسعهدهندگان امکان میدهد کدهای خود را به صورت منظم و خوانا سازماندهی کنند.\nاین فریمورک همچنین با اصول SOLID و برنامهنویسی شیگرا (OOP) هماهنگ است، که به افزایش قابلیت نگهداری و توسعهپذیری کد کمک میکند.\nاین فریمورک ابزارها و قابلیتهای بسیاری را برای تسهیل فرآیند توسعه ارائه میدهد، از جمله:\n\nRouting : سیستم مسیریابی قدرتمند برای مدیریت درخواستهای وب.\n\nEloquent ORM : سیستم ORM پیشرفته برای تعامل با پایگاه داده به صورت شیءگرا.\n\nArtisan Console : رابط خط فرمان برای اجرای دستورات و وظایف مختلف.\n\nMiddleware : مکانیزمی برای فیلتر کردن درخواستها و پاسخها.\n\nQueues : پشتیبانی از صفها برای مدیریت کارهای پسزمینه.\n\nلاراول به دلیل سهولت استفاده، مستندات جامع، و جامعه کاربری بزرگ، به یکی از محبوبترین فریمورکهای PHP تبدیل شده است.\n\n🔴🔴🔴\n ◀️بخش دوم - نصب و راهاندازی لاراول:\n\nبرای نصب و راهاندازی لاراول، ابتدا باید اطمینان حاصل کنید که سرور شما از نیازمندیهای لاراول پشتیبانی میکند. نیازمندیهای اصلی لاراول عبارتند از:\n\n- PHP >= 7.2.5\n- BCMath, Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML PHP Extensions\n\nبرای نصب لاراول، میتوانید از Composer استفاده کنید. Composer یک ابزار مدیریت وابستگیها در PHP است. برای نصب Composer به سایت getcomposer.org مراجعه کرده و دستورالعملهای نصب را دنبال کنید.\n\nپس از نصب Composer، میتوانید لاراول را با استفاده از دو روش زیر نصب کنید:\ncomposer create-project laravel/laravel myproject\nیا\ncomposer global require laravel/installer\nlaravel new myproject\n\nبا اجرای این دستور، یک پروژه جدید لاراول در پوشهای به نام myproject ایجاد میشود.\n پس از اتمام نصب، میتوانید وارد پوشه پروژه شده و سرور توسعه لاراول را با دستور زیر اجرا کنید:\ncd myproject\nphp artisan serve\n\nسرور توسعه لاراول به صورت پیشفرض روی پورت 8000 اجرا میشود و میتوانید با مراجعه به آدرس http://localhost:8000 برنامه خود را مشاهده کنید.","datePublished":"2024-07-18T11:33:33Z","dateModified":"2024-07-18T11:33:33Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":13,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":276},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":3},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":13}]}},{"@type":"ListItem","position":19,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/271","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/271","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/271","headline":"درود به همه قصد نوشتن یک دوره آموزشی جامع و کامل برای فریمورک قدرتمند لاراول رو دارم. این دوره به صورت گام ب…","articleBody":"درود به همه\n\nقصد نوشتن یک دوره آموزشی جامع و کامل برای فریمورک قدرتمند لاراول رو دارم. این دوره به صورت گام به گام و از مباحث پایه شروع شده و به تدریج به مباحث پیشرفتهتر میپردازه، و هر چیزی از لاراول رو قراره پوشش بده.\n\nمناسب برای همه، حتی کسانی که هیچ آشنایی قبلی با لاراول ندارند. تنها پیشنیاز این دوره، آشنایی با زبان PHP و معماری MVC است.\n\nسرفصلهای این دوره:\n\nفصل 0: مقدمات\n1- معرفی لاراول\n2- نصب و راهاندازی لاراول\n3- ساختار پوشهها و فایلها در لاراول\n4- تنظیمات اولیه و محیطهای کاری\n\nفصل 1: Routing\n1- معرفی متد های روتینگ\n2- میدلورها \n\nفصل 2: Controllers\n1- ایجاد و استفاده از کنترلرها\n2- متدهای کنترلر\n3- کنترلرهای Resource\n4- کنترلرهای API\n5- Dependency Injection در کنترلرها\n\nفصل 3: Views\n1- موتور قالبسازی Blade\n2- ساختار و سینتکس Blade\n3- شامل کردن ویوها و کامپوننتها\n4- مدیریت دادهها در ویوها\n\nفصل 4: مدلها و Eloquent ORM\n1- معرفی Eloquent\n2- تعریف مدلها\n3- ارتباطات بین مدلها (Relations)\n4- کوئری بیلدر (Query Builder)\n5- Accessors و Mutators\n6- Scopes\n\nفصل 5: Migrations and Database\n1- تعریف و اجرای Migrationها\n2- Seeders و Factories\n3- کار با دیتابیسها و ارتباطات\n\nفصل 6: فرمها و اعتبارسنجی\n1- ساخت و پردازش فرمها\n2- اعتبارسنجی درخواستها\n3- پیامهای خطا و مدیریت آنها\n\nفصل 7: Services و Dependency Injection\n1- Service Container\n2- سرویسها و Providers\n3- Facades\n\nفصل 8: امنیت (Security)\n1- احراز هویت (Authentication)\n2- مجوزها (Authorization)\n3- رمزنگاری (Encryption)\n4- جلوگیری از CSRF و XSS\n\nفصل 9: تست و Debugging\n1- معرفی ابزارهای تست لاراول\n2- Unit Testing\n3- Integration Testing\n4- Debugging و خطایابی\n\nفصل 10: Optimization and Performance\n1- کشینگ (Caching)\n2- Queues و Background Jobs\n3- بهینهسازی کوئریها\n4- استفاده از Octane\n\nفصل 11: توسعه پیشرفته\n1- Package Development\n2- توسعه RESTful API\n3- استفاده از رویدادها (Events) و Listenerها\n4- مدیریت فایلها و Storage\n\nفصل 12: بررسی هسته لاراول\n1- ساختار هسته لاراول\n2- بررسی و توضیح کلاسهای کلیدی\n3- بررسی چرخه درخواست (Request Lifecycle)\n\nلطفا هرگونه کمبود یا ایراد در سرفصل هارو اعلام کنید تا شروع کنیم.","datePublished":"2024-07-16T22:46:44Z","dateModified":"2024-07-16T22:46:44Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":37,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":645},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":13},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":37}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/269","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/269","mainEntityOfPage":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper/posts/269","headline":"دوستان عزیز 🌟 من مدت زیادی هست که با عشق و علاقه در کانال Start Unity فعالیت میکنم و آموزشهای متنی و کدهای…","articleBody":"دوستان عزیز 🌟\n\nمن مدت زیادی هست که با عشق و علاقه در کانال Start Unity فعالیت میکنم و آموزشهای متنی و کدهای یونیتی رو با شما به اشتراک میگذارم. از حمایتهای شما بسیار ممنونم. \n\nاما برای اینکه کانال بتونه رشد بیشتری داشته باشه و بتونم مطالب بیشتری براتون آماده کنم، به حمایتهای شما نیاز دارم. خواهشمندم که پستهای کانال رو با دوستان و همکارانتون به اشتراک بذارید تا اعضای کانال افزایش پیدا کنه. \n\nهمچنین میخواهم از دوست عزیزم که کانال رو بوست کرد، تشکر ویژه کنم. حمایت تو برای من بسیار ارزشمنده ❤️\n\nبه عنوان تشکر از حمایتهای شما، در آینده قصد دارم آموزشهای ویدیویی یونیتی هم بسازم و در کانال قرار بدم.\n\nاز همراهی و حمایتهای شما بسیار سپاسگزارم. با هم میتونیم این کانال رو به یکی از بهترین منابع آموزشی یونیتی تبدیل کنیم 🚀","datePublished":"2024-06-23T16:06:54Z","dateModified":"2024-06-23T16:06:54Z","author":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"publisher":{"@type":"Organization","name":"| AmirHossein |","url":"https://telemetr.io/ar/channels/1851033546-amirhdeveloper","image":"https://img.telemetr.io/c/21gKnM/5933641746745506063?ty=x"},"commentCount":7,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":356},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7}],"sharedContent":{"@type":"SocialMediaPosting","datePublished":"2024-06-23T16:05:07Z"}}}]}فصل سه - Views
بخش سوم - کامپوننت ها - قسمت اول
کامپوننتها، ابزارهایی قدرتمند برای تسهیل توسعه رابط کاربری (UI) در برنامههای وب هستند. کامپوننتها به شما این امکان را میدهند که بخشهای کوچکی از رابط کاربری را به صورت مجزا ایجاد و مدیریت کنید، که این باعث میشود کدهای شما تمیزتر و قابل نگهداریتر باشند.
کامپوننتها قطعات قابل استفاده مجدد از کد هستند که شامل HTML و منطق لازم برای ایجاد بخشی از رابط کاربری میشوند. این کامپوننتها میتوانند دادهها را از والدین خود دریافت کنند و میتوانند به راحتی در بخشهای مختلف پروژه استفاده شوند.
کامپوننتها در لاراول معمولاً از دو بخش تشکیل میشوند:
1- بخش HTML: که ساختار رابط کاربری را تعریف میکند.
2- بخش منطقی (Logic): که میتواند شامل متدها و دادههایی باشد که برای تولید HTML مورد نیاز است. این بخش به طور معمول در کلاسهای PHP تعریف میشود.
کامپوننتها میتوانند به سادگی در فایلهای Blade فراخوانی شوند. برای مثال، اگر یک کامپوننت به نام alert دارید، میتوانید آن را به این صورت فراخوانی کنید:
<x-alert type="danger" :message="This is a danger alert" />
این فراخوانی، کامپوننت مربوطه را به همراه دادههایی که به آن ارسال شده است، در صفحه نمایش میدهد.
لاراول دو نوع کامپوننت ارائه میدهد:
کامپوننتهای کلاس محور (Class-based Components) و کامپوننتهای بدون کلاس (Anonymous Components).
کامپوننتهای کلاس محور شامل یک فایل PHP کلاس برای مدیریت منطق هستند، در حالی که کامپوننتهای بدون کلاس تنها به یک فایل Blade برای نمایش متکی هستند و منطق پیچیدهای ندارند.
برای ساخت کامپوننت های کلاس محور میتوان از دستور زیر استفاده کرد:
php artisan make:component Alert
این دستور یک کامپوننت با نام Alert ایجاد می کند که شامل یک کلاس در app/View/Components و یک فایل View در resources/views/components می باشد.
برای ساخت کامپوننت های بدون کلاس یا ناشناس می توانید از دستور زیر استفاده کنید:
php artisan make:component input --view
این دستور تنها یک فایل View در resources/views/components ایجاد می کند.
همچنین می توانید کامپوننت ها را در فولدر های تو در تو ایجاد کنید:
# Class-based Components
php artisan make:component Forms/Input
# app/View/Components/Forms/Input.php
# resources/views/components/forms/input.blade.php
# Anonymous Components
php artisan make:component forms.input --view
# resources/views/components/forms/input.blade.php
همچنین برای فراخوانی کامپوننت از فولدر های خاص:
<x-forms.input />
حال که کامپوننت خود را ایجاد کرده اید، کافی است کد های HTML خود را درون فایل View کامپوننت بنویسید و با فراخوانی کاپوننت آنها را نمایش دهید:
// resources/views/components/alert.blade.php
<div class="alert alert-success">
This is an alert componnet!
</div>
و برای فراخوانی آن:
// Another View file in another world
<x-alert />
#laravel #فصل_۳
@AmirhDeveloperفصل سه - Views
بخش دوم - آشنایی با دستورات Blade - قسمت چهارم
1- دستور once:
این دستور برای تنها یک بار اجرای محتوای داخل آن استفاده میشود. حتی اگر در یک حلقه باشد، محتوای آن تنها یک بار اجرا میشود.
@once
<p>This will be displayed only once.</p>
@endonce
2- دستور stack:
برای نمایش محتوای انباشته شده در یک بخش خاص با استفاده از دستور @push.
<head>
@stack('scripts')
</head>
3- دستور push:
برای افزودن محتوایی به یک بخش خاص استفاده میشود. این محتوا در بخش تعریف شده با دستور @stack نمایش داده میشود.
// Childe File:
@push('scripts')
<script src="/example.js"></script>
@endpush
// Parent File:
<head>
@stack('scripts')
</head>
4- دستور pushOnce:
مشابه @push است اما تضمین میکند که محتوای اضافه شده تنها یک بار نمایش داده شود، حتی اگر چندین بار @pushOnce استفاده شده باشد.
@pushOnce('scripts')
<script src="/example.js"></script>
@endpushOnce
5- دستور pushIf:
ترکیبی از @push و شرایط است که اگر شرط برقرار باشد، محتوای آن به بخش مربوطه اضافه میشود.
@pushIf($condition, 'scripts')
<script src="/example.js"></script>
@endpushIf
6- دستور prepend:
برای اضافه کردن محتوای جدید به ابتدای یک بخش خاص.
// Childe File:
@prepend('scripts')
<script src="/first.js"></script>
@endprepend
// Parent File:
<head>
@stack('scripts')
</head>
7- دستور inject:
برای تزریق یک سرویس یا متغیر به یک نمای Blade.
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}
</div>
8- دستور each:
برای رندر کردن یک نما برای هر آیتم در یک مجموعه.
@each('view.name', $items, 'item', 'view.empty')
view.name : نمایی که باید برای هر آیتم رندر شود.
$items : مجموعهای از آیتمها.
item : نام متغیری که هر آیتم به آن ارجاع داده میشود.
view.empty : نمایی که باید نمایش داده شود اگر مجموعه خالی باشد.
9- دستور required:
برای تنظیم ویژگی required یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @required(true)>
10- دستور readonly:
برای تنظیم ویژگی readonly یک عنصر HTML به صورت شرطی.
<input type="text" name="name" @readonly(true)>
11- دستور disabled:
برای تنظیم ویژگی disabled یک عنصر HTML به صورت شرطی.
<button type="submit" @disabled(true)>Submit</button>
12- دستور selected:
برای تنظیم ویژگی selected یک گزینه در یک منوی انتخابی به صورت شرطی.
<select name="options">
<option value="1" @selected($value == 1)>Option 1</option>
<option value="2" @selected($value == 2)>Option 2</option>
</select>
13- دستور checked:
برای تنظیم ویژگی checked یک چکباکس یا رادیو باتن به صورت شرطی.
<input type="checkbox" name="agree" @checked(true)>
14- دستور style:
برای اضافه کردن ویژگی style به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @style(['display: none' => $isHidden])>
Content
</div>
// unconditionally
<div @style(['display: none'])>
Content
</div>
15- دستور class:
برای اضافه کردن کلاس CSS به یک عنصر HTML به صورت شرطی یا بدون شرط.
// conditional
<div @class(['hidden' => $isHidden])>
Content
</div>
// unconditionally
<div @class(['hidden'])>
Content
</div>
#laravel #فصل_۳
@AmirhDeveloper
.فصل سه - Views
بخش دوم - آشنایی با دستورات Blade - قسمت سوم
1- دستور csrf:
این دستور برای تولید یک توکن CSRF استفاده میشود که به محافظت از فرمهای شما در برابر حملات CSRF کمک میکند.
<form method="" action="">
@csrf
...
</form>
2- دستور method:
این دستور برای تعریف متد HTTP فرمها در صورت استفاده از روشهای غیر از GET و POST مانند PUT یا DELETE استفاده میشود.
<form method="POST" action="">
@csrf
@method('PUT')
...
</form>
3- دستور error:
این دستور برای نمایش پیامهای خطا استفاده میشود. معمولاً در فرمها برای نمایش خطاهای اعتبارسنجی به کار میرود.
<form method="POST" action="">
@csrf
@error('name')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</form>
4- دستور use:
این دستور برای use کردن کلاس ها، کانستنت ها و... استفاده می شود.
@use('App\Models\Flight')
5- دستور php:
این دستور برای اجرای کد PHP درون قالب Blade استفاده میشود.
@php
$name = 'John Doe';
@endphp
<p>Hello, {{ $name }}</p>
6- دستور env:
این دستور برای بررسی محیط فعلی برنامه استفاده میشود.
@env('local')
<p>You're in the local environment.</p>
@endenv
7- دستور production:
این دستور به شما امکان میدهد تا کدهایی را فقط در محیط تولید اجرا کنید.
@production
<p>This code runs only in the production environment.</p>
@endproduction
8- دستور verbatim:
این دستور برای جلوگیری از پردازش دستورات Blade در داخل بلوکهای HTML استفاده میشود.
@verbatim
<div class="example">
This is a Blade directive: {{ $name }}
</div>
@endverbatim
کد های درون این دستور توسط Blade تفسیر نخواهند شد و به همان شکل نمایش داده می شوند.
همچنین با قرار دادن یک @ اضافه قبل از دستورات Blade از تفسیر آن ها جلوگیری می شود:
@@if()
// HTML Output:
@if()
9- دستور fragment:
این دستور به شما امکان میدهد که یک بخش از کد را در یک نام خاص بستهبندی کنید و در جای دیگر فقط آن قطعه را رندر کنید.
// Blade File:
@fragment('user-list')
<ul>
<li>Item 1</li>
</ul>
@endfragment
// Controller File:
return view('dashboard'])->fragment('user-list');
10- دستورات disk، elsedisk، unlessdisk:
این دستور برای اجرای یک بلوک کد تنها در صورتی که دیسک مشخص شده موجود باشد استفاده میشود.
@disk('s3')
<p>The S3 disk is available.</p>
@elsedisk
<p>The S3 disk is not available.</p>
@enddisk
@unlessdisk('local')
<p>The local disk is not available.</p>
@endunlessdisk
#laravel #فصل_۳
@AmirhDeveloper
.فصل سه - Views
بخش دوم - آشنایی با دستورات Blade - قسمت دوم
1- دستور include:
این دستور برای درج یک ویو (view) دیگر در ویوی فعلی استفاده میشود، و محتویات یک فایل را درون فایل دیگر قرار می دهد.
<body>
@include('partials.header')
</body>
اگر فایل partials/header.blade.php وجود داشته باشد، محتویات آن در محل استفاده از @include درج خواهد شد.
2- دستور includeIf:
این دستور همانند @include عمل میکند، با این تفاوت که اگر ویو مورد نظر وجود نداشته باشد، خطایی رخ نمیدهد و دستور به سادگی نادیده گرفته میشود.
<body>
@includeIf('partials.header')
</body>
3- دستور includeWhen:
این دستور برای درج یک ویو در شرایط خاص استفاده میشود. این دستور دو پارامتر میگیرد: یک شرط و نام ویو.
// $showHeader = true;
<body>
@includeWhen($showHeader, 'partials.header')
</body>
4- دستور includeUnless:
این دستور برعکس @includeWhen عمل میکند، یعنی ویو را زمانی درج میکند که شرط برقرار نباشد.
// $hideHeader = false;
<body>
@includeUnless($hideHeader, 'partials.header')
</body>
5- دستور includeFirst:
این دستور برای درج اولین ویو موجود در لیست ویوهای داده شده استفاده میشود. این دستور یک آرایه از نام ویوها را به عنوان پارامتر دریافت میکند.
<body>
@includeFirst(['custom.header', 'partials.header'])
</body>
در این مثال، اگر ویوی custom.header وجود داشته باشد، درج میشود و اگر وجود نداشته باشد، ویوی partials.header درج میشود.
6- دستور section:
این دستور برای تعریف یک بخش (section) از قالب استفاده میشود که میتواند در قالب اصلی (layout) یا قالبهای فرزند مورد استفاده قرار گیرد.
@section('content')
<p>This is the content section.</p>
@endsection
این دستور به تنهایی کاربرد ندارد و نیازمند دستور yield نیز می باشد(مورد بعدی).
7- دستور yield
این دستور برای نمایش محتوای یک بخش در قالب اصلی (layout) استفاده میشود.
<body>
@yield('content')
</body>
این دستور سکشن content که بالاتر تعریف کرده ایم را نمایش می دهد.
8- دستور sectionMissing:
این دستور بررسی میکند که آیا یک section در ویو فعلی تعریف نشده است. اگر آن بخش تعریف نشده باشد، کد داخل sectionMissing اجرا میشود. و درصورتی که تعریف شده باشد محتوای sectionMissing نادیده گرفته می شود و محتوای section نمایش داده می شود.
@sectionMissing('sidebar')
<div class="sidebar">
<p>This is the default sidebar content.</p>
</div>
@endsectionMissing
9- دستور hasSection:
این دستور بررسی میکند که آیا یک section مشخص در ویو فعلی تعریف شده است یا نه. این دستور به شما امکان میدهد که بر اساس وجود یا عدم وجود یک بخش، رفتار خاصی را در قالب خود اعمال کنید.
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
@endif
10- دستور extends:
این دستور برای تعریف اینکه یک ویو از کدام قالب (layout) ارثبری میکند استفاده میشود.
// resources/views/welcome.blade.php
@extends('layouts.app') //layouts/app.blade.php
@section('header')
<h1>Header Section in Child View</h1>
@endsection
این دستور برای ارثبری از قالب اصلی استفاده شده است. سپس با استفاده از دستورات section، محتوای هر بخش در قالب اصلی که از آن ارث بری شده جایگذاری شده است.
در واقع یک فایل مادر وجود دارد که در فایل های فرزند extends می شود و گسترش می یابد.
نمایی از فایل layouts/app.blade.php یا همان فایل مادر:
// resources/views/layouts/app.blade.php
<body>
<header>
@yield('header')
</header>
</body>
همانطور که مشخص است، yield سکشن header در فایل مادر انجام شده در صورتی که سکشن header در فایل فرزند تعریف شده و با استفاده از extends فایل مادر در فایل فرزند، هر دو به هم مرتبط شده اند.
11- دستور show:
این دستور برای پایان دادن به یک بخش و همزمان نمایش محتوای آن استفاده میشود. این دستور معمولاً زمانی استفاده میشود که بخشی از قالب بخواهد محتوای بخش خود را قبل از پایان قالب فعلی نمایش دهد.
@section('sidebar')
<p>This is the sidebar.</p>
@show
#laravel #فصل_۳
@AmirhDeveloper
.فصل سه - Views
بخش دوم - آشنایی با دستورات Blade - قسمت اول
همانطور که در قسمت های قبل گفته شد View ها یا فایل های نمایشی مثل فایل های HTML در پوشه resources/views قرار می گیرند و فرمت آنها .blade.php می باشد.
با اجرای دستور زیر می توانید یک فایل view ایجاد کنید:
php artisan make:view greeting
دستور بالا یک فایل با فرمت .blade.php را در مسیر resources/views با نام greeting ایجاد می کند. همچنین می توانید این عمل را به صورت دستی انجام دهید.
در لاراول به واسطه موتور قالب سازی Blade به جای نوشتن مستقیم کد های PHP از دستورات Blade استفاده می کنیم تا ساختار تمیزتر، ساده تر و خواناتری داشته باشیم.
در ادامه با دستورات Blade آشنا می شویم:
1- دستور {{ x }} و {!! x !!}
از {{ }} برای چاپ محتوای متغیرها و دادهها در فایلهای قالب استفاده میشود. این نوع استفاده معمولاً برای جلوگیری از حملات XSS (Cross-Site Scripting) است و محتوای داخل {{ }} به صورت امن نمایش داده میشود.
<h1>Hello, {{ $name }}!</h1>
م.تور Blade به صورت پیشفرض دادههای داخل {{ }} را escape میکند. این به این معنی است که هر محتوایی که شامل کاراکترهای ویژه HTML باشد به صورت امن نمایش داده میشود.
اگر میخواهید دادهای را بدون escape کردن نمایش دهید، میتوانید از سه علامت تعجب {{{ }}} یا تابع {!! !!} استفاده کنید. اما باید خیلی مراقب باشید که این نوع استفاده ممکن است منجر به حملات XSS شود اگر دادهها به درستی اعتبارسنجی نشده باشند.
<h1>Hello, {!! $name !!}!</h1>
همچنین می توانید خروجی توابع را نیز نمایش دهید:
<p>The current UNIX timestamp is {{ time() }}.</p>
2- دستورات if، elseif، else، unless
دستورات بالا همانند دستورات شرطی PHP عمل میکنند.
@if ($user->isAdmin())
<p>Welcome, admin!</p>
@elseif ($user->isModerator())
<p>Welcome, moderator!</p>
@else
<p>Welcome, user!</p>
@endif
دستور @unless برای اجرای یک بلوک کد در صورتی که یک شرط برقرار نباشد، استفاده میشود. این دستور معکوس دستور @if است.
@unless ($user->isGuest())
<p>Welcome back, {{ $user->name }}!</p>
@endunless
3- دستورات isset و empty
این دستورات برای بررسی خالی بود یا تعریف شدن یک مقدار استفاده می شوند همانند توابع همان آنها در PHP.
@isset($records)
// $records is defined and is not null...
@endisset
@empty($records)
// $records is "empty"...
@endempty
4- دستورات auth و guest
برای نمایش یا عدم نمایش محتوا بر اساس وضعیت احراز هویت (authentication) کاربر استفاده میشوند. این دستورات به شما امکان میدهند تا به سادگی محتوای خاصی را برای کاربران احراز هویت شده یا کاربران مهمان (غیر احراز هویت شده) نمایش دهید.
@auth
// The user is authenticated...
@endauth
@guest
// The user is not authenticated...
@endguest
همچنین این دو دستور پارامتری که نام گارد احراز هویت می باشد را نیز دریافت میکنند تا به وسیله آن وضعیت احراز هویت را بررسی کنند.
در فصل های مربوطه با گارد ها آشنا می شویم.
@auth('admin')
...
@endauth
@guest('admin')
...
@endguest
5- دستورات switch case
این دستورات نیز همانند switch case در PHP هستند:
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
6- حلقه ها
حلقه ها در Blade نیز مانند حلقه ها در PHP نوشته می شوند:
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor
@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach
@while (true)
<p>I'm looping forever.</p>
@endwhile
دستور جدیدی با نام forelse وجود دارد تا در صورت خالی بودن متغیر شرط دیگری اجرا شود.
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse
7- دستورات continue و break
این دستورات برای کنترل حلقه ها استفاده می شوند، همچنین می توانند یک شرط برای ورودی دریافت کنند و در صورت برقرار بودن شرط اجرا شوند:
@foreach ($users as $user)
@continue($user->type == 1)
<li>{{ $user->name }}</li>
@break($user->number == 5)
@endforeach
#laravel #فصل_۳
@AmirhDeveloper
.فصل سه - Views
بخش اول - موتور قالبسازی Blade
موتور قالبسازی Blade یک سیستم قالبسازی ساده و انعطافپذیر است که به صورت پیشفرض در فریمورک لاراول استفاده میشود. این موتور قالبسازی به شما امکان میدهد تا با استفاده از سینتکس ساده و تمیز، قالبهای وبسایت خود را طراحی و مدیریت کنید. در ادامه به توضیح کامل اجزای مختلف و امکانات موتور قالبسازی Blade میپردازیم:
فایلهای Blade با پسوند .blade.php شناخته میشوند و معمولاً در دایرکتوری resources/views قرار میگیرند. به عنوان مثال:
resources/views/welcome.blade.php
بخش دوم - ساختار و سینتکس Blade
Blade از سینتکس سادهای برای جایگذاری دادهها و استفاده از دستورالعملهای کنترلی استفاده میکند.
برای نمایش دادهها در قالب Blade از دستور {{ }} استفاده میشود. به عنوان مثال:
<h1>Hello, {{ $name }}</h1>
در این مثال، مقدار متغیر $name در مکان مورد نظر جایگذاری میشود.
Blade از دستورات کنترلی مانند شرطها و حلقهها پشتیبانی میکند.
برای استفاده از شرطها از دستور @if و @endif استفاده میشود:
@if ($age >= 18)
<p>Adult</p>
@else
<p>Child</p>
@endif
همچنین می توان به همین صورت از حلقه ها نیست استفاده کرد:
@foreach ($users as $user)
<p>{{ $user->name }}</p>
@endforeach
@for($i = 0; $i <= 10; $i++)
<p>{{ $i }}</p>
@endfor
@while (true)
<p>I'm looping forever.</p>
@endwhile
Blade امکان وراثت قالبها را نیز فراهم میکند. این ویژگی به شما امکان میدهد تا یک ساختار پایه برای قالبهای خود تعریف کنید و قالبهای دیگر را از آن به ارث ببرید.
همچنین امکان تعریف کامپوننتهای قابل استفاده مجدد را فراهم میکند. به عنوان مثال، شما میتوانید یک کامپوننت برای نمایش کارتهای کاربر تعریف کنید.
شما میتوانید دادههایی را که در تمام قالبها به صورت مشترک استفاده میشوند، از طریق Service Provider ها به اشتراک بگذارید.
// app/Providers/AppServiceProvider.php
public function boot()
{
View::share('key', 'value');
}
// view.blade.php
<p>{{ $key }}</p>
از شرطهای پیچیده و حلقهها نیز پشتیبانی میکند. به عنوان مثال، شما میتوانید از حلقههای تو در تو استفاده کنید:
@foreach ($users as $user)
<h2>{{ $user->name }}</h2>
@foreach ($user->posts as $post)
<p>{{ $post->title }}</p>
@endforeach
@endforeach
نکته : در این قسمت صرفا با ساختار و کاربرد های Blade آشنا شدیم، و در قسمت های بعدی با تمام دستورات Blade، ارث بری قالب ها، ایجاد کامپوننت ها و همچنین ایجاد دستورات Blade سفارشی آشنا می شویم.
موتور قالبسازی Blade یک ابزار قدرتمند و انعطافپذیر برای مدیریت قالبهای وبسایتها در فریمورک لاراول است. با استفاده از سینتکس ساده و قابلیتهای گستردهای که ارائه میدهد، میتوانید قالبهای پویا و قابل توسعهای ایجاد کنید.
#laravel #فصل_۳
@AmirhDeveloper
.فصل دو - Controllers
بخش دوم - کنترلر های API و Dependency Injection
کنترلر های API:
کنترلرهای API بهطور خاص برای مدیریت درخواستهای API استفاده میشوند. در اینجا توضیحاتی درباره کنترلرهای API در لاراول ارائه میشود:
برای ایجاد یک کنترلر API، میتوانید از دستور زیر استفاده کنید:
php artisan make:controller Api/UserController --api
این دستور یک کنترلر جدید در مسیر app/Http/Controllers/Api ایجاد میکند که شامل متدهای پایهای مانند index, store, show, update و destroy میشود.
برای دسترسی به متدهای کنترلر API، باید مسیرهای مناسب را تعریف کنید. در فایل routes/api.php، میتوانید مسیرها را به صورت زیر تعریف کنید:
برای تعریف این مسیر ها از متد جدیدی از فساد Route استفاده می کنیم:
use App\Http\Controllers\Api\MyController;
Route::apiResource('users', MyController::class);
در صورتی که فایل api.php برای شما در پوشه routes وجود ندارد با دستور زیر آن را ایجاد کنید:
php artisan install:api
تفاوت یک کنترلر API با کنترلر Resource در این است که متد های create و edit در کنترلر API وجود ندارد، زیرا در API ها نیازی به رندر کردن View نیست.
دپندنسی اینجکشن در کنترلر ها:
دپندنسی اینجکشن (Dependency Injection) یکی از اصول مهم طراحی شیءگرا است که به شما کمک میکند وابستگیهای کلاسها را مدیریت کنید و کد قابل تست و قابل نگهداری بنویسید. در لاراول، دپندنسی اینجکشن به سادگی با استفاده از سیستم سرویس کانتینر (Service Container) این فریمورک امکانپذیر است.
نکته: درمورد سرویس کانتینر و پروایدر ها در فصل های آینده به طور مفصل توضیح داده می شود.
دپندنسی اینجکشن به این معنا است که یک کلاس به جای اینکه خودش مسئول ایجاد وابستگیهایش باشد، این وابستگیها از بیرون به آن تزریق میشوند. به عبارت دیگر، وابستگیهای یک کلاس به عنوان پارامترهای سازنده (constructor) یا متدهای دیگر به آن تحویل داده میشوند.
فرض کنید میخواهیم یک کنترلر ایجاد کنیم که برای انجام عملیاتهای مربوط به یک مخزن داده (Repository) نیاز به یک سرویس دارد.
ابتدا یک اینترفیس برای مخزن داده تعریف میکنیم:
// app/Repositories/UserRepositoryInterface.php
namespace App\Repositories;
interface UserRepositoryInterface {
public function all();
}
سپس یک پیادهسازی برای این اینترفیس ایجاد میکنیم:
// app/Repositories/UserRepository.php
namespace App\Repositories;
use App\Models\User;
class UserRepository implements UserRepositoryInterface {
public function all() {
return User::all();
}
}
باید پیادهسازی مخزن را در سرویس کانتینر لاراول ثبت کنیم تا بتوانیم آن را به کنترلر تزریق کنیم. برای این کار، از یک سرویس پروایدر استفاده میکنیم.
می توانید با دستور زیر یک پروایدر ایجاد کنید:
php artisan make:provider RepositoryServiceProvider
// app/Providers/RepositoryServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\UserRepository;
class RepositoryServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
}
}
سپس این سرویس پروایدر را به لیست پروایدرهای اپلیکیشن اضافه میکنیم:
// config/providers.php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RepositoryServiceProvider::class,
];
حالا میتوانیم این مخزن را به کنترلر تزریق کنیم:
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;
use App\Repositories\UserRepositoryInterface;
class UserController extends Controller {
protected $userRepository;
public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}
public function index() {
$users = $this->userRepository->all();
return view('users.index', compact('users'));
}
}
در این مثال، کلاس UserController وابستگی خود را به UserRepositoryInterface از طریق کانستراکتور دریافت میکند. لاراول به صورت خودکار پیادهسازی صحیح را از طریق سرویس کانتینر تزریق میکند.
#laravel #فصل_۲
@AmirhDeveloper
.فصل دو - Controllers
بخش اول - ایجاد و استفاده از کنترلرها
کنترلرها (Controllers) یکی از اجزای اصلی معماری MVC (Model-View-Controller) هستند. کنترلرها وظیفه دارند درخواستهای ورودی را مدیریت کرده و پاسخهای مناسب را به سمت کاربر ارسال کنند.
تعریف کنترلرها:
کنترلرها در لاراول فایلهایی هستند که در پوشه app/Http/Controllers قرار میگیرند و شامل کلاسهایی هستند که مسئولیت کنترل جریان درخواستها و پاسخها را بر عهده دارند. به طور کلی، کنترلرها به منظور جداسازی منطق تجاری (Business Logic) از منطق نمایش (Presentation Logic) استفاده میشوند.
ایجاد کنترلر:
برای ایجاد یک کنترلر در لاراول، میتوانید از کامند Artisan استفاده کنید. به عنوان مثال:
php artisan make:controller UserController
این دستور یک کنترلر جدید به نام UserController در پوشه app/Http/Controllers ایجاد میکند.
انواع کنترلرها:
لاراول چندین نوع کنترلر را پشتیبانی میکند:
1- کنترلرهای پایه (Plain Controllers): کنترلرهای سادهای که شامل متدهای مختلف برای مدیریت درخواستها هستند.
2- کنترلرهای منبع (Resource Controllers): کنترلرهایی که برای عملیات CRUD (ایجاد، خواندن، بهروزرسانی، حذف) بهینه شدهاند. میتوانید با استفاده از دستور زیر یک کنترلر منبع ایجاد کنید:
php artisan make:controller UserController --resource
این کنترلر شامل 7 متد پیشفرض است:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
// show users list
}
public function create()
{
// show create form
}
public function store(Request $request)
{
// store user data
}
public function show($id)
{
// show user data
}
public function edit($id)
{
// show edit form
}
public function update(Request $request, $id)
{
// update user data
}
public function destroy($id)
{
// delete user
}
}
3- کنترلرهای قابل توزیع (Singleton Controllers): کنترلرهایی که تنها یک نمونه از آنها در طول عمر درخواست ایجاد میشود.
php artisan make:controller SingletonController --invokable
نمونه کنترلر برای انجام یک عملیات:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class SingletonController extends Controller
{
public function __invoke()
{
//
}
}
مسیر دهی کنترلرها در روتینگ
برای اتصال یک route به کنترلر روش های متنوعی وجود دارد که در ادامه بررسی خواهیم کرد:
1-
Route::get("/users", "app\Http\Controllers\UserController@index");
در مثال بالا پارامتر دوم به متد index از کنترلر UserController اشاره دارد.
ابتدا نام کامل کنترلر سپس @ و بعد نام متد.
2-
use app\Http\Controllers\UserController;
Route::get("/users", [UserController::class, 'index']);
روش بالا یک روش دیگر برای فراخوانی یک متد از کنترلر است، به این صورت که در یک آرایه، اندیس صفر برابر کلاس کنترلر و اندیس یک برابر نام متد.
برای فراخوانی کنترلر های resource میتوانید از متد دیگری از فساد Route استفاده کنید.
Route::resource('users', UserController::class);
این متد به صورت خودکار 7 متد کنترلر را مسیردهی می کند.
همچنین متد دیگری از فساد Route برای کنترلر ها در دسترس است:
Route::controller(UserController::class)->group(function(){
Route::get("/users", 'index');
});
در روش بالا یک گروه برای یک کنترلر ایجاد می کنید و پس از آن تنها نام متد کنترلر را به عنوان اکشن وارد می کنید.
#laravel #فصل_۲
@AmirhDeveloper
.فصل یک - Routing
بخش چهارم - معرفی کامند های روتینگ
Artisan ابزار خط فرمانی است که به شما کمک میکند تا کارهای مختلفی را در پروژه لاراول خود انجام دهید. این کامندها به توسعهدهندگان اجازه میدهند تا به سرعت وظایف مختلفی را مانند مدیریت مسیرها، پیکربندیها، و کشها انجام دهند.
در این قسمت با کامند های مربوط به بخش روتینگ آشنا می شویم:
1-
php artisan install:api
در نسخه جدید لاراول مسیر های مربوط به API به طور پیش فرض وجود ندارد، اگر پروژه شما نیاز به API دارد با این دستور مسیر های API را ایجاد و پیکربندی کنید.
با اجرای این دستور فایل api.php در پوشه route برای شما ایجاد می شود.
همچنین Laravel Sanctum که یک پکیج برای احراز هویت و محافظ API ها می باشد به طور خودکار برای شما نصب می شود.
2-
php artisan route:list
این دستور لیستی از تمام مسیرهای ثبت شده در پروژه را نمایش میدهد. اطلاعاتی مانند HTTP Method, URL، نام مسیر و کنترلری که درخواستها را مدیریت میکند، را نمایش میدهد.
3-
php artisan route:list -v
تمامی اطلاعات پیشفرض به علاوه جزئیات بیشتری از Action، مانند نام کنترلر و متد، و میدلورهای مورد استفاده در مسیر را نمایش میدهد.
اطلاعات دقیقتر درباره namespace و گروهبندیهای اعمال شده به مسیرها نیز ممکن است نمایش داده شود.
4-
php artisan route:list -vv
تمامی اطلاعات -v به علاوه اطلاعات بیشتری درباره پارامترهای مسیر، نامهای کامل کلاسها و متدها، و جزئیات دقیقتر دیگری که ممکن است در مسیر استفاده شده باشند را نمایش میدهد.
این سطح از جزئیات میتواند شامل اطلاعات دقیقتر درباره dependency injection و هر نوع تنظیمات خاص دیگر مربوط به مسیر باشد.
5-
php artisan route:list --path=api
این کامند لیست مسیرهایی را نمایش میدهد که شامل رشته api در URL خود هستند. این میتواند برای فیلتر کردن و نمایش مسیرهای مرتبط مفید باشد.
6-
php artisan route:list --except-vendor
این کامند لیست مسیرها را به استثنای مسیرهایی که از پکیجهای vendor آمدهاند، نمایش میدهد.
7-
php artisan route:list --only-vendor
این کامند تنها مسیرهایی را نمایش میدهد که از پکیجهای vendor آمدهاند.
8-
php artisan config:publish cors
این کامند برای انتشار تنظیمات پیکربندی CORS (Cross-Origin Resource Sharing) استفاده میشود. این پیکربندیها میتواند شامل تنظیمات امنیتی برای مدیریت درخواستهای API از دامنههای مختلف باشد.
9-
php artisan route:cache
این کامند برای کش کردن (ذخیره موقت) تمامی مسیرهای ثبت شده در پروژه استفاده میشود. این کار به بهبود عملکرد برنامه کمک میکند زیرا نیاز به تحلیل دوباره مسیرها در هر درخواست کاهش مییابد.
10-
php artisan route:clear
این کامند برای پاک کردن کش مسیرها استفاده میشود. بعد از اجرای این کامند، لاراول مسیرها را دوباره از نو تحلیل و ثبت میکند.
این کامندها به توسعهدهندگان کمک میکند تا مدیریت بهتری بر روی پروژه لاراول خود داشته باشند و به راحتی بتوانند وظایف روزمره توسعه را انجام دهند.
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش سوم - میدلورها - قسمت دوم
در قسمت قبل آموختیم پس از ساخت یک میدلور، باید آن را در برنامه ثبت کنیم.
برای این کار میدلور ها را در متد withMiddleware در فایل bootstrap/app.php ثبت می کردیم:
->withMiddleware(function (Middleware $middleware) {
// $middleware->
})
متد های مختلفی از متغیر $middleware برای ثبت میدلور ها در دسترس است که به بررسی آنها خواهیم پرداخت:
1- متد use
این متد استک سراسری میدلور ها را به صورت دستی تنظیم میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->use([
TrustHosts::class,
// ...
]);
})
2- متد append
این متد یک میدلور را به آخر لیست میدلور ها اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->append(TrustHosts::class);
})
3- متد prepend
این متد یک میدلور را به اول لیست میدلور ها اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->prepend(TrustHosts::class);
})
4- متد remove
این متد یک میدلور را از لیست میدلور ها حذف میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->remove(TrustHosts::class);
})
5- متد replace
این متد یک میدلور را چایگزین میدلور موجود در استک میدلور ها می کند.
->withMiddleware(function (Middleware $middleware) {
$middleware->replace(First::class, Second:class);
})
6- متد group
این متد یک گروه از چندین میدلور را ایجاد میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->group('my-group', [
TrustHosts::class,
StartSession::class,
// ...
]);
})
// Use
Route::get('/', function () {
// ...
})->middleware('my-group');
7- متد alias
این متد یک میدلور را با نام مستعار ثبت میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'permission' => Permission::class,
]);
})
8- متد api
این متد یک میدلور را به گروه پیشفرض api اضافه/حذف/جایگزین میکند.
->withMiddleware(function (Middleware $middleware) {
// append middleware
$middleware->api(append: [
StartSession::class,
]);;
// prepend middleware
$middleware->api(prepend: [
StartSession::class,
]);;
// remove middleware
$middleware->api(remove: [
StartSession::class,
]);;
// replace middleware
$middleware->api(replace: [
First::class => Second::class,
]);;
})
9- متد web
این متد یک میدلور را به گروه پیشفرض web اضافه/حذف/جایگزین میکند.
->withMiddleware(function (Middleware $middleware) {
// append middleware
$middleware->web(append: [
StartSession::class,
]);;
// prepend middleware
$middleware->web(prepend: [
StartSession::class,
]);;
// remove middleware
$middleware->web(remove: [
StartSession::class,
]);;
// replace middleware
$middleware->web(replace: [
First::class => Second::class,
]);;
})
10- متد appendToGroup
این متد یک یا چند میدلور را به آخر یک گروه اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->appendToGroup('group-name', [
StartSession::class,
]);
})
11- متد prependToGroup
این متد یک یا چند میدلور را به اول یک گروه اضافه میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->prependToGroup('group-name', [
StartSession::class,
]);
})
12- متد removeFromGroup
این متد یک یا چند میدلور را از یک گروه حذف میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->removeFromGroup('group-name', [
StartSession::class,
]);
})
13- متد replaceInGroup
این متد یک یا چند میدلور را از یک گروه حذف میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->replaceInGroup('group-name', First::class, Second::class);
})
14- متد priority
این متد اجرای میدلور ها را الویت بندی میکند.
->withMiddleware(function (Middleware $middleware) {
$middleware->priority([
First::class,
Second::class,
Third::class,
]);
})
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش سوم - میدلورها
میدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HTTP ورودی به برنامه شما فراهم میکنند.
به عنوان مثال، لاراول یک میدلور دارد که بررسی میکند آیا کاربر وارد سیستم شده است یا خیر. اگر کاربر وارد نشده باشد، او را به صفحه ورود هدایت میکند. اما اگر وارد شده باشد، درخواست را به مسیر بعدی هدایت میکند.
لاراول شامل میدلورهای متنوعی از جمله تأیید هویت و حفاظت CSRF است.
همچنین کاربر می تواند میدلور های خود را بنویسد، تمامی میدلورهای تعریف شده توسط کاربر معمولاً در مسیر app/Http/Middleware قرار میگیرند.
ساخت میدلور اختصاصی:
برای ساخت میدلور اختصاصی، از دستور زیر در ترمینال استفاده کنید:
php artisan make:middleware {MiddlewareName}
این دستور یک میدلور با نام داده شده در مسیر app/Http/Middleware ایجاد میکند.
تمامی عملیات بررسی در متد handle انجام میشود. میتوانید شروطی را بر روی درخواستها اعمال کنید. در صورتی که شروط برقرار باشند، متد handle میدلور بعدی را فراخوانی میکند و درخواست را ادامه میدهد. در غیر این صورت، درخواست متوقف و نتیجه تغییر خواهد کرد. مثال:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
public function handle(Request $request, Closure $next)
{
if ($request->age <= 18) {
return redirect('home');
}
return $next($request);
}
}
اگر سن کاربر کمتر یا مساوی ۱۸ باشد، به صفحه خانه هدایت میشود. در غیر این صورت، درخواست ادامه پیدا میکند.
ثبت میدلور:
برای استفاده از یک میدلور اختصاصی، ابتدا باید آن را در برنامه خود ثبت کنید. برای این کار وارد فایل bootstrap/app.php شوید و دنبال بخش زیر بگردید:
->withMiddleware(function (Middleware $middleware) {
//
})
برای ثبت میدلور جدید، میتوانید متد append را از $middleware صدا بزنید و نام میدلور را به صورت کامل به آن پاس بدهید:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(CheckAge::class);
})
همچنین میتوانید یک نام مستعار برای میدلور خود ثبت کنید تا سادهتر به آن دسترسی داشته باشید:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'age' => CheckAge::class
]);
})
با سایر متد قابل دسترس از $middleware در قسمت بعدی آشنا می شویم.
استفاده از میدلور در مسیرها:
برای اعمال یک میدلور بر روی route ها با متد جدیدی از فساد Route آشنا می شویم:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware(CheckAge::class);
// Or use alias:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware('age');
متد middleware یک یا چند میدلور را بر روی یک مسیر اعمال میکند و در صورتی که شروط میدلور برقرار باشد، مسیر اجرا خواهد شد. در مثال ما، تنها در صورتی که سن بیشتر از ۱۸ باشد، مسیر اجرا خواهد شد.
غیرفعال کردن میدلور برای مسیرها:
متد دیگری از فساد Route با نام withoutMiddleware نیز در دسترس است که میدلور های داده شده را بر روی مسیر مورد نظر اجرا نخواهد کرد:
Route::withoutMiddleware([CheckAge::class])->group(function () {
Route::get('/profile', function () {
// ...
});
});
ارسال پارامتر به میدلور:
میتوانید پارامترهایی را به میدلور خود اختصاص دهید:
Route::get('profile', function () {
// Only executed if age > 20
})->middleware('age:20');
پارامترهای ورودی را میتوانید در متد handle دریافت کنید:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
public function handle(Request $request, Closure $next, $minAge)
{
if ($request->age <= $minAge) {
return redirect('home');
}
return $next($request);
}
}
در مثال بالا، یک میدلور داینامیک ایجاد کردهایم که میتوانیم هر سنی را به واسطه آن بررسی کنیم.
همچنین می توانید پارامتر های بیشتری را ارسال و دریافت کنید:
Route::get('profile', function () {
})->middleware('age:20,gt');
و همینطور در متد handle:
class CheckAge
{
public function handle(Request $request, Closure $next, $minAge, $type)
{
//
}
}
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش سوم - میدلورها
میدلورها در لاراول مکانیزمی مناسب برای بررسی و فیلتر کردن درخواستهای HTTP ورودی به برنامه شما فراهم میکنند.
به عنوان مثال، لاراول یک میدلور دارد که بررسی میکند آیا کاربر وارد سیستم شده است یا خیر. اگر کاربر وارد نشده باشد، او را به صفحه ورود هدایت میکند. اما اگر وارد شده باشد، درخواست را به مسیر بعدی هدایت میکند.
لاراول شامل میدلورهای متنوعی از جمله تأیید هویت و حفاظت CSRF است.
همچنین کاربر می تواند میدلور های خود را بنویسد، تمامی میدلورهای تعریف شده توسط کاربر معمولاً در مسیر app/Http/Middleware قرار میگیرند.
ساخت میدلور اختصاصی:
برای ساخت میدلور اختصاصی، از دستور زیر در ترمینال استفاده کنید:
php artisan make:middleware {MiddlewareName}
این دستور یک میدلور با نام داده شده در مسیر app/Http/Middleware ایجاد میکند.
تمامی عملیات بررسی در متد handle انجام میشود. میتوانید شروطی را بر روی درخواستها اعمال کنید. در صورتی که شروط برقرار باشند، متد handle میدلور بعدی را فراخوانی میکند و درخواست را ادامه میدهد. در غیر این صورت، درخواست متوقف و نتیجه تغییر خواهد کرد. مثال:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
public function handle(Request $request, Closure $next)
{
if ($request->age <= 18) {
return redirect('home');
}
return $next($request);
}
}
اگر سن کاربر کمتر یا مساوی ۱۸ باشد، به صفحه خانه هدایت میشود. در غیر این صورت، درخواست ادامه پیدا میکند.
ثبت میدلور:
برای استفاده از یک میدلور اختصاصی، ابتدا باید آن را در برنامه خود ثبت کنید. برای این کار وارد فایل bootstrap/app.php شوید و دنبال بخش زیر بگردید:
->withMiddleware(function (Middleware $middleware) {
//
})
برای ثبت میدلور جدید، میتوانید متد append را از $middleware صدا بزنید و نام میدلور را به صورت کامل به آن پاس بدهید:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(CheckAge::class);
})
همچنین میتوانید یک نام مستعار برای میدلور خود ثبت کنید تا سادهتر به آن دسترسی داشته باشید:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'age' => CheckAge::class
]);
})
با سایر متد قابل دسترس از $middleware در قسمت بعدی آشنا می شویم.
استفاده از میدلور در مسیرها:
برای اعمال یک میدلور بر روی route ها با متد جدیدی از فساد Route آشنا می شویم:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware(CheckAge::class);
// Or use alias:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware('age');
متد middleware یک یا چند میدلور را بر روی یک مسیر اعمال میکند و در صورتی که شروط میدلور برقرار باشد، مسیر اجرا خواهد شد. در مثال ما، تنها در صورتی که سن بیشتر از ۱۸ باشد، مسیر اجرا خواهد شد.
غیرفعال کردن میدلور برای مسیرها:
متد دیگری از فساد Route با نام withoutMiddleware نیز در دسترس است که میدلور های داده شده را بر روی مسیر مورد نظر اجرا نخواهد کرد:
Route::withoutMiddleware([CheckAge::class])->group(function () {
Route::get('/profile', function () {
// ...
});
});
ارسال پارامتر به میدلور:
میتوانید پارامترهایی را به میدلور خود اختصاص دهید:
Route::get('profile', function () {
// Only executed if age > 18
})->middleware('age:20');
پارامترهای ورودی را میتوانید در متد handle دریافت کنید:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
public function handle(Request $request, Closure $next, $minAge)
{
if ($request->age <= $minAge) {
return redirect('home');
}
return $next($request);
}
}
در مثال بالا، یک میدلور داینامیک ایجاد کردهایم که میتوانیم هر سنی را به واسطه آن بررسی کنیم.
همچنین می توانید پارامتر های بیشتری را ارسال و دریافت کنید:
Route::get('profile', function () {
})->middleware('age:20,gt');
و همینطور در متد handle:
class CheckAge
{
public function handle(Request $request, Closure $next, $minAge, $type)
{
//
}
}
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش دوم - معرفی متد های روتینگ - قسمت سوم
در این قسمت به سایر متد های روتینگ می پردازیم:
1- متد redirect برای ریدایرکت کردن یک URL به URL دیگر استفاده میشود.
Route::redirect('/from-url', '/to-url');
// OR
Route::redirect('/from-home', '/to', 301);
2- متد permanentRedirect برای ریدایرکت دائمی (کد وضعیت HTTP 301) به کار میرود.
Route::permanentRedirect('/from-url', '/to-url');
3- متد view برای بازگرداندن یک ویو به کار میرود و یک صفحه HTML را رندر می کند.
نام فایل view بدون پسوند داده می شود.
Route::view('/welcome', 'welcome');
// welcome -> resources/views/welcome.blade.php
همچنین می توانید پارامتر هایی را همراه آن ارسال کنید:
Route::view('/about', 'about', ['key' => 'value']);
در فصل های بعدی به طور مفصل درمورد view ها توضیح داده می شود.
4- متد name برای نامگذاری یک مسیر استفاده میشود که به شما امکان میدهد تا به سادگی به آن مسیر ارجاع دهید.
Route::get('/user/profile', $action)->name('profile');
route('profile'); // domain.example/user/profile
5- متد group برای گروهبندی روتها و استفاده از تنظیمات مشترک بین آنها به کار میرود.
Route::group(['prefix' => 'admin'], function () {
Route::get('/dashboard', $action);
});
6- متد domain برای تعریف روتهای وابسته به یک دامنه خاص استفاده میشود.
Route::domain('api.example.com')->group(function () {
Route::get('/users', function () {
// api.example.com/users
});
// ...
});
7- متد prefix برای اضافه کردن پیشوند به یک گروه از روتها به کار میرود.
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// domain.example/admin/users
});
// ...
});
8- متد fallback برای تعریف مسیری استفاده میشود که در صورتی که هیچ یک از روتها مطابقت نداشته باشند، فراخوانی میشود.
Route::fallback(function () {
return 404;
});
9- متد current برای بازگرداندن اطلاعات مربوط به مسیر فعلی به کار میرود.
$currentRoute = Route::current();
10- متد currentRouteName برای بازگرداندن نام مسیر فعلی به کار میرود.
$routeAction = Route::currentRouteAction();
11- متد currentRouteAction برای بازگرداندن اکشن کنترلر مربوط به مسیر فعلی به کار میرود.
$currentRouteAction = Route::currentRouteAction();
بقیه متد های روتینگ در فصل های آینده پس از آموزش پیش نیاز ها توضیح داده می شود.
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش دوم - معرفی متد های روتینگ - قسمت دوم
در ادامه معرفی متد های Routing به 9 متد دیگر از فساد Route می پردازیم. این متد ها برای اعتبارسنجی پارامتر های داینامیک دریافتی از URL، کاربرد دارند.
در ادامه هر یک از این متد ها را با مثال معرفی میکنیم:
1- متد where به شما امکان میدهد تا یک محدودیت سفارشی برای پارامترهای مسیر تعیین کنید. این محدودیتها بر اساس یک الگوی منظم (regex) تعریف میشوند. به عنوان مثال، میتوانید تعیین کنید که پارامتر id باید عددی باشد.
Route::get('user/{id}', function ($id) {
return "User ID: $id";
})->where('id', '[0-9]+');
در این مثال، پارامتر id باید فقط شامل اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.
2- متد whereAlpha تضمین میکند که پارامترهای مشخص شده فقط حروف الفبایی باشند. یعنی پارامتر مورد نظر باید فقط شامل حروف باشد و هیچ عدد یا کاراکتر دیگری نباید در آن باشد.
Route::get('user/{name}', function ($name) {
return "User Name: $name";
})->whereAlpha('name');
در این مثال، پارامتر name باید فقط شامل حروف باشد، در غیر این صورت مسیر مطابقت نمیکند.
3- متد whereAlphaNumeric پارامترها را محدود به حروف و اعداد میکند. یعنی پارامتر مورد نظر میتواند شامل حروف و اعداد باشد ولی هیچ کاراکتر خاصی نباید در آن باشد.
Route::get('product/{code}', function ($code) {
return "Product Code: $code";
})->whereAlphaNumeric('code');
در این مثال، پارامتر code باید فقط شامل حروف و اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.
4- متد whereNumber پارامترها را فقط به اعداد محدود میکند. یعنی پارامتر مورد نظر باید فقط شامل اعداد باشد و هیچ حرف یا کاراکتر دیگری نباید در آن باشد.
Route::get('order/{id}', function ($id) {
return "Order ID: $id";
})->whereNumber('id');
در این مثال، پارامتر id باید فقط شامل اعداد باشد، در غیر این صورت مسیر مطابقت نمیکند.
5- متد whereUlid پارامترها را محدود به ULID (Unique Lexicographically Sortable Identifier) میکند که یک نوع شناسه منحصر به فرد و مرتب شونده است.
Route::get('item/{ulid}', function ($ulid) {
return "Item ULID: $ulid";
})->whereUlid('ulid');
در این مثال، پارامتر ulid باید یک ULID معتبر باشد، در غیر این صورت مسیر مطابقت نمیکند.
6- متد whereUuid پارامترها را محدود به UUID (Universally Unique Identifier) میکند.
Route::get('user/{uuid}', function ($uuid) {
return "User UUID: $uuid";
})->whereUuid('uuid');
در این مثال، پارامتر uuid باید یک UUID معتبر باشد، در غیر این صورت مسیر مطابقت نمیکند.
7- متد whereIn تضمین میکند که پارامترها یکی از مقادیر تعیین شده باشند. یعنی پارامتر مورد نظر باید یکی از مقادیر مشخص شده در آرایه باشد.
Route::get('status/{state}', function ($state) {
return "Status: $state";
})->whereIn('state', ['active', 'inactive', 'pending']);
در این مثال، پارامتر state باید یکی از مقادیر active، inactive یا pending باشد، در غیر این صورت مسیر مطابقت نمیکند.
8- متد pattern برای تعیین یک الگوی پیشفرض برای پارامترهای مسیر بکار می رود. این متد برای تنظیم الگوها به طور کلی برای تمام مسیرها در برنامه استفاده میشود.
Route::pattern('slug', '[A-Za-z0-9-]+');
Route::get('post/{slug}', function ($slug) {
return "Post Slug: $slug";
});
این متد یک regex را به طور کلی برای تمامی پارامتر ها با نام slug تعیین میکند. به عبارتی در تمام مسیر ها اعمال می شود و محدود به یک مسیر نیست.
9- متد patterns مشابه متد pattern است با این تفاوت که می توانید چندین الگوی سفارشی برای چندین پارامتر به طور همزمان تعیین کنید.
Route::patterns([
'id' => '[0-9]+',
'slug' => '[A-Za-z0-9-]+',
]);
Route::get('article/{id}/{slug}', function ($id, $slug) {
return "Article ID: $id, Slug: $slug";
});
در مثال بالا یک regex برای پارامتر های id و slug تعریف شده که در تمام مسیر ها اعمال می شود و محدود به یک مسیر نیست.
این روشها به شما امکان میدهند تا الگوهای پیشفرض برای پارامترهای مسیرها را تعیین کنید تا اطمینان حاصل شود که درخواستها به درستی پردازش میشوند و از دادههای نامعتبر جلوگیری شود.
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش دوم - معرفی متد های روتینگ - قسمت اول
در این قسمت به 8 تا از پر کاربرد ترین و اصلی ترین متد های موجود در فساد Route می پردازیم:
1- متد get برای تعریف مسیری استفاده میشود که به درخواستهای HTTP GET پاسخ میدهد. این نوع درخواست معمولاً برای دریافت اطلاعات استفاده میشود.
Route::get('/users', function () {
return 'List of users';
});
کد بالا به معنی این است که اگر درخواستی را با متد GET به آدرس domain.example/users بدهیم، تابع ناشناس داده شده به متد(اکشن) اجرا خواهد شد.
حال فرض کنید میخواهیم مسیری ایجاد کنیم که اطلاعات یک کاربر خاص را بر اساس شناسه (ID) او نمایش دهد. در این صورت، میتوانیم از پارامترهای داینامیک استفاده کنیم:
Route::get('/user/{id}', function ($id) {
return "User ID is $id";
});
در اینجا، {id} یک پارامتر داینامیک است که میتواند هر مقداری باشد. این مقدار از URL استخراج شده و به تابع بسته میشود.
توجه داشته باشید که پارامتر id یک پارامتر اجباری است و درصورتی که در url وارد نشود route ما اجرا نخواهد شد.
برای پارامتر های اختیاری می توان به صورت زیر عمل کرد:
Route::get('/user/{id?}', function ($id = 0) {
if ($id == 0){
return "Hello!";
}
return "User ID is $id";
});
پارامتر {id?} یک پارامتر اختیاری است و حتی اگر آن را وارد نکنیم route ما اجرا خواهد شد، اما توجه داشته باشید که مقدار پیشفرض آن را در اکشن تعریف نمایید.
پارامتر های داینامیک برای تمامی متد ها در دسترس هستند.
2- متد post برای تعریف مسیری استفاده میشود که به درخواستهای HTTP POST پاسخ میدهد. این نوع درخواست معمولاً برای ارسال داده به سرور و ایجاد منابع جدید استفاده میشود.
Route::post('/users', function () {
return 'User created';
});
3- متد put برای تعریف مسیری استفاده میشود که به درخواستهای HTTP PUT پاسخ میدهد. این نوع درخواست معمولاً برای بهروزرسانی کامل یک منبع موجود استفاده میشود.
Route::put('/users/{id}', function ($id) {
return 'User ' . $id . ' updated';
});
4- متد patch برای تعریف مسیری استفاده میشود که به درخواستهای HTTP PATCH پاسخ میدهد. این نوع درخواست معمولاً برای بهروزرسانی جزئی یک منبع موجود استفاده میشود.
Route::patch('/users/{id}', function ($id) {
return 'User ' . $id . ' partially updated';
});
5- متد delete برای تعریف مسیری استفاده میشود که به درخواستهای HTTP DELETE پاسخ میدهد. این نوع درخواست معمولاً برای حذف یک منبع موجود استفاده میشود.
Route::delete('/users/{id}', function ($id) {
return 'User ' . $id . ' deleted';
});
6- متد options برای تعریف مسیری استفاده میشود که به درخواستهای HTTP OPTIONS پاسخ میدهد. این نوع درخواست برای بازگشت اطلاعاتی در مورد ارتباطات مجاز برای یک منبع خاص استفاده میشود.
Route::options('/users', function () {
return ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
});
7- متد any برای تعریف مسیری استفاده میشود که به تمامی انواع درخواستهای HTTP پاسخ میدهد. این نوع مسیر معمولاً برای مسیرهایی استفاده میشود که باید به تمامی درخواستها پاسخ دهند.
Route::any('/contact', function () {
return 'Contact form';
});
8- متد match به شما اجازه میدهد تا یک مسیر را برای چندین نوع درخواست HTTP تعریف کنید. این متد زمانی مفید است که میخواهید یک مسیر خاص به چندین متد HTTP مانند GET و POST پاسخ دهد.
Route::match(['get', 'post'], '/contact', function () {
//
});
این متد برخلاف سایر متد های توضیح داده شده یک پارامتر اضافه تر حاوی آرایه ای از متدهای مجاز را در ابتدا دریافت می کند و پس از آن مانند سایر متد ها عمل میکند.
#laravel #فصل_۱
@AmirhDeveloper
.فصل یک - Routing
بخش اول - روتینگ چیست؟
مسیریابی (Routing) یکی از مهمترین و پایهایترین قابلیتها به شمار میآید که امکان مدیریت درخواستهای ورودی به برنامه را فراهم میکند. مسیریابی در واقع تعیین میکند که درخواستهای کاربران به کدام قسمت از برنامه ارسال شوند و چه عملیاتی روی آنها انجام شود. به عبارت دیگر، مسیریابی مسئولیت اتصال URLهای مختلف به کنترلرها و اکشنهای مشخصی را بر عهده دارد.
هر مسیر میتواند به یک کنترلر یا یک کلوژر اشاره کند. همچنین، امکان تعریف مسیرهای پویا با استفاده از پارامترهای مسیریابی نیز وجود دارد که این قابلیت، انعطافپذیری بیشتری به برنامه میبخشد.
چندین فایل اصلی برای مدیریت مسیرها وجود دارد که هر کدام کاربرد خاص خود را دارند. این فایلها در دایرکتوری routes قرار دارند و به شما این امکان را میدهند که مسیرهای مختلف برنامه خود را سازماندهی و مدیریت کنید. در ادامه توضیح مختصری از هر فایل ارائه میشود:
1- web.php
این فایل برای تعریف مسیرهای وب استفاده میشود. مسیرهای تعریف شده در این فایل معمولاً به کنترلرهایی متصل میشوند که صفحات وب را رندر میکنند.
Route::get('/', function () {
return view('welcome');
});
2- api.php
این فایل برای تعریف مسیرهای API استفاده میشود. این مسیرها معمولاً برای ارائه داده به برنامههای فرانتاند یا سایر سرویسها استفاده میشوند.
Route::get('/', function () {
return response()->json(["hello"]);
});
3- console.php
این فایل برای تعریف فرمانهای کنسول (artisan commands) استفاده میشود. شما میتوانید فرمانهای کنسول خود را در این فایل تعریف کنید که از طریق خط فرمان قابل اجرا هستند. این فرمانها به شما اجازه میدهند تا کارهای مختلفی مانند پاکسازی دیتابیس یا ایجاد کاربران نمونه را انجام دهید.
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->describe('Display an inspiring quote');
4- channels.php
این فایل برای تعریف کانالهای بروزرسانی لحظهای (broadcasting channels) استفاده میشود. این کانالها برای ارسال پیامها و دادهها به صورت لحظهای به مرورگرهای وب یا سایر سرویسها استفاده میشوند. شما میتوانید دسترسی به کانالها را در این فایل کنترل کنید.
Broadcast::channel('order.{orderId}', function ($user, $orderId) {
return $user->id === Order::find($orderId)->user_id;
});
در این فصل تنها با route های web و api آشنا می شویم.
متد های Route از کلاس خاصی(Facade-فَساد) با نام Route در دسترس هستند.
use Illuminate\Support\Facades\Route;
در فساد Route متد های متعددی وجود دارد که به تمامی آنها خواهیم پرداخت. اما برخی در این فصل توضیح داده می شود و برخی دیگر در فصل های آینده.
#laravel #فصل_1
@AmirhDeveloper
.▫️ فصل صفر - مقدمات
🔴🔴🔴
◀️بخش سوم - ساختار پوشهها در لاراول :
پروژه لاراول دارای ساختار پوشهای منظم و مشخصی است. در ادامه، به توضیح مختصر هر یک از پوشهها و فایلهای مهم میپردازیم:
📂 app/
شامل کدهای اصلی برنامه است. این پوشه شامل زیرپوشههای مدلها (Models)، کنترلرها (Controllers)، میانافزارها (Middleware) و غیره میباشد.
📂 bootstrap/
شامل فایلهای بوتاسترپینگ برنامه (مانند بوت کردن ServiceProviderها و MiddleWareها) و تنظیمات اولیه است.
📂 config/
شامل فایلهای تنظیمات برنامه است.
📂 database/
شامل فایلهای مرتبط با پایگاه داده مانند مایگریشن ها (Migrations)، Factory ها و Seeder ها می باشد.
📂 public/
شامل فایلهای عمومی قابل دسترسی از طریق وب است. فایلهای CSS، JavaScript، تصاویر و فایل اصلی index.php در این پوشه قرار دارند.
📂 resources/
شامل منابع برنامه مانند ویوها (views)، فایلهای زبان و فایلهای استاتیک است.
📂 routes/
شامل فایلهای مربوط به مسیریابی برنامه است.
📂 storage/
شامل فایلهای ذخیرهسازی مانند لاگها، کشها و فایلهای آپلود شده است.
📂 tests/
شامل تستهای واحد و یکپارچهسازی برنامه است.
📂 vendor/
شامل کتابخانهها و پکیجهای نصب شده توسط Composer است.
🔴🔴🔴
◀️بخش چهارم - تنظیمات اولیه :
لاراول امکان تنظیمات مختلف برای محیطهای کاری مختلف (مثل توسعه، تست، و تولید) را فراهم میکند. فایل تنظیمات اصلی .env نام دارد و در ریشه پروژه قرار دارد.
در این فایل، میتوانید تنظیمات مربوط به پایگاه داده، سرور ایمیل، کش و سایر تنظیمات محیطی را تعیین کنید.
با تغییر مقدار APP_ENV میتوانید محیط کاری را تغییر دهید. مقادیر معمول برای این متغیر عبارتند از:
local (توسعه)،
production (تولید)،
staging (آزمایش)،
همچنین، میتوانید تنظیمات خاصی را برای هر محیط در فایلهای تنظیمات موجود در پوشه config/ مشخص کنید.
با استفاده از فایلهای تنظیمات و ساختار پوشهای منظم، لاراول به توسعهدهندگان امکان میدهد برنامههای وب پیچیده و قدرتمندی را به سرعت و با کیفیت بالا توسعه دهند.
▫️ فصل صفر - مقدمات
🔴🔴🔴
◀️بخش اول - معرفی لاراول:
لاراول یک فریمورک PHP متنباز و قدرتمند است که برای توسعه برنامههای وب طراحی شده است.
لاراول از ساختار MVC پیروی میکند که به توسعهدهندگان امکان میدهد کدهای خود را به صورت منظم و خوانا سازماندهی کنند.
این فریمورک همچنین با اصول SOLID و برنامهنویسی شیگرا (OOP) هماهنگ است، که به افزایش قابلیت نگهداری و توسعهپذیری کد کمک میکند.
این فریمورک ابزارها و قابلیتهای بسیاری را برای تسهیل فرآیند توسعه ارائه میدهد، از جمله:
Routing : سیستم مسیریابی قدرتمند برای مدیریت درخواستهای وب.
Eloquent ORM : سیستم ORM پیشرفته برای تعامل با پایگاه داده به صورت شیءگرا.
Artisan Console : رابط خط فرمان برای اجرای دستورات و وظایف مختلف.
Middleware : مکانیزمی برای فیلتر کردن درخواستها و پاسخها.
Queues : پشتیبانی از صفها برای مدیریت کارهای پسزمینه.
لاراول به دلیل سهولت استفاده، مستندات جامع، و جامعه کاربری بزرگ، به یکی از محبوبترین فریمورکهای PHP تبدیل شده است.
🔴🔴🔴
◀️بخش دوم - نصب و راهاندازی لاراول:
برای نصب و راهاندازی لاراول، ابتدا باید اطمینان حاصل کنید که سرور شما از نیازمندیهای لاراول پشتیبانی میکند. نیازمندیهای اصلی لاراول عبارتند از:
- PHP >= 7.2.5
-
BCMath, Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML PHP Extensions
برای نصب لاراول، میتوانید از Composer استفاده کنید. Composer یک ابزار مدیریت وابستگیها در PHP است. برای نصب Composer به سایت getcomposer.org مراجعه کرده و دستورالعملهای نصب را دنبال کنید.
پس از نصب Composer، میتوانید لاراول را با استفاده از دو روش زیر نصب کنید:
composer create-project laravel/laravel myproject
یا
composer global require laravel/installer
laravel new myproject
با اجرای این دستور، یک پروژه جدید لاراول در پوشهای به نام myproject ایجاد میشود.
پس از اتمام نصب، میتوانید وارد پوشه پروژه شده و سرور توسعه لاراول را با دستور زیر اجرا کنید:
cd myproject
php artisan serve
سرور توسعه لاراول به صورت پیشفرض روی پورت 8000 اجرا میشود و میتوانید با مراجعه به آدرس http://localhost:8000 برنامه خود را مشاهده کنید.درود به همه
قصد نوشتن یک دوره آموزشی جامع و کامل برای فریمورک قدرتمند لاراول رو دارم. این دوره به صورت گام به گام و از مباحث پایه شروع شده و به تدریج به مباحث پیشرفتهتر میپردازه، و هر چیزی از لاراول رو قراره پوشش بده.
مناسب برای همه، حتی کسانی که هیچ آشنایی قبلی با لاراول ندارند. تنها پیشنیاز این دوره، آشنایی با زبان PHP و معماری MVC است.
سرفصلهای این دوره:
فصل 0: مقدمات
1- معرفی لاراول
2- نصب و راهاندازی لاراول
3- ساختار پوشهها و فایلها در لاراول
4- تنظیمات اولیه و محیطهای کاری
فصل 1: Routing
1- معرفی متد های روتینگ
2- میدلورها
فصل 2: Controllers
1- ایجاد و استفاده از کنترلرها
2- متدهای کنترلر
3- کنترلرهای Resource
4- کنترلرهای API
5- Dependency Injection در کنترلرها
فصل 3: Views
1- موتور قالبسازی Blade
2- ساختار و سینتکس Blade
3- شامل کردن ویوها و کامپوننتها
4- مدیریت دادهها در ویوها
فصل 4: مدلها و Eloquent ORM
1- معرفی Eloquent
2- تعریف مدلها
3- ارتباطات بین مدلها (Relations)
4- کوئری بیلدر (Query Builder)
5- Accessors و Mutators
6- Scopes
فصل 5: Migrations and Database
1- تعریف و اجرای Migrationها
2- Seeders و Factories
3- کار با دیتابیسها و ارتباطات
فصل 6: فرمها و اعتبارسنجی
1- ساخت و پردازش فرمها
2- اعتبارسنجی درخواستها
3- پیامهای خطا و مدیریت آنها
فصل 7: Services و Dependency Injection
1- Service Container
2- سرویسها و Providers
3- Facades
فصل 8: امنیت (Security)
1- احراز هویت (Authentication)
2- مجوزها (Authorization)
3- رمزنگاری (Encryption)
4- جلوگیری از CSRF و XSS
فصل 9: تست و Debugging
1- معرفی ابزارهای تست لاراول
2- Unit Testing
3- Integration Testing
4- Debugging و خطایابی
فصل 10: Optimization and Performance
1- کشینگ (Caching)
2- Queues و Background Jobs
3- بهینهسازی کوئریها
4- استفاده از Octane
فصل 11: توسعه پیشرفته
1- Package Development
2- توسعه RESTful API
3- استفاده از رویدادها (Events) و Listenerها
4- مدیریت فایلها و Storage
فصل 12: بررسی هسته لاراول
1- ساختار هسته لاراول
2- بررسی و توضیح کلاسهای کلیدی
3- بررسی چرخه درخواست (Request Lifecycle)
لطفا هرگونه کمبود یا ایراد در سرفصل هارو اعلام کنید تا شروع کنیم.
Repost from Start Unity
دوستان عزیز 🌟
من مدت زیادی هست که با عشق و علاقه در کانال Start Unity فعالیت میکنم و آموزشهای متنی و کدهای یونیتی رو با شما به اشتراک میگذارم. از حمایتهای شما بسیار ممنونم.
اما برای اینکه کانال بتونه رشد بیشتری داشته باشه و بتونم مطالب بیشتری براتون آماده کنم، به حمایتهای شما نیاز دارم. خواهشمندم که پستهای کانال رو با دوستان و همکارانتون به اشتراک بذارید تا اعضای کانال افزایش پیدا کنه.
همچنین میخواهم از دوست عزیزم که کانال رو بوست کرد، تشکر ویژه کنم. حمایت تو برای من بسیار ارزشمنده ❤️
به عنوان تشکر از حمایتهای شما، در آینده قصد دارم آموزشهای ویدیویی یونیتی هم بسازم و در کانال قرار بدم.
از همراهی و حمایتهای شما بسیار سپاسگزارم. با هم میتونیم این کانال رو به یکی از بهترین منابع آموزشی یونیتی تبدیل کنیم 🚀
