کانال آموزشی لاراول
3.06K subscribers
120 photos
4 videos
38 links
📌 کانال اتاق برنامه نویسی
@PapiDon_coding
Download Telegram
کانال آموزشی لاراول
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
کانال آموزشی لاراول
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
🔥4👍2🎉1
کانال آموزشی لاراول
🎯 الگوی Service Repository Pattern در Laravel مقدمه در دنیای برنامه‌نویسی کد تمیز و قابل نگهداری یک اصل مهم است. Laravel به صورت پیش‌فرض از Active Record Pattern استفاده می‌کند که در پروژه‌های کوچک کارآمد است، اما در پروژه‌های بزرگ باعث کنترلرهای چاق و…
🛠 گام‌به‌گام پیاده‌سازی الگوی Service Repository Pattern در Laravel

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👏31🎉1
کانال آموزشی لاراول pinned «🎯 الگوی Service Repository Pattern در Laravel مقدمه در دنیای برنامه‌نویسی کد تمیز و قابل نگهداری یک اصل مهم است. Laravel به صورت پیش‌فرض از Active Record Pattern استفاده می‌کند که در پروژه‌های کوچک کارآمد است، اما در پروژه‌های بزرگ باعث کنترلرهای چاق و…»
کانال آموزشی لاراول
Photo
📚 احراز هویت در Laravel Sanctum

در توسعه API با لاراول، نیاز داریم تا کاربران را احراز هویت (Authentication) کنیم تا فقط کاربران مجاز به برخی بخش‌های سیستم دسترسی داشته باشند. یکی از روش‌های محبوب برای این کار، استفاده از Laravel Sanctum است که با تولید توکن‌های منحصربه‌فرد این کار را انجام می‌دهد.

در این درس، با فرآیند ثبت‌نام، ورود، خروج، و نحوه کارکرد Bearer Token در Sanctum آشنا می‌شویم.

1️⃣ ثبت‌نام و دریافت توکن (Register)

🔹 وقتی کاربر ثبت‌نام می‌کند، پس از ایجاد حساب، به او یک توکن احراز هویت داده می‌شود. این توکن را باید در درخواست‌های بعدی ارسال کند تا سیستم بتواند او را شناسایی کند.

🔹 مثال کد در لاراول:

public function register(Request $request)
{
$fields = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);

$user = User::create([
'name' => $fields['name'],
'email' => $fields['email'],
'password' => Hash::make($fields['password']),
]);

$token = $user->createToken($user->name);

return [
'user' => $user,
'token' => $token->plainTextToken,
];
}


🔹 چرا createToken اینجا استفاده شده؟

چون بعد از ثبت‌نام، باید یک توکن برای کاربر صادر کنیم تا بلافاصله بتواند از API استفاده کند.

2️⃣ ورود و دریافت توکن جدید (Login)

🔹 وقتی کاربر وارد سیستممی‌شود، سیستم ایمیل و رمز عبور او را بررسی می‌کند. اگر اطلاعات صحیح بود، یک توکن جدید برای او صادر می‌شود.

🔹 مثال کد در لاراول:

public function login(Request $request)
{
$fields = $request->validate([
'email' => 'required|string|email|max:255|exists:users',
'password' => 'required|string|min:8',
]);

$user = User::where('email', $fields['email'])->first();

if (!$user || !Hash::check($fields['password'], $user->password)) {
return response([
'message' => 'Invalid credentials',
], 401);
}

$token = $user->createToken($user->name);

return [
'user' => $user,
'token' => $token->plainTextToken,
];
}


🔹 چرا باز هم createToken داریم؟

چون هر بار که کاربر وارد سیستم می‌شود، یک توکن جدید برای او صادر می‌کنیم تا در درخواست‌های بعدی از آن استفاده کند.


3️⃣ احراز هویت و ارسال توکن در درخواست‌ها

🔹 بعد از ورود موفق، کاربر باید توکن خود را در هدر درخواست‌ها بفرستد تا بتواند از API استفاده کند.

🔹 مثال درخواست به یک مسیر محافظت‌شده:

GET /api/user
Authorization: Bearer your_token_here


🔹 و اما Bearer Token چیست؟

- این توکن مانند یک کارت عضویت است که نشان می‌دهد کاربر وارد سیستم شده است.
- اگر این کارت نداشته باشد، اجازه دسترسی به بخش‌های محافظت‌شده API را نخواهد داشت.


4️⃣ خروج و حذف توکن (Logout)

🔹 وقتی کاربر از حساب خود خارج شود، باید توکن‌های او حذف شوند تا دیگر امکان استفاده از API نداشته باشد.

🔹 مثال کد در لاراول:

public function logout(Request $request)
{
$request->user()->tokens()->delete();

return [
'message' => 'Logged out',
];
}


🔹 چرا tokens()->delete استفاده شده؟

چون باید تمام توکن‌های کاربر را پاک کنیم تا دیگر نتواند از API استفاده کند.


5️⃣ چرا در مسیر logout از Middleware auth:sanctum استفاده شده؟

🔹 در مسیرهای حساس (مثل logout)، باید حتماً بررسی کنیم که کاربر احراز هویت شده باشد.

🔹 این کار را Middleware auth:sanctum انجام می‌دهد.

🔹 تعریف مسیرها در routes/api.php

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');


🔹 چرا فقط برای logout این middleware اضافه شده؟

میدانیم که خروج از سیستم (logout) فقط باید توسط یک کاربری که لاگین کرده و توکن معتبر داره انجام بشه. یعنی کسی که هنوز توکن نگرفته نباید بتونه logout کنه! 🤨

این میان‌افزار (Middleware) باعث می‌شه که لاراول بررسی کنه آیا این درخواست واقعاً از طرف یک کاربر احراز هویت‌شده هست یا نه.

اگر کاربر توکن معتبر داشته باشه → درخواست قبول می‌شه و توکنش پاک می‌شه.

اگر توکن نداشته باشه یا جعلی باشه → لاراول خطای ۴۰۱ (Unauthorized) برمی‌گردونه.



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

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍14🔥21
شرکت OpenAI امروز یک سری ابزار هیجان‌انگیز منتشر کرده که ساختن «ایجنت‌ها» (برنامه‌های هوشمند) را برای برنامه‌نویسان ساده‌تر از همیشه می‌کند!

🧐 حالا «ایجنت» دقیقاً چیه؟

یک «ایجنت» برنامه هوشمندی است که خودش و بدون دخالت انسان کارهایی مثل جواب دادن به ایمیل‌ها، جستجوی سریع و دقیق در اینترنت یا فایل‌ها و مدیریت هوشمندانه‌ی کارها را انجام می‌دهد.

OpenAI امروز سه ابزار جدید برای راحت کردن ساخت این ایجنت‌ها معرفی کرده:


🔸Web Search
🔹File Search
🔸Agents SDK


👇 برای خواندن توضیح کامل این ابزارهای جدید و جذاب، حتماً این پست رو بخون...

🔗 اینجا ....


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

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
🎉2❤‍🔥1🔥1