کانال آموزشی لاراول
3.06K subscribers
120 photos
4 videos
38 links
📌 کانال اتاق برنامه نویسی
@PapiDon_coding
Download Telegram
👏3
کانال آموزشی لاراول
Photo
🎓 وظیفه و کاربرد ()this->fill$ در Livewire

امروز می‌خواهیم درباره یکی از متدهای مفید در Livewire به نام ()this->fill$ صحبت کنیم. این متد یکی از ابزارهای کاربردی برای پر کردن (یا مقداردهی) چندین خصوصیت (property) در کامپوننت‌های Livewire به طور همزمان است.

🔍 بررسی ()this->fill$

متد $()this->fill$ به شما این امکان را می‌دهد که یک آرایه از داده‌ها را به چندین خصوصیت کامپوننت Livewire به طور همزمان اختصاص دهید. این متد به ویژه زمانی مفید است که شما بخواهید چندین خصوصیت را به یکباره مقداردهی کنید، بدون اینکه نیاز به تعیین مقدار هر خصوصیت به صورت جداگانه داشته باشید.

🔧 مثال:

فرض کنید شما یک فرم دارید که شامل فیلدهای name، email و address است و می‌خواهید این فیلدها را از یک منبع داده (مثلاً یک درخواست HTTP) به‌روز کنید. به جای اینکه هر خصوصیت را به صورت جداگانه مقداردهی کنید، می‌توانید از ()this->fill$ استفاده کنید:


$this->fill([
'name' => $data['name'],
'email' => $data['email'],
'address' => $data['address'],
]);



این متد به راحتی همه این خصوصیات را به یکباره مقداردهی می‌کند.

🎯 آیا فقط در متد ()mount استفاده می‌شود؟

خیر، ()this->fill$ محدود به استفاده در متد ()mount نیست. شما می‌توانید از این متد در هر کجای کامپوننت Livewire استفاده کنید، مانند:

- در متدهای دیگر کامپوننت: برای به‌روزرسانی خصوصیات هنگام اجرای یک اکشن خاص.

- در متد update: برای بروزرسانی داده‌ها هنگام تعاملات کاربر.

- در متدهای لایو‌وایر دیگر: در هر جایی که نیاز به مقداردهی خصوصیات داشته باشید.

🎯 نتیجه‌گیری

متد ()this->fill$ یک ابزار قدرتمند و انعطاف‌پذیر برای مقداردهی چندین خصوصیت در Livewire به طور همزمان است و می‌تواند در هر کجای کامپوننت مورد استفاده قرار گیرد. این متد به خصوص در مواردی که نیاز به مقداردهی سریع و همزمان چندین خصوصیت دارید، بسیار مفید است.


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍7🔥2
2
کانال آموزشی لاراول
Photo
استفاده از متد 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💯21🔥1
"فکر می‌کنی زمانی شروع می‌کنی که همه چیز کامل باشد، اما باور کن که چنین اتفاقی هیچ‌وقت نخواهد افتاد. و حتی اگر هم بیافتد، آن زمان دیگر خیلی دیر شده است."


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
💯7👌21👍1🔥1
کانال آموزشی لاراول
Photo
🔔نکات کلیدی درباره Livewire و امنیت داده‌ها

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
👍93🔥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
👏11👍71🔥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
👏9👍62🔥2❤‍🔥1🤩1
کانال آموزشی لاراول pinned «انقلابی در استقرار برنامه‌های لاراول Laravel Cloud در لاراول ۱۲ یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن ساده‌سازی استقرار (Deployment) و مدیریت برنامه‌های لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps…»
کانال آموزشی لاراول
Photo
🔒 جلوگیری از Race Condition در لاراول با lockForUpdate – راهکاری برای مدیریت هم‌زمانی در دیتابیس

در لاراول یک متد مهم به نام ()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
👍172👏1🙏1
در لاراول، متد ()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
👍132
کانال آموزشی لاراول
Photo
آشنایی با Macro‌ها در Laravel

🧐 اصلا Macro چیست و چرا استفاده می‌شود؟

روشی برای افزودن پویا (در زمان اجرا) متدهای جدید به کلاس‌های داخلی فریم‌ورک است، بدون اینکه نیاز باشد آن کلاس را ویرایش کنیم یا از آن ارث‌بری کنیم​.

این قابلیت به کمک تریت ویژه‌ای به نام Macroable فراهم می‌شود که در بسیاری از کلاس‌های هسته‌ی لاراول به‌کار رفته است (مثلاً در کلاس‌های Response, Collection, Str و... که اجازه می‌دهند متدهای جدید به آنها اضافه شود)​

به زبان ساده، Macro به ما امکان می‌دهد عملکردهای دلخواه خود را به کلاس‌هایی که مالکیتشان در اختیار ما نیست اضافه کنیم. تمامی نمونه‌های آن کلاس (و حتی خود کلاس به صورت استاتیک) پس از تعریف یک ماکرو، می‌توانند متد جدید را صدا بزنند که گویی از ابتدا جزئی از کلاس بوده است​.

🤓 چرا باید از Macro استفاده کنیم؟

اولین دلیل، سادگی آن نسبت به روش‌های سنتی است. افزودن یک قابلیت کوچک با ماکرو بسیار راحت‌تر از ایجاد یک زیرکلاس و جایگزین‌کردن آن به‌جای کلاس اصلی است​.

با یک فراخوانی، متد دلخواه اضافه می‌شود و نیازی به تغییر دیگر قسمت‌های کد نیست. دلیل دوم، تمیز ماندن کدهای هسته‌ی لاراول است؛ با ماکروها می‌توانیم بدون دست بردن در کد اصلی فریم‌ورک، آزادی عمل خود را حفظ کنیم​.

هر قابلیت کمبود کوچکی (مثلاً متدی که احساس می‌کنید در کلاس Collection یا Response کم است) را می‌توان با یک ماکرو جبران کرد. همچنین ماکروها به ما کمک می‌کنند از تکرار کدهای مشابه در بخش‌های مختلف جلوگیری کنیم و منطق مشترک را در یک محل مرکزی (ماکرو) قرار دهیم​.

بنابراین خوانایی کد افزایش یافته و نگهداری آن ساده‌تر می‌شود. به طور خلاصه، ماکروها یک راهکار سریع برای گسترش امکانات کلاس‌های لاراول هستند که زمانی استفاده می‌شوند که احساس کنیم نبود یک متد خاص کار ما را سخت و کدمان را شلوغ کرده است​.




کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍6🔥3🙏1