کانال آموزشی لاراول
Photo
✨ استفاده از متد
🤔 اکشنها در لایووایر چیست؟
در لایووایر (Livewire)، اکشنها به شما اجازه میدهند تا از طریق رویدادها (events) و دستورات (actions)، ارتباط موثری بین کامپوننتهای مختلف برقرار کنید. یکی از امکانات جدید و مفید در این زمینه استفاده از ویژگی
متد
⚙️ متد
زمانی که یک کامپوننت فرزند میخواهد مستقیماً به یک متد یا ویژگی در والد دسترسی پیدا کند، به جای استفاده از رویدادها (dispatching events)، میتوانید از
مثال:
فرض کنید کامپوننت والد متدی به نام
در این مثال، کامپوننت فرزند از طریق
🕰 کی از
- ارتباط مستقیم بین فرزند و والد: وقتی که نیاز دارید بهراحتی از فرزند به متدها و خواص والد دسترسی پیدا کنید.
- پیچیدگی کم: در سیستمهای ساده که استفاده از رویدادها باعث پیچیدگی بیمورد میشود.
- تعداد کم کامپوننتها: زمانی که تعداد کمی کامپوننت دارید و ارتباط بین آنها مستقیم است.
⛔️ زمانی که نباید از
- سیستمهای پیچیده: وقتی تعداد زیادی کامپوننت دارید و استفاده بیش از حد از
- ارتباطات غیرمستقیم: وقتی نیاز است دادهها بین کامپوننتهای متعدد و پیچیده جابهجا شوند، بهتر است از رویدادها (dispatching events) استفاده کنید.
🎯 رویدادها (Dispatching Events) چیست؟
در لایووایر، رویدادها به شما این امکان را میدهند که بدون وابستگی مستقیم، اطلاعات بین کامپوننتها را جابهجا کنید. در این روش، یک کامپوننت میتواند رویدادی ارسال کند و کامپوننتهای دیگر به آن گوش دهند.
مزایای استفاده از رویدادها:
1️⃣ استقلال کامپوننتها: هر کامپوننت میتواند به طور مستقل عمل کند.
2️⃣ قابلیت توسعه بالا: برای پروژههای بزرگتر مناسبتر است.
3️⃣ ارتباطات چندطرفه: رویدادها میتوانند به صورت چندگانه مدیریت شوند، یعنی یک رویداد میتواند توسط چندین کامپوننت شنیده شود.
مثال از رویدادها:
و در والد:
⚖️ تفاوت
parent$
- ارتباط مستقیم بین فرزند و والد.
- سریع و ساده برای سیستمهای کوچک.
- وابستگی زیاد بین کامپوننتها.
- مناسب برای سیستمهای ساده و ارتباطات کمپیچیدگی.
Dispatching Events
- ارتباط غیرمستقیم بین کامپوننتها.
- کاهش وابستگی بین آنها.
- مناسب برای سیستمهای پیچیده و بزرگ.
- مدیریت بهتر در پروژههای چندلایه و پیچیده.
⚜️در نهایت، انتخاب بین استفاده از
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
parent$ در لایووایر ۳🤔 اکشنها در لایووایر چیست؟
در لایووایر (Livewire)، اکشنها به شما اجازه میدهند تا از طریق رویدادها (events) و دستورات (actions)، ارتباط موثری بین کامپوننتهای مختلف برقرار کنید. یکی از امکانات جدید و مفید در این زمینه استفاده از ویژگی
parent$ است که در نسخه ۳ لایووایر معرفی شده است.متد
parent$ به شما این امکان را میدهد که از داخل یک کامپوننت فرزند، به متدها و خواص (properties) کامپوننت والد دسترسی پیدا کنید. این قابلیت زمانی مفید است که بخواهید از داخل فرزند، عملیاتی در والد اجرا کنید یا دادهای را به آن بفرستید بدون اینکه رویدادی ارسال کنید.⚙️ متد
parent$ چطور کار میکند؟زمانی که یک کامپوننت فرزند میخواهد مستقیماً به یک متد یا ویژگی در والد دسترسی پیدا کند، به جای استفاده از رویدادها (dispatching events)، میتوانید از
parent$ استفاده کنید. در واقع parent$ مستقیماً از درون الگوهای Blade استفاده میشود.مثال:
فرض کنید کامپوننت والد متدی به نام
()removePost دارد. شما میتوانید از داخل کامپوننت فرزند این متد را فراخوانی کنید:<button wire:click="$parent.removePost({{ $post->id }})">Remove</button>در این مثال، کامپوننت فرزند از طریق
parent$ متد ()removePost را در کامپوننت والد فراخوانی میکند و id پست را به آن ارسال میکند. این کار ساده و مستقیم است و به شما اجازه میدهد ارتباط مؤثری بین فرزند و والد برقرار کنید بدون نیاز به سیستم پیچیده رویدادها.🕰 کی از
parent$ استفاده کنیم؟- ارتباط مستقیم بین فرزند و والد: وقتی که نیاز دارید بهراحتی از فرزند به متدها و خواص والد دسترسی پیدا کنید.
- پیچیدگی کم: در سیستمهای ساده که استفاده از رویدادها باعث پیچیدگی بیمورد میشود.
- تعداد کم کامپوننتها: زمانی که تعداد کمی کامپوننت دارید و ارتباط بین آنها مستقیم است.
⛔️ زمانی که نباید از
parent$ استفاده کنید:- سیستمهای پیچیده: وقتی تعداد زیادی کامپوننت دارید و استفاده بیش از حد از
parent$ باعث وابستگی شدید بین کامپوننتها میشود.- ارتباطات غیرمستقیم: وقتی نیاز است دادهها بین کامپوننتهای متعدد و پیچیده جابهجا شوند، بهتر است از رویدادها (dispatching events) استفاده کنید.
🎯 رویدادها (Dispatching Events) چیست؟
در لایووایر، رویدادها به شما این امکان را میدهند که بدون وابستگی مستقیم، اطلاعات بین کامپوننتها را جابهجا کنید. در این روش، یک کامپوننت میتواند رویدادی ارسال کند و کامپوننتهای دیگر به آن گوش دهند.
مزایای استفاده از رویدادها:
1️⃣ استقلال کامپوننتها: هر کامپوننت میتواند به طور مستقل عمل کند.
2️⃣ قابلیت توسعه بالا: برای پروژههای بزرگتر مناسبتر است.
3️⃣ ارتباطات چندطرفه: رویدادها میتوانند به صورت چندگانه مدیریت شوند، یعنی یک رویداد میتواند توسط چندین کامپوننت شنیده شود.
مثال از رویدادها:
$this->dispatch('eventName', ['data' => $someData]);و در والد:
use Livewire\Attributes\On;
#[On('eventName')]
public function handleEvent($data)
{
// کاری که باید انجام شود
}
⚖️ تفاوت
parent$ و رویدادها (Dispatching Events)parent$
- ارتباط مستقیم بین فرزند و والد.
- سریع و ساده برای سیستمهای کوچک.
- وابستگی زیاد بین کامپوننتها.
- مناسب برای سیستمهای ساده و ارتباطات کمپیچیدگی.
Dispatching Events
- ارتباط غیرمستقیم بین کامپوننتها.
- کاهش وابستگی بین آنها.
- مناسب برای سیستمهای پیچیده و بزرگ.
- مدیریت بهتر در پروژههای چندلایه و پیچیده.
⚜️در نهایت، انتخاب بین استفاده از
parent$ و رویدادها (Dispatching Events) بستگی به نیاز پروژه دارد. برای ارتباطات ساده و مستقیم، parent$ مناسبتر است؛ اما برای پروژههای پیچیده و بزرگ، رویدادها استقلال بیشتری بین کامپوننتها فراهم میکنند و مدیریت بهتر را ممکن میسازند.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍5💯2❤1🔥1
"فکر میکنی زمانی شروع میکنی که همه چیز کامل باشد، اما باور کن که چنین اتفاقی هیچوقت نخواهد افتاد. و حتی اگر هم بیافتد، آن زمان دیگر خیلی دیر شده است."
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
💯7👌2❤1👍1🔥1
کانال آموزشی لاراول
Photo
🔔نکات کلیدی درباره Livewire و امنیت دادهها
1️⃣ دیتای Public و امنیت آن
در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا ابزارهای مشابه مشاهده کنه.
راهکار:
- از گذاشتن اطلاعات حساس به صورت public خودداری کنید.
- اگر نیاز دارید که دادهای رو به کلاینت ارسال کنید، مطمئن باشید که حاوی اطلاعات حساس نیست.
- برای دادههای حساس از private یا protected استفاده کنید و از متدهای ایمن برای دسترسی به آنها بهره ببرید.
2️⃣ متدهای Public و قابلیت فراخوانی از سمت کلاینت
متدهای public در Livewire بهطور پیشفرض قابل فراخوانی از سمت کلاینت هستند. این متدها میتوانند مستقیماً در Template با دستورات مثل
راهکار:
- متدهای حساس رو public نکنید یا مطمئن شوید که فقط عملیات امن و ضروری در این متدها انجام میشود.
- از middleware و authorization مناسب برای متدهای public استفاده کنید تا دسترسیهای غیرمجاز محدود شوند.
3️⃣ خصوصیات محاسبهشده (Computed Properties)
متدهایی که با
مزیت:
- جلوگیری از دسترسی غیرمجاز به منطق داخلی کامپوننت.
- کاربران نمیتوانند این متدها را مستقیماً از طریق DevTools یا هر روش دیگری فراخوانی کنند، که این موضوع امنیت را افزایش میدهد.
4️⃣ خصوصیات قفلشده (Locked Properties)
با استفاده از
مزیت:
- جلوگیری از تغییرات غیرمجاز و افزایش امنیت دادهها.
- محافظت از دادههای حساس مانند شناسهها که نباید توسط کاربران تغییر پیدا کنند.
🛠قانون کلی:
- هر متغیری که شامل دادههای کلیدی یا حساس است، باید با
5️⃣ هیدراسیون (Hydration) برای اطمینان از همگامسازی دادهها
فرآیندی است Hydration که تضمین میکند دادهها در زمان اجرای مجدد کامپوننت همواره بهروز هستند و از دیتابیس تازهسازی میشوند. این فرآیند شامل چند مرحله است:
1. Hydration
- هنگام بارگذاری اولیه کامپوننت، وضعیت آن در سمت سرور ایجاد و سپس به صورت HTML به مرورگر ارسال میشود.
2. Dehydration
- قبل از ارسال به مرورگر، وضعیت کامپوننت به یک فرم سریالشده تبدیل میشود تا حجم دادهها کاهش یابد.
3. Rehydration
- هنگام وقوع یک تعامل (مثل کلیک یا تایپ) در سمت کاربر، وضعیت سریالشده به سرور ارسال میشود.
- در سرور، وضعیت مجدداً به یک شیء کامپوننت تبدیل شده و تغییرات اعمال میشود.
- سپس پاسخ به مرورگر برمیگردد و وضعیت کامپوننت بهروز میشود.
مزیت:
- تجربه کاربری روان و دادههای دقیق و بهروز.
- امکان مدیریت تعاملات پویا و بهروزرسانیهای بلادرنگ بدون نیاز به بارگذاری مجدد صفحه.
راهکار:
- از متد
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
1️⃣ دیتای Public و امنیت آن
در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا ابزارهای مشابه مشاهده کنه.
راهکار:
- از گذاشتن اطلاعات حساس به صورت public خودداری کنید.
- اگر نیاز دارید که دادهای رو به کلاینت ارسال کنید، مطمئن باشید که حاوی اطلاعات حساس نیست.
- برای دادههای حساس از private یا protected استفاده کنید و از متدهای ایمن برای دسترسی به آنها بهره ببرید.
2️⃣ متدهای Public و قابلیت فراخوانی از سمت کلاینت
متدهای public در Livewire بهطور پیشفرض قابل فراخوانی از سمت کلاینت هستند. این متدها میتوانند مستقیماً در Template با دستورات مثل
wire:click، wire:submit و غیره استفاده شوند. این یعنی کاربران میتوانند این متدها رو از طریق DevTools یا جاوااسکریپت صدا بزنند.راهکار:
- متدهای حساس رو public نکنید یا مطمئن شوید که فقط عملیات امن و ضروری در این متدها انجام میشود.
- از middleware و authorization مناسب برای متدهای public استفاده کنید تا دسترسیهای غیرمجاز محدود شوند.
3️⃣ خصوصیات محاسبهشده (Computed Properties)
متدهایی که با
[Computed]# تعریف میشوند، حتی اگر public باشند، از سمت کلاینت به عنوان اکشن قابل فراخوانی نیستند. این متدها به عنوان خصوصیات محاسبهشده عمل میکنند و امنیت بهتری را فراهم میکنند. مزیت:
- جلوگیری از دسترسی غیرمجاز به منطق داخلی کامپوننت.
- کاربران نمیتوانند این متدها را مستقیماً از طریق DevTools یا هر روش دیگری فراخوانی کنند، که این موضوع امنیت را افزایش میدهد.
4️⃣ خصوصیات قفلشده (Locked Properties)
با استفاده از
[Locked]# میتوانید متغیرهای حساس را قفل کنید تا کاربران نتونن اونها را از سمت کلاینت تغییر بدن. این ویژگی برای محافظت از دادههای کلیدی مثل شناسهها (IDs) بسیار مفید است. مزیت:
- جلوگیری از تغییرات غیرمجاز و افزایش امنیت دادهها.
- محافظت از دادههای حساس مانند شناسهها که نباید توسط کاربران تغییر پیدا کنند.
🛠قانون کلی:
- هر متغیری که شامل دادههای کلیدی یا حساس است، باید با
[Locked]# مشخص شود تا از تغییر غیرمجاز جلوگیری شود.5️⃣ هیدراسیون (Hydration) برای اطمینان از همگامسازی دادهها
فرآیندی است Hydration که تضمین میکند دادهها در زمان اجرای مجدد کامپوننت همواره بهروز هستند و از دیتابیس تازهسازی میشوند. این فرآیند شامل چند مرحله است:
1. Hydration
- هنگام بارگذاری اولیه کامپوننت، وضعیت آن در سمت سرور ایجاد و سپس به صورت HTML به مرورگر ارسال میشود.
2. Dehydration
- قبل از ارسال به مرورگر، وضعیت کامپوننت به یک فرم سریالشده تبدیل میشود تا حجم دادهها کاهش یابد.
3. Rehydration
- هنگام وقوع یک تعامل (مثل کلیک یا تایپ) در سمت کاربر، وضعیت سریالشده به سرور ارسال میشود.
- در سرور، وضعیت مجدداً به یک شیء کامپوننت تبدیل شده و تغییرات اعمال میشود.
- سپس پاسخ به مرورگر برمیگردد و وضعیت کامپوننت بهروز میشود.
مزیت:
- تجربه کاربری روان و دادههای دقیق و بهروز.
- امکان مدیریت تعاملات پویا و بهروزرسانیهای بلادرنگ بدون نیاز به بارگذاری مجدد صفحه.
راهکار:
- از متد
()hydrate برای همگامسازی مجدد دادهها استفاده کنید تا از بروز تناقضات دادهای جلوگیری شود.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍9❤3🔥1
کانال آموزشی لاراول pinned «🔔نکات کلیدی درباره Livewire و امنیت دادهها 1️⃣ دیتای Public و امنیت آن در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا…»
گاهی حس میکنم ریفکتور کردن کدها شده بخشی از DNA من! یهو میزنم زیر codebase و شروع میکنم به بهینهسازی یا سبکتر کردن کدها. تو هم این حس رو داری که کد رو هی دستکاری کنی، یا وقتی کار میکنه، میگی دیگه چه کاریه؟
Anonymous Poll
60%
اصلا تا دلت بخواد، دیوانه وار
40%
نه بابا ! کار میکنه دیگه انگول چی آخه
👍1🔥1
کانال آموزشی لاراول pinned «گاهی حس میکنم ریفکتور کردن کدها شده بخشی از DNA من! یهو میزنم زیر codebase و شروع میکنم به بهینهسازی یا سبکتر کردن کدها. تو هم این حس رو داری که کد رو هی دستکاری کنی، یا وقتی کار میکنه، میگی دیگه چه کاریه؟»
"In der Ruhe liegt die Kraft."
آلمانی ها میگن : قدرت در آرامش نهفته است.
با یه برداشت آزاد ازین ضرب المثل داشتم به این فکر میکردم که تفاوت بین یه سینیور و جونیور دقیقا همینجاست، فارغ از تجربه کاری.
ازین آرامشی میاد که تسلط به خودش داره.
یعنی شاید لزوما هم در اون مورد خاص هم جوابی نداشته باشه ها در لحظه !
ولی اون دل ناآرام جونیور عاملی میشه برای دست و پا زدن های بی دلیل خودش که در نهایت فروتر میره !
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
آلمانی ها میگن : قدرت در آرامش نهفته است.
با یه برداشت آزاد ازین ضرب المثل داشتم به این فکر میکردم که تفاوت بین یه سینیور و جونیور دقیقا همینجاست، فارغ از تجربه کاری.
ازین آرامشی میاد که تسلط به خودش داره.
یعنی شاید لزوما هم در اون مورد خاص هم جوابی نداشته باشه ها در لحظه !
ولی اون دل ناآرام جونیور عاملی میشه برای دست و پا زدن های بی دلیل خودش که در نهایت فروتر میره !
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👏11👍7❤1🔥1
کانال آموزشی لاراول
Photo
✨انقلابی در استقرار برنامههای لاراول Laravel Cloud در لاراول ۱۲
یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps
در این درسگفتار، با مفهوم Laravel Cloud، نحوهی عملکرد آن، مزایای کلیدی و میزان نیاز به دانش DevOps آشنا خواهیم شد.
🔸بخش اول: Laravel Cloud چیست و چه کاربردی دارد؟
یک پلتفرم کاملاً مدیریتشده برای میزبانی و اجرای پروژههای لاراول است. این سرویس توسط تیم لاراول ساخته شده و تمام نیازهای زیرساختی برنامههای Laravel را خودکارسازی میکند. شما فقط کد خود را روی یک مخزن گیت (Git) قرار میدهید، و Laravel Cloud آن را بهطور خودکار اجرا و مدیریت میکند.
کاربردهای Laravel Cloud:
1️⃣ استقرار سریع و بدون دردسر → بدون نیاز به تنظیم سرور یا پیکربندیهای خاص.
2️⃣ مدیریت ساده → پایگاهداده، کش (Redis)، ذخیرهسازی فایل و سایر خدمات از قبل تنظیم شدهاند.
3️⃣ مقیاسبندی خودکار → در صورت افزایش ترافیک، منابع سرور بهطور خودکار افزایش مییابند.
4️⃣ امنیت و پایداری بالا → شامل گواهی SSL، فایروال و محافظت در برابر حملات DDoS.
5️⃣ دیپلوی بدون قطعی → تغییرات جدید بدون توقف سرویس اعمال میشوند.
🔹چرا مهم است؟ Laravel Cloud نیاز به مدیریت دستی سرور و تنظیمات پیچیده را از بین میبرد و به شما اجازه میدهد روی توسعهی نرمافزار تمرکز کنید.
🔸بخش دوم: Laravel Cloud چگونه کار میکند؟
بر اساس مدل پلتفرم به عنوان سرویس (PaaS) کار میکند. روند کلی استفاده از آن به این صورت است:
1️⃣ مخزن گیت پروژهی خود را متصل کنید → Laravel Cloud بهطور خودکار کد را دریافت میکند.
2️⃣ ساخت و اجرای خودکار برنامه → بدون نیاز به کانفیگ سرور، برنامهی شما روی ابر اجرا میشود.
3️⃣ مدیریت خودکار منابع → پایگاهداده، کش، ذخیرهسازی و سایر منابع بهصورت خودکار تنظیم میشوند.
4️⃣ مقیاسبندی هوشمند → با افزایش ترافیک، سیستم بهطور خودکار سرورهای بیشتری اضافه میکند.
5️⃣ مانیتورینگ و پشتیبانگیری خودکار → شما میتوانید مصرف منابع و لاگهای برنامه را مشاهده و تحلیل کنید.
🔹 ویژگی مهم: دیگر نیازی به دستوپنجه نرم کردن با تنظیمات Nginx، PHP-FPM، یا سرورهای اختصاصی ندارید!
🔸بخش سوم: مزایای Laravel Cloud برای توسعهدهندگان
ویژگیهای متعددی را در اختیار توسعهدهندگان قرار میدهد که آن را از سایر روشهای استقرار متمایز میکند:
1️⃣ استقرار آسان و سریع
- دیگر نیازی به کانفیگ پیچیدهی سرور، SSH، یا Docker ندارید.
- کافی است کد خود را Push کنید و Laravel Cloud بهطور خودکار آن را اجرا میکند.
2️⃣ مدیریت پایگاهداده و کش
- پایگاهداده MySQL و PostgreSQL بهطور مستقیم در سرویس وجود دارد.
- ردیس Redis برای کش و S3 برای ذخیرهسازی فایل از پیش پیکربندی شدهاند.
3️⃣ امنیت و مقیاسپذیری
- ترافیک سایت شما از طریق Cloudflare محافظت میشود.
- حملات DDoS و درخواستهای مخرب مسدود میشوند.
- برنامه شما میتواند خودکار مقیاسبندی شود و در برابر افزایش ناگهانی ترافیک مقاوم باشد.
4️⃣ مانیتورینگ و اشکالزدایی ساده
- یک داشبورد برای مشاهده مصرف CPU، حافظه، لاگها و میزان درخواستهای ورودی ارائه شده است.
- امکان مشاهده و جستجو در لاگهای برنامه برای رفع سریع خطاها.
5️⃣ همکاری تیمی
- شما میتوانید اعضای تیم خود را اضافه کنید و دسترسیهای مختلفی به آنها بدهید.
🔹 نتیجه: Laravel Cloud یک راهکار سریع، ایمن، و بدون دردسر برای استقرار برنامههای لاراول است.
🔸بخش چهارم: آیا برای استفاده از Laravel Cloud نیاز به دانش DevOps است؟
خیر! Laravel Cloud بهگونهای طراحی شده است که تمام کارهای DevOps را خودکار انجام دهد. این سرویس تمام مراحل مدیریت سرور، بهینهسازی، مقیاسبندی، امنیت و پشتیبانگیری را برای شما انجام میدهد.
با این حال، آشنایی با مفاهیم زیر میتواند به شما کمک کند:
- استفاده از Git برای مدیریت کدها.
- آشنایی با متغیرهای محیطی (Environment Variables).
- درک مفاهیم استقرار و مدیریت پایگاهداده.
🔹 نتیجه: شما نیازی به دانش DevOps ندارید و میتوانید مستقیماً از Laravel Cloud برای اجرای پروژههای خود استفاده کنید.
🔹مزایای اصلی Laravel Cloud:
✅ استقرار سریع و خودکار
✅ پشتیبانی از پایگاهداده، کش و ذخیرهسازی
✅ مقیاسپذیری هوشمند و امنیت بالا
✅ دیپلوی بدون قطعی و پشتیبانگیری خودکار
✅ بدون نیاز به دانش DevOps
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps
در این درسگفتار، با مفهوم Laravel Cloud، نحوهی عملکرد آن، مزایای کلیدی و میزان نیاز به دانش DevOps آشنا خواهیم شد.
🔸بخش اول: Laravel Cloud چیست و چه کاربردی دارد؟
یک پلتفرم کاملاً مدیریتشده برای میزبانی و اجرای پروژههای لاراول است. این سرویس توسط تیم لاراول ساخته شده و تمام نیازهای زیرساختی برنامههای Laravel را خودکارسازی میکند. شما فقط کد خود را روی یک مخزن گیت (Git) قرار میدهید، و Laravel Cloud آن را بهطور خودکار اجرا و مدیریت میکند.
کاربردهای Laravel Cloud:
1️⃣ استقرار سریع و بدون دردسر → بدون نیاز به تنظیم سرور یا پیکربندیهای خاص.
2️⃣ مدیریت ساده → پایگاهداده، کش (Redis)، ذخیرهسازی فایل و سایر خدمات از قبل تنظیم شدهاند.
3️⃣ مقیاسبندی خودکار → در صورت افزایش ترافیک، منابع سرور بهطور خودکار افزایش مییابند.
4️⃣ امنیت و پایداری بالا → شامل گواهی SSL، فایروال و محافظت در برابر حملات DDoS.
5️⃣ دیپلوی بدون قطعی → تغییرات جدید بدون توقف سرویس اعمال میشوند.
🔹چرا مهم است؟ Laravel Cloud نیاز به مدیریت دستی سرور و تنظیمات پیچیده را از بین میبرد و به شما اجازه میدهد روی توسعهی نرمافزار تمرکز کنید.
🔸بخش دوم: Laravel Cloud چگونه کار میکند؟
بر اساس مدل پلتفرم به عنوان سرویس (PaaS) کار میکند. روند کلی استفاده از آن به این صورت است:
1️⃣ مخزن گیت پروژهی خود را متصل کنید → Laravel Cloud بهطور خودکار کد را دریافت میکند.
2️⃣ ساخت و اجرای خودکار برنامه → بدون نیاز به کانفیگ سرور، برنامهی شما روی ابر اجرا میشود.
3️⃣ مدیریت خودکار منابع → پایگاهداده، کش، ذخیرهسازی و سایر منابع بهصورت خودکار تنظیم میشوند.
4️⃣ مقیاسبندی هوشمند → با افزایش ترافیک، سیستم بهطور خودکار سرورهای بیشتری اضافه میکند.
5️⃣ مانیتورینگ و پشتیبانگیری خودکار → شما میتوانید مصرف منابع و لاگهای برنامه را مشاهده و تحلیل کنید.
🔹 ویژگی مهم: دیگر نیازی به دستوپنجه نرم کردن با تنظیمات Nginx، PHP-FPM، یا سرورهای اختصاصی ندارید!
🔸بخش سوم: مزایای Laravel Cloud برای توسعهدهندگان
ویژگیهای متعددی را در اختیار توسعهدهندگان قرار میدهد که آن را از سایر روشهای استقرار متمایز میکند:
1️⃣ استقرار آسان و سریع
- دیگر نیازی به کانفیگ پیچیدهی سرور، SSH، یا Docker ندارید.
- کافی است کد خود را Push کنید و Laravel Cloud بهطور خودکار آن را اجرا میکند.
2️⃣ مدیریت پایگاهداده و کش
- پایگاهداده MySQL و PostgreSQL بهطور مستقیم در سرویس وجود دارد.
- ردیس Redis برای کش و S3 برای ذخیرهسازی فایل از پیش پیکربندی شدهاند.
3️⃣ امنیت و مقیاسپذیری
- ترافیک سایت شما از طریق Cloudflare محافظت میشود.
- حملات DDoS و درخواستهای مخرب مسدود میشوند.
- برنامه شما میتواند خودکار مقیاسبندی شود و در برابر افزایش ناگهانی ترافیک مقاوم باشد.
4️⃣ مانیتورینگ و اشکالزدایی ساده
- یک داشبورد برای مشاهده مصرف CPU، حافظه، لاگها و میزان درخواستهای ورودی ارائه شده است.
- امکان مشاهده و جستجو در لاگهای برنامه برای رفع سریع خطاها.
5️⃣ همکاری تیمی
- شما میتوانید اعضای تیم خود را اضافه کنید و دسترسیهای مختلفی به آنها بدهید.
🔹 نتیجه: Laravel Cloud یک راهکار سریع، ایمن، و بدون دردسر برای استقرار برنامههای لاراول است.
🔸بخش چهارم: آیا برای استفاده از Laravel Cloud نیاز به دانش DevOps است؟
خیر! Laravel Cloud بهگونهای طراحی شده است که تمام کارهای DevOps را خودکار انجام دهد. این سرویس تمام مراحل مدیریت سرور، بهینهسازی، مقیاسبندی، امنیت و پشتیبانگیری را برای شما انجام میدهد.
با این حال، آشنایی با مفاهیم زیر میتواند به شما کمک کند:
- استفاده از Git برای مدیریت کدها.
- آشنایی با متغیرهای محیطی (Environment Variables).
- درک مفاهیم استقرار و مدیریت پایگاهداده.
🔹 نتیجه: شما نیازی به دانش DevOps ندارید و میتوانید مستقیماً از Laravel Cloud برای اجرای پروژههای خود استفاده کنید.
🔹مزایای اصلی Laravel Cloud:
✅ استقرار سریع و خودکار
✅ پشتیبانی از پایگاهداده، کش و ذخیرهسازی
✅ مقیاسپذیری هوشمند و امنیت بالا
✅ دیپلوی بدون قطعی و پشتیبانگیری خودکار
✅ بدون نیاز به دانش DevOps
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👏9👍6❤2🔥2❤🔥1🤩1
کانال آموزشی لاراول pinned «✨انقلابی در استقرار برنامههای لاراول Laravel Cloud در لاراول ۱۲ یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps…»
کانال آموزشی لاراول
Photo
🔒 جلوگیری از Race Condition در لاراول با lockForUpdate – راهکاری برای مدیریت همزمانی در دیتابیس
✨در لاراول یک متد مهم به نام
🛠 اصلا Race Condition چیست؟
در واقع Race Condition زمانی رخ میدهد که دو یا چند درخواست همزمان سعی میکنند یک رکورد مشخص در دیتابیس را تغییر دهند. اگر مکانیزم درستی برای مدیریت این وضعیت وجود نداشته باشد، ممکن است مقدار دادهها اشتباه ثبت شود یا اطلاعات از بین برود.
⚙️ چگونه
متد
📌 مثال عملی در Laravel
فرض کنید در یک سیستم فروش، چندین کاربر همزمان در حال تلاش برای تغییر وضعیت (status) یک سفارش هستند. اگر هیچ سیستمی برای جلوگیری از Race Condition وجود نداشته باشد، ممکن است دو نفر بهطور همزمان وضعیت سفارش را تغییر دهند و باعث بروز خطا شوند.
✅ راهحل با
در این مثال، ابتدا رکورد موردنظر را قفل میکنیم و سپس تغییرات را اعمال میکنیم:
🔹 توضیح:
- با
- سایر درخواستها باید منتظر بمانند تا این تراکنش کامل شود.
- بعد از انجام تغییرات، وضعیت جدید در دیتابیس ذخیره میشود.
❗️ نکات مهم
- به خاطر داشته باشید که
- این روش روی پایگاه دادههایی مانند MySQL و PostgreSQL که از قفلهای سطح رکورد پشتیبانی میکنند، کار میکند.
- اگر به خواندن (SELECT) بدون قفلگذاری نیاز دارید، میتوانید از
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
✨در لاراول یک متد مهم به نام
()lockForUpdate وجود دارد که برای جلوگیری از مشکلات Race Condition در هنگام تغییر دادهها در پایگاه داده استفاده میشود.🛠 اصلا Race Condition چیست؟
در واقع Race Condition زمانی رخ میدهد که دو یا چند درخواست همزمان سعی میکنند یک رکورد مشخص در دیتابیس را تغییر دهند. اگر مکانیزم درستی برای مدیریت این وضعیت وجود نداشته باشد، ممکن است مقدار دادهها اشتباه ثبت شود یا اطلاعات از بین برود.
⚙️ چگونه
()lockForUpdate کمک میکند؟متد
()lockForUpdate هنگام اجرای یک کوئری انتخابی (SELECT)، آن رکورد را تا پایان تراکنش جاری (Transaction) قفل میکند. یعنی اگر درخواستهای دیگر سعی کنند همان رکورد را تغییر دهند، باید منتظر بمانند تا این تراکنش کامل شود و قفل آزاد شود.📌 مثال عملی در Laravel
فرض کنید در یک سیستم فروش، چندین کاربر همزمان در حال تلاش برای تغییر وضعیت (status) یک سفارش هستند. اگر هیچ سیستمی برای جلوگیری از Race Condition وجود نداشته باشد، ممکن است دو نفر بهطور همزمان وضعیت سفارش را تغییر دهند و باعث بروز خطا شوند.
✅ راهحل با
()lockForUpdate:در این مثال، ابتدا رکورد موردنظر را قفل میکنیم و سپس تغییرات را اعمال میکنیم:
DB::transaction(function () {
$order = Order::where('id', 1)->lockForUpdate()->first();
// تغییر وضعیت سفارش
$order->status = 'processing';
$order->save();
});🔹 توضیح:
- با
()lockForUpdate رکورد را قفل میکنیم. - سایر درخواستها باید منتظر بمانند تا این تراکنش کامل شود.
- بعد از انجام تغییرات، وضعیت جدید در دیتابیس ذخیره میشود.
❗️ نکات مهم
- به خاطر داشته باشید که
()lockForUpdate فقط در داخل تراکنش (transaction) کار میکند، پس باید همیشه درون ()DB::transaction استفاده شود. - این روش روی پایگاه دادههایی مانند MySQL و PostgreSQL که از قفلهای سطح رکورد پشتیبانی میکنند، کار میکند.
- اگر به خواندن (SELECT) بدون قفلگذاری نیاز دارید، میتوانید از
()sharedLock استفاده کنید.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍17❤2👏1🙏1
✨ در لاراول، متد
🔸تفاوت ها
1️⃣
- رکورد را قفل میکند تا هیچ درخواست دیگری نتواند آن را تغییر دهد.
- هر درخواست دیگری که بخواهد رکورد را تغییر دهد، باید منتظر بماند تا قفل آزاد شود.
- بیشتر در سناریوهایی که قرار است مقدار رکورد را تغییر دهیم استفاده میشود.
2️⃣
- رکورد را قفل میکند اما فقط برای خواندن.
- درخواستهای دیگر میتوانند رکورد را بخوانند، اما نمیتوانند مقدار آن را تغییر دهند.
- مناسب برای مواقعی که میخواهیم مطمئن شویم دادهها هنگام خواندن تغییر نمیکنند.
📌 مثال عملی در Laravel
فرض کنید چندین درخواست همزمان میخواهند اطلاعات یک سفارش را بخوانند، اما نمیخواهیم در حین خواندن این دادهها، مقدار آن توسط درخواست دیگری تغییر کند. در این حالت،
🔹 در اینجا ()sharedLock:
- باعث میشود که سایر درخواستها بتوانند همین رکورد را بخوانند اما اجازه تغییر آن را ندارند تا زمانی که این تراکنش کامل شود.
- این متد در سناریوهای گزارشگیری و آنالیز داده که نیاز به دادههای پایدار دارند، مفید است.
🧐 پس کی
- وقتی نیاز داریم دادهای را بخوانیم، اما مطمئن شویم که در همان لحظه توسط درخواست دیگری تغییر نمیکند.
- زمانی که نیازی به تغییر مقدار داده نداریم، اما به دادهای دقیق و ثابت نیاز داریم.
⚜️در کل:
- برای قفل کردن و تغییر داده
- برای قفل کردن و فقط خواندن داده
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
()sharedLock شبیه به ()lockForUpdate است، اما تفاوت اصلی آن در نحوهی قفلگذاری روی دادهها است.🔸تفاوت ها
1️⃣
lockForUpdate(): - رکورد را قفل میکند تا هیچ درخواست دیگری نتواند آن را تغییر دهد.
- هر درخواست دیگری که بخواهد رکورد را تغییر دهد، باید منتظر بماند تا قفل آزاد شود.
- بیشتر در سناریوهایی که قرار است مقدار رکورد را تغییر دهیم استفاده میشود.
2️⃣
sharedLock():- رکورد را قفل میکند اما فقط برای خواندن.
- درخواستهای دیگر میتوانند رکورد را بخوانند، اما نمیتوانند مقدار آن را تغییر دهند.
- مناسب برای مواقعی که میخواهیم مطمئن شویم دادهها هنگام خواندن تغییر نمیکنند.
📌 مثال عملی در Laravel
فرض کنید چندین درخواست همزمان میخواهند اطلاعات یک سفارش را بخوانند، اما نمیخواهیم در حین خواندن این دادهها، مقدار آن توسط درخواست دیگری تغییر کند. در این حالت،
()sharedLock را استفاده میکنیم:DB::transaction(function () {
$order = Order::where('id', 1)->sharedLock()->first();
// فقط خواندن اطلاعات، تغییر دادهای انجام نمیشود
echo $order->status;
});🔹 در اینجا ()sharedLock:
- باعث میشود که سایر درخواستها بتوانند همین رکورد را بخوانند اما اجازه تغییر آن را ندارند تا زمانی که این تراکنش کامل شود.
- این متد در سناریوهای گزارشگیری و آنالیز داده که نیاز به دادههای پایدار دارند، مفید است.
🧐 پس کی
()sharedLock را استفاده کنیم؟- وقتی نیاز داریم دادهای را بخوانیم، اما مطمئن شویم که در همان لحظه توسط درخواست دیگری تغییر نمیکند.
- زمانی که نیازی به تغییر مقدار داده نداریم، اما به دادهای دقیق و ثابت نیاز داریم.
⚜️در کل:
- برای قفل کردن و تغییر داده
()lockForUpdate استفاده میشود.- برای قفل کردن و فقط خواندن داده
()sharedLock بدون اجازه تغییر آن استفاده میشود.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍13❤2
کانال آموزشی لاراول
Photo
✨ آشنایی با Macroها در Laravel
🧐 اصلا Macro چیست و چرا استفاده میشود؟
روشی برای افزودن پویا (در زمان اجرا) متدهای جدید به کلاسهای داخلی فریمورک است، بدون اینکه نیاز باشد آن کلاس را ویرایش کنیم یا از آن ارثبری کنیم.
این قابلیت به کمک تریت ویژهای به نام Macroable فراهم میشود که در بسیاری از کلاسهای هستهی لاراول بهکار رفته است (مثلاً در کلاسهای Response, Collection, Str و... که اجازه میدهند متدهای جدید به آنها اضافه شود)
به زبان ساده، Macro به ما امکان میدهد عملکردهای دلخواه خود را به کلاسهایی که مالکیتشان در اختیار ما نیست اضافه کنیم. تمامی نمونههای آن کلاس (و حتی خود کلاس به صورت استاتیک) پس از تعریف یک ماکرو، میتوانند متد جدید را صدا بزنند که گویی از ابتدا جزئی از کلاس بوده است.
🤓 چرا باید از Macro استفاده کنیم؟
اولین دلیل، سادگی آن نسبت به روشهای سنتی است. افزودن یک قابلیت کوچک با ماکرو بسیار راحتتر از ایجاد یک زیرکلاس و جایگزینکردن آن بهجای کلاس اصلی است.
با یک فراخوانی، متد دلخواه اضافه میشود و نیازی به تغییر دیگر قسمتهای کد نیست. دلیل دوم، تمیز ماندن کدهای هستهی لاراول است؛ با ماکروها میتوانیم بدون دست بردن در کد اصلی فریمورک، آزادی عمل خود را حفظ کنیم.
هر قابلیت کمبود کوچکی (مثلاً متدی که احساس میکنید در کلاس Collection یا Response کم است) را میتوان با یک ماکرو جبران کرد. همچنین ماکروها به ما کمک میکنند از تکرار کدهای مشابه در بخشهای مختلف جلوگیری کنیم و منطق مشترک را در یک محل مرکزی (ماکرو) قرار دهیم.
بنابراین خوانایی کد افزایش یافته و نگهداری آن سادهتر میشود. به طور خلاصه، ماکروها یک راهکار سریع برای گسترش امکانات کلاسهای لاراول هستند که زمانی استفاده میشوند که احساس کنیم نبود یک متد خاص کار ما را سخت و کدمان را شلوغ کرده است.
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
🧐 اصلا Macro چیست و چرا استفاده میشود؟
روشی برای افزودن پویا (در زمان اجرا) متدهای جدید به کلاسهای داخلی فریمورک است، بدون اینکه نیاز باشد آن کلاس را ویرایش کنیم یا از آن ارثبری کنیم.
این قابلیت به کمک تریت ویژهای به نام Macroable فراهم میشود که در بسیاری از کلاسهای هستهی لاراول بهکار رفته است (مثلاً در کلاسهای Response, Collection, Str و... که اجازه میدهند متدهای جدید به آنها اضافه شود)
به زبان ساده، Macro به ما امکان میدهد عملکردهای دلخواه خود را به کلاسهایی که مالکیتشان در اختیار ما نیست اضافه کنیم. تمامی نمونههای آن کلاس (و حتی خود کلاس به صورت استاتیک) پس از تعریف یک ماکرو، میتوانند متد جدید را صدا بزنند که گویی از ابتدا جزئی از کلاس بوده است.
🤓 چرا باید از Macro استفاده کنیم؟
اولین دلیل، سادگی آن نسبت به روشهای سنتی است. افزودن یک قابلیت کوچک با ماکرو بسیار راحتتر از ایجاد یک زیرکلاس و جایگزینکردن آن بهجای کلاس اصلی است.
با یک فراخوانی، متد دلخواه اضافه میشود و نیازی به تغییر دیگر قسمتهای کد نیست. دلیل دوم، تمیز ماندن کدهای هستهی لاراول است؛ با ماکروها میتوانیم بدون دست بردن در کد اصلی فریمورک، آزادی عمل خود را حفظ کنیم.
هر قابلیت کمبود کوچکی (مثلاً متدی که احساس میکنید در کلاس Collection یا Response کم است) را میتوان با یک ماکرو جبران کرد. همچنین ماکروها به ما کمک میکنند از تکرار کدهای مشابه در بخشهای مختلف جلوگیری کنیم و منطق مشترک را در یک محل مرکزی (ماکرو) قرار دهیم.
بنابراین خوانایی کد افزایش یافته و نگهداری آن سادهتر میشود. به طور خلاصه، ماکروها یک راهکار سریع برای گسترش امکانات کلاسهای لاراول هستند که زمانی استفاده میشوند که احساس کنیم نبود یک متد خاص کار ما را سخت و کدمان را شلوغ کرده است.
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍6🔥3🙏1
کانال آموزشی لاراول
Photo
🎯 الگوی Service Repository Pattern در Laravel
✨مقدمه
در دنیای برنامهنویسی کد تمیز و قابل نگهداری یک اصل مهم است. Laravel به صورت پیشفرض از Active Record Pattern استفاده میکند که در پروژههای کوچک کارآمد است، اما در پروژههای بزرگ باعث کنترلرهای چاق و پیچیده میشود.
🧐 راهحل چیست؟
الگوی Service Repository Pattern
🔸 این الگو دسترسی به دادهها و منطق تجاری را از هم جدا میکند تا:
✔️ کد خواناتر شود
✔️ قابلیت تستنویسی بالا برود
✔️ توسعه و تغییرات آینده راحتتر باشد
✔️ کنترلرهای سبکتر شوند
🔹ریپازیتوری (Repository): تنها وظیفهی تعامل با دیتابیس را دارد.
🔹سرویس (Service): منطق تجاری (Business Logic) را مدیریت میکند.
🔹کنترلر (Controller): فقط نقش هماهنگکننده را دارد و درخواستها را به سرویسها ارسال میکند.
⚜️چرا از Service Repository استفاده کنیم؟
💡مشکلات روش معمول (بدون این الگو):
🚫 کدهای تکراری در کنترلرها
🚫 سخت شدن تستنویسی
🚫 کنترلرهای چاق و نامرتب
🚫 تغییرات سخت در آینده
🔄 مزایای این الگو:
1️⃣ افزایش خوانایی و نگهداریپذیری
2️⃣ ماژولار شدن کد و امکان توسعهی آسان
3️⃣ امکان تستنویسی جداگانه برای هر لایه
4️⃣ امکان تغییر منبع داده بدون نیاز به تغییر منطق سرویسها
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
✨مقدمه
در دنیای برنامهنویسی کد تمیز و قابل نگهداری یک اصل مهم است. Laravel به صورت پیشفرض از Active Record Pattern استفاده میکند که در پروژههای کوچک کارآمد است، اما در پروژههای بزرگ باعث کنترلرهای چاق و پیچیده میشود.
🧐 راهحل چیست؟
الگوی Service Repository Pattern
🔸 این الگو دسترسی به دادهها و منطق تجاری را از هم جدا میکند تا:
✔️ کد خواناتر شود
✔️ قابلیت تستنویسی بالا برود
✔️ توسعه و تغییرات آینده راحتتر باشد
✔️ کنترلرهای سبکتر شوند
🔹ریپازیتوری (Repository): تنها وظیفهی تعامل با دیتابیس را دارد.
🔹سرویس (Service): منطق تجاری (Business Logic) را مدیریت میکند.
🔹کنترلر (Controller): فقط نقش هماهنگکننده را دارد و درخواستها را به سرویسها ارسال میکند.
⚜️چرا از Service Repository استفاده کنیم؟
💡مشکلات روش معمول (بدون این الگو):
🚫 کدهای تکراری در کنترلرها
🚫 سخت شدن تستنویسی
🚫 کنترلرهای چاق و نامرتب
🚫 تغییرات سخت در آینده
🔄 مزایای این الگو:
1️⃣ افزایش خوانایی و نگهداریپذیری
2️⃣ ماژولار شدن کد و امکان توسعهی آسان
3️⃣ امکان تستنویسی جداگانه برای هر لایه
4️⃣ امکان تغییر منبع داده بدون نیاز به تغییر منطق سرویسها
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
🔥4👍2🎉1
کانال آموزشی لاراول
🎯 الگوی Service Repository Pattern در Laravel ✨مقدمه در دنیای برنامهنویسی کد تمیز و قابل نگهداری یک اصل مهم است. Laravel به صورت پیشفرض از Active Record Pattern استفاده میکند که در پروژههای کوچک کارآمد است، اما در پروژههای بزرگ باعث کنترلرهای چاق و…
🛠 گامبهگام پیادهسازی الگوی Service Repository Pattern در Laravel
1️⃣ ایجاد Repository (مدیریت دیتابیس)
ابتدا یک اینترفیس برای ریپازیتوری ایجاد میکنیم:
🔹 سپس کلاس پیادهسازی آن را مینویسیم:
🚀 حالا لایه دیتابیس در
2️⃣ ایجاد Service (مدیریت منطق تجاری)
کلاس
🔹 حالا سرویسها از ریپازیتوری برای دریافت داده استفاده میکنند و هرگونه منطق تجاری مثل بررسی قوانین، ارسال اعلان و... را در خود دارند.
3️⃣ استفاده از این الگو در Controller
🔹 کنترلر را طوری مینویسیم که فقط از
🚀 کنترلر فقط درخواستها را مدیریت میکند و تمام کارها را به سرویسها میسپارد!
4️⃣ ثبت Dependency Injection در Laravel
برای اینکه Laravel متوجه شود که
✅ حالا هر جا
🎯 مزایای نهایی این الگو
🚀 کد خواناتر و ساختاریافته
🔧 افزایش قابلیت تستنویسی
⚡️ امکان توسعه و تغییر آسان
💡 تفکیک کامل لایهها برای مدیریت بهتر کد
اگر پروژهی شما بزرگ است و میخواهید بهترین معماری را برای کدهایتان داشته باشید، Service Repository Pattern یک راهحل عالی است! 🔥
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
1️⃣ ایجاد Repository (مدیریت دیتابیس)
ابتدا یک اینترفیس برای ریپازیتوری ایجاد میکنیم:
namespace App\Repositories;
use App\Models\Post;
use Illuminate\Support\Collection;
interface PostRepositoryInterface {
public function getAll(): Collection;
public function findById(int $id): ?Post;
public function create(array $data): Post;
}
🔹 سپس کلاس پیادهسازی آن را مینویسیم:
namespace App\Repositories;
use App\Models\Post;
use Illuminate\Support\Collection;
class PostRepository implements PostRepositoryInterface {
public function getAll(): Collection {
return Post::all();
}
public function findById(int $id): ?Post {
return Post::find($id);
}
public function create(array $data): Post {
return Post::create($data);
}
}
🚀 حالا لایه دیتابیس در
PostRepository قرار دارد و کنترلرها مستقیماً به مدل دسترسی ندارند.2️⃣ ایجاد Service (مدیریت منطق تجاری)
کلاس
PostService را میسازیم و وابستگیهای آن را تزریق میکنیم:namespace App\Services;
use App\Repositories\PostRepositoryInterface;
use Illuminate\Support\Collection;
use App\Models\Post;
class PostService {
protected $postRepo;
public function __construct(PostRepositoryInterface $postRepo) {
$this->postRepo = $postRepo;
}
public function listPosts(): Collection {
return $this->postRepo->getAll();
}
public function getPostDetails(int $id): ?Post {
return $this->postRepo->findById($id);
}
public function createPost(array $data): Post {
return $this->postRepo->create($data);
}
}
🔹 حالا سرویسها از ریپازیتوری برای دریافت داده استفاده میکنند و هرگونه منطق تجاری مثل بررسی قوانین، ارسال اعلان و... را در خود دارند.
3️⃣ استفاده از این الگو در Controller
🔹 کنترلر را طوری مینویسیم که فقط از
PostService استفاده کند: namespace App\Http\Controllers;
use App\Services\PostService;
use Illuminate\Http\Request;
class PostController extends Controller {
protected $postService;
public function __construct(PostService $postService) {
$this->postService = $postService;
}
public function index() {
$posts = $this->postService->listPosts();
return view('posts.index', compact('posts'));
}
public function show($id) {
$post = $this->postService->getPostDetails($id);
return view('posts.show', compact('post'));
}
public function store(Request $request) {
$data = $request->validate([ 'title' => 'required', 'content' => 'required' ]);
$post = $this->postService->createPost($data);
return redirect()->route('posts.show', $post->id);
}
}
🚀 کنترلر فقط درخواستها را مدیریت میکند و تمام کارها را به سرویسها میسپارد!
4️⃣ ثبت Dependency Injection در Laravel
برای اینکه Laravel متوجه شود که
PostRepositoryInterface باید PostRepository را برگرداند، باید آن را در Service Provider ثبت کنیم:use App\Repositories\PostRepositoryInterface;
use App\Repositories\PostRepository;
public function register() {
$this->app->bind(PostRepositoryInterface::class, PostRepository::class);
}
✅ حالا هر جا
PostRepositoryInterface نیاز باشد، Laravel خودش PostRepository را جایگزین میکند!🎯 مزایای نهایی این الگو
🚀 کد خواناتر و ساختاریافته
🔧 افزایش قابلیت تستنویسی
⚡️ امکان توسعه و تغییر آسان
💡 تفکیک کامل لایهها برای مدیریت بهتر کد
اگر پروژهی شما بزرگ است و میخواهید بهترین معماری را برای کدهایتان داشته باشید، Service Repository Pattern یک راهحل عالی است! 🔥
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍12👏3❤1🎉1