DDN ( Daily Dev Notes )
8 subscribers
4 photos
12 links
Download Telegram
Forwarded from یک برنامه نویس تنبل (Arshia)
Laravel Migration Cheat Sheet
بهترین روش استفاده از enum و cast در Laravel

@TheRaymondDev
Forwarded from laravel-news
docker-compose.yml:


services:
laravel:
container_name: laravel
image: my-image-app
ports:
- "443:443"

mysql:
container_name: mysql
image: mysql:8.0
expose:
- 3306
volumes:
- mysql:/var/lib/mysql
Forwarded from Golden Code (Ali 🇨🇴)
بیشتر ما می‌نویسیم:
$user = User::where('email', $email)->firstOrFail();

اما اگه انتظار دارین دقیقاً یک رکورد وجود داشته باشه، "sole()" میتونه انتخب بهتری باشه:
$user = User::where('email', $email)->sole();

تفاوتشون؟

شرایطی رو تصور کنید که به اشتباه دو رکورد با ایمیل یکسان داریم.
اگه از sole استفاده کنیم بهمون خطا میده چون انتظار داره فقط یک رکورد برگرده،

اما firstOrFail میره و اولین رکورد رو برامون میاره

"firstOrFail()"

- اگه رکوردی نباشد : خطا
- اگر چند رکورد باشن : اولین رکورد رو برمی‌گردونه

"sole()"

- اگه رکوردی نباشه :خطا
- اگر چند رکورد باشد : خطا

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

#Laravel #Laravel_tip #لاراول

@GoldenCodeir 🔥
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/i/status/2062587421121028409
👩‍💻 چند نفر هنوز این اشتباه رو توی Validation لاراول انجام میدن؟ 👀

بیشتر مواقع برای بررسی وجود یک رکورد، این قانون رو می‌نویسیم:


Rule::exists('users', 'id')

اما یک مشکل وجود دارد...

اگر از Soft Delete استفاده می‌کنید، این Rule رکوردهای حذف‌شده را هم معتبر می‌داند. 😐

راه‌حل ساده است:


Rule::exists('users', 'id')->whereNull('deleted_at');


به این شکل فقط رکوردهای فعال اعتبارسنجی می‌شوند و دیگر شناسه کاربران Soft Deleted پذیرفته نخواهد شد.

این نکته کوچک می‌تواند از باگ‌های عجیبی جلوگیری کند؛ مخصوصاً در APIهایی که روی امنیت و صحت داده حساس هستند.
مدیریت
کنید؟

#Laravel #لاراول

📱 @MilwadKhosravi
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 یه نکته‌ی باحال توی لاراول که شاید خیلیا هنوز ازش استفاده نمی‌کنن!

اگه هنوز اینجوری می‌نویسی:
User::whereHas('posts', function ($query) {
$query->where('status', 'published');
})->with(['posts' => function ($query) {
$query->where('status', 'published');
}])->get();

😅 یه مشکل کوچیک داری...

همون شرط status = published رو دوبار نوشتی؛
یه بار برای whereHas() و یه بار هم برای with().

لاراول برای این قضیه یه متد تمیزتر داره:
User::withWhereHas('posts', function ($query) {
$query->where('status', 'published');
})->get();

🎯 با withWhereHas() هم رکوردهای اصلی فیلتر میشن، هم همون Relation با همون شرط Eager Load میشه.

### چرا بهتره؟ 🤔

کد کمتر
خوانایی بیشتر
حذف کدهای تکراری (DRY)
نگهداری و تغییرات راحت‌تر

💡 این قابلیت از اون ویژگی‌های کوچیک لاراوله که شاید زیاد به چشم نیاد، ولی وقتی توی پروژه‌های بزرگ ازش استفاده کنی، حسابی کدت تمیزتر و قابل نگهداری‌تر میشه.

🔥 شما قبلاً از withWhereHas() استفاده کردین یا هنوز همون ترکیب whereHas() + with() رو می‌نویسین؟

💬 نظرتون رو توی کامنت‌ها بنویسید.
‐------------
@DDNotes
-------------
#Laravel #PHP #Eloquent #LaravelTips #CleanCode #Backend #Programming
👍1
🚀 یه قابلیت کمتر شناخته‌شده‌ی لاراول که می‌تونه جون پروژه‌ رو نجات بده!

خیلی وقت‌ها تازه وقتی کاربران از کند بودن سایت شکایت می‌کنن، اون وقته که تازه می‌ریم دنبال پیدا کردن Queryهای کند! 😅

در حالی که لاراول خودش یه قابلیت داخلی داره که از همون اول، Queryهای کند رو بهت گزارش می‌ده.

کافیه اینو توی AppServiceProvider یا هر جای مناسب از پروژه‌ت قرار بدی:

DB::whenQueryingForLongerThan(500, function ($connection, $event) {
// Log or notify about slow queries
});

🎯 این متد هر Queryای که بیشتر از ۵۰۰ میلی‌ثانیه طول بکشه رو شناسایی می‌کنه تا قبل از اینکه به یه مشکل واقعی تبدیل بشه، ازش باخبر بشی.

## 🤔 چرا استفاده ازش ارزش داره؟

🔍 شناسایی Queryهای کند قبل از اینکه کاربر متوجه بشه.

پیدا کردن گلوگاه‌های عملکرد (Performance Bottlenecks) موقع توسعه، نه بعد از انتشار پروژه.

📈 بهینه‌سازی دیتابیس بر اساس داده‌های واقعی، نه حدس و گمان.

🛠️ کاهش زمان دیباگ و پیدا کردن مشکلات Performance.

---

💡 اگر این قابلیت رو با ابزارهایی مثل Laravel Pulse یا Laravel Telescope ترکیب کنی، دید خیلی بهتری نسبت به عملکرد دیتابیس و اپلیکیشن پیدا می‌کنی.

گاهی همین قابلیت‌های کوچیک لاراول می‌تونن ساعت‌ها زمان دیباگ و بهینه‌سازی رو برات ذخیره کنن.

🔥 شما تا حالا از DB::whenQueryingForLongerThan() استفاده کردین؟

یا برای پیدا کردن Queryهای کند از روش دیگه‌ای استفاده میکنین ؟
----------
@DDNotes
----------
#Laravel #PHP #Performance #Database #Eloquent #LaravelTips #Backend #WebDevelopment
Forwarded from Linuxor ?
من هیچ وقت نفهمیدم عربا چرا به لاراول می‌گن لارافیل؟ مگه "و" ندارن؟

شاید بخاطر اینه که پی اچ پی نمادش فیل هستش😂😂

@Linuxor
🚀 اگه هنوز از Pipeline توی لاراول استفاده نکردی، احتمالاً داری بخشی از قدرت این فریم‌ورک رو از دست میدی!

وقتی یه ورودی باید از چند مرحله پردازش عبور کنه، خیلی از ما یه عالمه if، foreach و شرط‌های تو در تو می‌نویسیم. 😅

اما لاراول یه راه خیلی تمیزتر و حرفه‌ای‌تر داره: Pipeline

فرض کن کاربر یه کامنت ارسال کرده و قبل از ذخیره شدن باید:

* ✂️ کلمات نامناسب حذف بشن.
* 🚫 اسپم تشخیص داده بشه.
* 🛡️ محتوای مخرب فیلتر بشه.
* 🔗 لینک‌های طولانی کوتاه بشن.

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

use App\Pipelines\Comments\RemoveProfanity;
use App\Pipelines\Comments\RemoveSpam;
use App\Pipelines\Comments\RemoveHarmfulContent;
use App\Pipelines\Comments\ShortenUrls;
use Illuminate\Pipeline\Pipeline;

$comment = app(Pipeline::class)
->send($request->validated('comment'))
->through([
RemoveProfanity::class,
RemoveSpam::class,
RemoveHarmfulContent::class,
ShortenUrls::class,
])
->thenReturn();

---

## 🎯 چرا Pipeline این‌قدر کاربردیه؟

هر کلاس فقط یک مسئولیت داره (Single Responsibility)

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

🧩 اضافه یا حذف کردن مراحل پردازش فقط با اضافه یا حذف کردن یک Pipe انجام می‌شه.

📖 کدها خواناتر می‌شن و نگهداری پروژه ساده‌تر خواهد بود.

♻️ حتی می‌تونی همین Pipeها رو در بخش‌های مختلف پروژه دوباره استفاده کنی.

---

## 🧩 هر Pipe چطور به داده دسترسی پیدا می‌کنه؟

هر Pipe یک کلاس ساده با متد handle هست.

داده‌ای که با send() ارسال کردی، به‌عنوان اولین پارامتر وارد متد handle() می‌شه و بعد از پردازش، با $next() به Pipe بعدی ارسال می‌شه.

مثلاً Pipe حذف کلمات نامناسب:

namespace App\Pipelines\Comments;

use Closure;

class RemoveProfanity
{
public function handle(string $comment, Closure $next): string
{
$badWords = ['badword1', 'badword2'];

$comment = str_replace($badWords, '***', $comment);

return $next($comment);
}
}

و Pipe تشخیص اسپم:

namespace App\Pipelines\Comments;

use Closure;

class RemoveSpam
{
public function handle(string $comment, Closure $next): string
{
if (str_contains($comment, 'Buy now')) {
throw new \Exception('Spam detected.');
}

return $next($comment);
}
}

در نهایت هم Pipeline به همین شکل اجرا می‌شه:

$comment = app(Pipeline::class)
->send($request->validated('comment'))
->through([
RemoveProfanity::class,
RemoveSpam::class,
RemoveHarmfulContent::class,
ShortenUrls::class,
])
->thenReturn();

📌 ترتیب اجرای Pipeها دقیقاً به این صورته:

کامنت اولیه


RemoveProfanity


RemoveSpam


RemoveHarmfulContent


ShortenUrls


نتیجه نهایی

---

## 💡 فقط String نیست!

نکته‌ی جالب اینه که Pipeها محدود به string نیستن. تقریباً هر نوع داده‌ای رو می‌تونی داخل Pipeline ارسال کنی، مثل:

* 👤 یک Model (مثل User)
* 📦 یک DTO
* 🗂️ یک آرایه
* 📚 یک Collection
* 🛠️ حتی یک Query Builder

مثلاً با یک Model:

$user = app(Pipeline::class)
->send($user)
->through([
VerifyEmail::class,
CheckSubscription::class,
AssignPermissions::class,
])
->thenReturn();

هر Pipe دقیقاً همون شیء User رو دریافت می‌کنه، تغییرات موردنیاز رو روی اون اعمال می‌کنه و با:

return $next($user);

اون رو به مرحله‌ی بعد ارسال می‌کنه.

---

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

من معمولاً از Pipeline برای این سناریوها استفاده می‌کنم:

🔹 پردازش فرم‌ها
🔹 اعتبارسنجی‌های چندمرحله‌ای
🔹 پردازش فایل‌ها و تصاویر
🔹 فیلتر کردن محتوا
🔹 ساخت Queryهای داینامیک

---

🔥 شما تا حالا از Illuminate\Pipeline\Pipeline توی پروژه‌هاتون استفاده کردین؟

یا هنوز همه‌ی منطق رو داخل یک Service یا Controller می‌نویسین؟ 👇

───────────────
📢 @DDNotes
───────────────

#Laravel #PHP #Pipeline #CleanCode #DesignPatterns #Backend #LaravelTips #SoftwareArchitecture
Forwarded from Linuxor ?
اینی که می‌بینید اسمش Magika هست گوگل به تازگی منتشرش کرده؛ یه سیستم بر پایه هوش مصنوعیه که می‌تونه محتوای واقعی هر فایلی رو تشخیص بده، حتی اگه فایل خودش رو یه چیز دیگه جا زده باشه.
مثلاً بدافزاری که قیافه‌ی یه فایل PDF رو گرفته، یا اسکریپت‌های مخفی که خودشون رو شبیه عکس نشون میدن.

این ابزار رایگانه و متن‌باز هم هست :

securityresearch.google/magika

@Linuxor
🚀 یه نکته‌ی کوچیک در Validation لاراول که می‌تونه جلوی باگ‌های عجیبی رو بگیره!

خیلی وقت‌ها برای اعتبارسنجی از Rule معروف required استفاده می‌کنیم، اما یه رفتار مهم داره که خیلی‌ها ازش خبر ندارن.

قانون required روی آرایه‌ی خالی ([]) هم خطا می‌ده.

مثلاً این Validation:

$request->validate([
'items' => ['required', 'array'],
]);

این درخواست رو رد می‌کنه:

{
"items": []
}

چون لاراول آرایه‌ی خالی رو هم یک مقدار "خالی" (Empty) در نظر می‌گیره و Rule required شکست می‌خوره.

---

## 🤔 اگه آرایه‌ی خالی معتبر باشه چی؟

فرض کن داری API یک سبد خرید رو پیاده‌سازی می‌کنی.

کاربر ممکنه هنوز هیچ محصولی اضافه نکرده باشه، پس این درخواست کاملاً معتبره:

{
"items": []
}

اما همچنان می‌خوای مطمئن بشی که کلید items حتماً داخل درخواست وجود داره.

اینجاست که Rule **present** به کارت میاد.

$request->validate([
'items' => ['present', 'array'],
]);

حالا رفتار لاراول اینطوری می‌شه:

این درخواست معتبره:

{
"items": []
}

اما این درخواست رد می‌شه:

{}

چون فیلد items بوجود داشته باشهشه**، حتی اگر مقدارش خالی باشه.

---
🎯 تفاوت required و present

required
فیلد باید وجود داشته باشه.
مقدار خالی مجاز نیست.

present
فیلد باید وجود داشته باشه.
مقدار خالی هم مجازه.
---

## 💡 چه زمانی از present استفاده کنیم؟

این Rule مخصوصاً توی این سناریوها خیلی کاربردیه:

🔹 توسعه APIهای REST

🔹 درخواست‌های PUT و PATCH

🔹 اعتبارسنجی آرایه‌هایی که ممکنه خالی باشن.

🔹 زمانی که می‌خوای «ارسال نشده»ه»*«ارسال شده ولی خالیه»ه»** تفاوت قائل بشی.

---
پس این تفاوت رو همیشه یادت باشه:ه:**

* از **required** استفاده کن وقتی فیهم وجود داشته باشه و هم مقدار داشته باشهه باشه**.
* از **present** استفاده وجود داشتن فیلدداشتن فیلد** برات مهمه و مقدار خالی هم قابل قبوله.

همین تفاوت کوچیک می‌تونه رفتار Validation پروژه‌ات رو خیلی دقیق‌تر و قابل پیش‌بینی‌تر کنه.

---

🔥 شما تا حالا از Rule present توی پروژه‌هاتون استفاده کردین؟

یا همیشه برای این سناریوها سراغ required می‌رفتین؟ 👇

───────────────
@DDNotes
───────────────

#Laravel #PHP #Validation #LaravelTips #Backend #API #CleanCode #WebDevelopment