Forwarded from یک برنامه نویس تنبل (Arshia)
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 laravel-news
کدام گزینه دربارهی expose: 3306 صحیح است؟
Anonymous Quiz
8%
حذف expose باعث میشود کانتینر laravel دیگر نتواند به mysql متصل شود.
14%
وجود expose برای دسترسی از سیستم میزبان (Host) به MySQL الزامی است.
55%
اگر هر دو سرویس در یک Docker Network باشند، حذف expose تأثیری بر ارتباط laravel و mysql ندارد.
23%
expose همان عملکرد ports را دارد و پورت 3306 را روی سیستم میزبان منتشر میکند.
Forwarded from Golden Code (Ali 🇨🇴)
بیشتر ما مینویسیم:
اما اگه انتظار دارین دقیقاً یک رکورد وجود داشته باشه، "sole()" میتونه انتخب بهتری باشه:
تفاوتشون؟
شرایطی رو تصور کنید که به اشتباه دو رکورد با ایمیل یکسان داریم.
اگه از sole استفاده کنیم بهمون خطا میده چون انتظار داره فقط یک رکورد برگرده،
اما firstOrFail میره و اولین رکورد رو برامون میاره
✅ "firstOrFail()"
- اگه رکوردی نباشد : خطا
- اگر چند رکورد باشن : اولین رکورد رو برمیگردونه
✅ "sole()"
- اگه رکوردی نباشه :خطا
- اگر چند رکورد باشد : خطا
این تفاوت باعث میشه اگر دادههای تکراری به اشتباه وارد دیتابیس بشن، خیلی زودتر متوجه مشکل بشیم.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/i/status/2062587421121028409
$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
X (formerly Twitter)
Punyapal Shah (@MrPunyapal) on X
Laravel tip:
If your query should return exactly one record, `sole()` expresses that intent better than `firstOrFail()`.
It will fail if zero records exist and also if multiple records exist.
Small difference. Big guarantee. 👇
If your query should return exactly one record, `sole()` expresses that intent better than `firstOrFail()`.
It will fail if zero records exist and also if multiple records exist.
Small difference. Big guarantee. 👇
Forwarded from Milwad Khosravi | میلاد خسروی
بیشتر مواقع برای بررسی وجود یک رکورد، این قانون رو مینویسیم:
Rule::exists('users', 'id')
اما یک مشکل وجود دارد...
اگر از Soft Delete استفاده میکنید، این Rule رکوردهای حذفشده را هم معتبر میداند. 😐
راهحل ساده است:
Rule::exists('users', 'id')->whereNull('deleted_at');
به این شکل فقط رکوردهای فعال اعتبارسنجی میشوند و دیگر شناسه کاربران Soft Deleted پذیرفته نخواهد شد.
این نکته کوچک میتواند از باگهای عجیبی جلوگیری کند؛ مخصوصاً در APIهایی که روی امنیت و صحت داده حساس هستند.کنید؟
مدیریت
#Laravel #لاراول
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 یه نکتهی باحال توی لاراول که شاید خیلیا هنوز ازش استفاده نمیکنن!
اگه هنوز اینجوری مینویسی:
😅 یه مشکل کوچیک داری...
همون شرط status = published رو دوبار نوشتی؛
یه بار برای whereHas() و یه بار هم برای with().
لاراول برای این قضیه یه متد تمیزتر داره:
🎯 با withWhereHas() هم رکوردهای اصلی فیلتر میشن، هم همون Relation با همون شرط Eager Load میشه.
### چرا بهتره؟ 🤔
✅ کد کمتر
✅ خوانایی بیشتر
✅ حذف کدهای تکراری (DRY)
✅ نگهداری و تغییرات راحتتر
💡 این قابلیت از اون ویژگیهای کوچیک لاراوله که شاید زیاد به چشم نیاد، ولی وقتی توی پروژههای بزرگ ازش استفاده کنی، حسابی کدت تمیزتر و قابل نگهداریتر میشه.
🔥 شما قبلاً از withWhereHas() استفاده کردین یا هنوز همون ترکیب whereHas() + with() رو مینویسین؟
💬 نظرتون رو توی کامنتها بنویسید.
‐------------
@DDNotes
-------------
#Laravel #PHP #Eloquent #LaravelTips #CleanCode #Backend #Programming
اگه هنوز اینجوری مینویسی:
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های کند رو بهت گزارش میده.
کافیه اینو توی
🎯 این متد هر Queryای که بیشتر از ۵۰۰ میلیثانیه طول بکشه رو شناسایی میکنه تا قبل از اینکه به یه مشکل واقعی تبدیل بشه، ازش باخبر بشی.
## 🤔 چرا استفاده ازش ارزش داره؟
🔍 شناسایی Queryهای کند قبل از اینکه کاربر متوجه بشه.
⚡ پیدا کردن گلوگاههای عملکرد (Performance Bottlenecks) موقع توسعه، نه بعد از انتشار پروژه.
📈 بهینهسازی دیتابیس بر اساس دادههای واقعی، نه حدس و گمان.
🛠️ کاهش زمان دیباگ و پیدا کردن مشکلات Performance.
---
💡 اگر این قابلیت رو با ابزارهایی مثل Laravel Pulse یا Laravel Telescope ترکیب کنی، دید خیلی بهتری نسبت به عملکرد دیتابیس و اپلیکیشن پیدا میکنی.
گاهی همین قابلیتهای کوچیک لاراول میتونن ساعتها زمان دیباگ و بهینهسازی رو برات ذخیره کنن.
🔥 شما تا حالا از
یا برای پیدا کردن Queryهای کند از روش دیگهای استفاده میکنین ؟
----------
@DDNotes
----------
#Laravel #PHP #Performance #Database #Eloquent #LaravelTips #Backend #WebDevelopment
خیلی وقتها تازه وقتی کاربران از کند بودن سایت شکایت میکنن، اون وقته که تازه میریم دنبال پیدا کردن 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
🚀 اگه هنوز از Pipeline توی لاراول استفاده نکردی، احتمالاً داری بخشی از قدرت این فریمورک رو از دست میدی!
وقتی یه ورودی باید از چند مرحله پردازش عبور کنه، خیلی از ما یه عالمه
اما لاراول یه راه خیلی تمیزتر و حرفهایتر داره: Pipeline
فرض کن کاربر یه کامنت ارسال کرده و قبل از ذخیره شدن باید:
* ✂️ کلمات نامناسب حذف بشن.
* 🚫 اسپم تشخیص داده بشه.
* 🛡️ محتوای مخرب فیلتر بشه.
* 🔗 لینکهای طولانی کوتاه بشن.
بهجای اینکه همهی این منطق رو داخل یه متد بزرگ بنویسی، هر مرحله رو داخل یه کلاس جدا قرار بده و با
---
## 🎯 چرا Pipeline اینقدر کاربردیه؟
✅ هر کلاس فقط یک مسئولیت داره (Single Responsibility)
🧪 تست کردن هر مرحله بهصورت مستقل خیلی راحتتره.
🧩 اضافه یا حذف کردن مراحل پردازش فقط با اضافه یا حذف کردن یک Pipe انجام میشه.
📖 کدها خواناتر میشن و نگهداری پروژه سادهتر خواهد بود.
♻️ حتی میتونی همین Pipeها رو در بخشهای مختلف پروژه دوباره استفاده کنی.
---
## 🧩 هر Pipe چطور به داده دسترسی پیدا میکنه؟
هر Pipe یک کلاس ساده با متد
دادهای که با
مثلاً Pipe حذف کلمات نامناسب:
و Pipe تشخیص اسپم:
در نهایت هم Pipeline به همین شکل اجرا میشه:
📌 ترتیب اجرای Pipeها دقیقاً به این صورته:
---
## 💡 فقط String نیست!
نکتهی جالب اینه که Pipeها محدود به
* 👤 یک Model (مثل
* 📦 یک DTO
* 🗂️ یک آرایه
* 📚 یک Collection
* 🛠️ حتی یک Query Builder
مثلاً با یک Model:
هر Pipe دقیقاً همون شیء
اون رو به مرحلهی بعد ارسال میکنه.
---
💡 هر جا دادهای قرار باشه از چند مرحلهی پردازش عبور کنه، Pipeline یکی از بهترین انتخابهاست.
من معمولاً از Pipeline برای این سناریوها استفاده میکنم:
🔹 پردازش فرمها
🔹 اعتبارسنجیهای چندمرحلهای
🔹 پردازش فایلها و تصاویر
🔹 فیلتر کردن محتوا
🔹 ساخت Queryهای داینامیک
---
🔥 شما تا حالا از
یا هنوز همهی منطق رو داخل یک Service یا Controller مینویسین؟ 👇
───────────────
📢 @DDNotes
───────────────
#Laravel #PHP #Pipeline #CleanCode #DesignPatterns #Backend #LaravelTips #SoftwareArchitecture
وقتی یه ورودی باید از چند مرحله پردازش عبور کنه، خیلی از ما یه عالمه
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
مثلاً بدافزاری که قیافهی یه فایل PDF رو گرفته، یا اسکریپتهای مخفی که خودشون رو شبیه عکس نشون میدن.
این ابزار رایگانه و متنباز هم هست :
securityresearch.google/magika
@Linuxor
🚀 یه نکتهی کوچیک در Validation لاراول که میتونه جلوی باگهای عجیبی رو بگیره!
خیلی وقتها برای اعتبارسنجی از Rule معروف
❌ قانون
مثلاً این Validation:
این درخواست رو رد میکنه:
چون لاراول آرایهی خالی رو هم یک مقدار "خالی" (Empty) در نظر میگیره و Rule
---
## 🤔 اگه آرایهی خالی معتبر باشه چی؟
فرض کن داری API یک سبد خرید رو پیادهسازی میکنی.
کاربر ممکنه هنوز هیچ محصولی اضافه نکرده باشه، پس این درخواست کاملاً معتبره:
اما همچنان میخوای مطمئن بشی که کلید
اینجاست که Rule **
حالا رفتار لاراول اینطوری میشه:
✅ این درخواست معتبره:
❌ اما این درخواست رد میشه:
چون فیلد
---
🎯 تفاوت required و present
required
✅ فیلد باید وجود داشته باشه.
❌ مقدار خالی مجاز نیست.
present
✅ فیلد باید وجود داشته باشه.
✅ مقدار خالی هم مجازه.
---
## 💡 چه زمانی از
این Rule مخصوصاً توی این سناریوها خیلی کاربردیه:
🔹 توسعه APIهای REST
🔹 درخواستهای
🔹 اعتبارسنجی آرایههایی که ممکنه خالی باشن.
🔹 زمانی که میخوای «ارسال نشده»ه»*«ارسال شده ولی خالیه»ه»** تفاوت قائل بشی.
---
پس این تفاوت رو همیشه یادت باشه:ه:**
* از **
* از **
همین تفاوت کوچیک میتونه رفتار Validation پروژهات رو خیلی دقیقتر و قابل پیشبینیتر کنه.
---
🔥 شما تا حالا از Rule
یا همیشه برای این سناریوها سراغ
───────────────
@DDNotes
───────────────
#Laravel #PHP #Validation #LaravelTips #Backend #API #CleanCode #WebDevelopment
خیلی وقتها برای اعتبارسنجی از 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