🔥 جادوی Model Events: مدیریت هوشمند رویدادها در لاراول 💡
اگه برنامهنویس لاراولی هستی، حتماً میدونی که هر مدل تو پروژهت کلی عملیات پشتصحنه داره، مثل ذخیرهسازی، حذف، بهروزرسانی و غیره. حالا فکر کن بتونی این عملیاتها رو بهطور خودکار و هوشمند مدیریت کنی! 😍
اینجاست که Model Events وارد بازی میشه و کارتو راحت میکنه.
---
🌟 یه مثال ساده: تولید UUID برای کاربران جدید 🚀
فرض کن میخوای برای هر کاربر جدید، بهصورت خودکار یه UUID منحصربهفرد تولید بشه. به جای اینکه این منطق رو تو کنترلر یا جاهای دیگه بنویسی، مستقیم میتونی تو مدل کاربر انجامش بدی.
🛠️ ۱. اضافه کردن فیلد UUID
اول باید ستون
توی فایل مایگریشن:
حالا با یه دستور ساده، مایگرشین رو اجرا کن:
🛠️ ۲. تعریف Model Event
حالا وقتشه جادو کنیم! 🪄 تو مدل **User**، این کد رو اضافه کن:
🛠️ ۳. تست کنیم؟ 😎
وقتی یه کاربر جدید بسازی، UUID بهطور خودکار مقداردهی میشه:
توی دیتابیس در فیلد uuid چنین چیزی اتوماتیک :
ساخته میشه
🌟 چرا باید از Model Events استفاده کنی؟
- کد مرتبتر و شفافتر: دیگه لازم نیست منطق این عملیات تو کنترلرها و جاهای دیگه پخش بشه.
- صرفهجویی در زمان: فقط یه بار تعریف میکنی و همیشه اجرا میشه.
- هوشمند و خودکار: خیالت راحت که این منطق همیشه و بدون اشتباه اجرا میشه.
---
🌟 کجاها میتونی ازش استفاده کنی؟
- قبل از حذف دادهها، مثلاً ثبت لاگ یا جلوگیری از حذف.
- ارسال نوتیفیکیشن بعد از ایجاد یا بهروزرسانی.
- تنظیم مقادیر پیشفرض مثل تاریخ یا وضعیت.
---
😃 حالا نوبت شماست!
شما چه تجربهای تو استفاده از Model Events دارید؟ اگه ایده یا کاربرد دیگهای به ذهنتون میرسه، حتماً اینجا برام بنویسید. دوست دارم نظراتتون رو بدونم! 👇
——
راستی توی کانال تلگرامی : کُدفیوز : آموزش و نکات حرفه ای php و لاراول
https://t.me/codefuse1
قراره این مسیر رو ادامه بدیم ...
اگه برنامهنویس لاراولی هستی، حتماً میدونی که هر مدل تو پروژهت کلی عملیات پشتصحنه داره، مثل ذخیرهسازی، حذف، بهروزرسانی و غیره. حالا فکر کن بتونی این عملیاتها رو بهطور خودکار و هوشمند مدیریت کنی! 😍
اینجاست که Model Events وارد بازی میشه و کارتو راحت میکنه.
---
🌟 یه مثال ساده: تولید UUID برای کاربران جدید 🚀
فرض کن میخوای برای هر کاربر جدید، بهصورت خودکار یه UUID منحصربهفرد تولید بشه. به جای اینکه این منطق رو تو کنترلر یا جاهای دیگه بنویسی، مستقیم میتونی تو مدل کاربر انجامش بدی.
🛠️ ۱. اضافه کردن فیلد UUID
اول باید ستون
uuid رو به جدول کاربران اضافه کنی:
php artisan make:migration add_uuid_to_users_table --table=users
توی فایل مایگریشن:
Schema::table('users', function (Blueprint $table) {
$table->uuid('uuid')->nullable()->after('id');
});
حالا با یه دستور ساده، مایگرشین رو اجرا کن:
php artisan migrate
🛠️ ۲. تعریف Model Event
حالا وقتشه جادو کنیم! 🪄 تو مدل **User**، این کد رو اضافه کن:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class User extends Model {
protected static function booted() {
static::creating(function ($user) {
$user->uuid = Str::uuid();
});
}
}
🛠️ ۳. تست کنیم؟ 😎
وقتی یه کاربر جدید بسازی، UUID بهطور خودکار مقداردهی میشه:
User::create([
'name' => 'Sara',
'email' => 'sara@example.com',
'password' => bcrypt('password'),
]);
توی دیتابیس در فیلد uuid چنین چیزی اتوماتیک :
5f7a1e82-d03a-4b32-b0e6-6a23f542e109
ساخته میشه
🌟 چرا باید از Model Events استفاده کنی؟
- کد مرتبتر و شفافتر: دیگه لازم نیست منطق این عملیات تو کنترلرها و جاهای دیگه پخش بشه.
- صرفهجویی در زمان: فقط یه بار تعریف میکنی و همیشه اجرا میشه.
- هوشمند و خودکار: خیالت راحت که این منطق همیشه و بدون اشتباه اجرا میشه.
---
🌟 کجاها میتونی ازش استفاده کنی؟
- قبل از حذف دادهها، مثلاً ثبت لاگ یا جلوگیری از حذف.
- ارسال نوتیفیکیشن بعد از ایجاد یا بهروزرسانی.
- تنظیم مقادیر پیشفرض مثل تاریخ یا وضعیت.
---
😃 حالا نوبت شماست!
شما چه تجربهای تو استفاده از Model Events دارید؟ اگه ایده یا کاربرد دیگهای به ذهنتون میرسه، حتماً اینجا برام بنویسید. دوست دارم نظراتتون رو بدونم! 👇
——
راستی توی کانال تلگرامی : کُدفیوز : آموزش و نکات حرفه ای php و لاراول
https://t.me/codefuse1
قراره این مسیر رو ادامه بدیم ...
👍3🔥1👌1
🎯 میدونید Laravel Herd چیه و چه امکاناتی داره ؟
من توی کانال تلگرامی کدفیوز : https://t.me/codefuse1 تلاش میکنم جدیدترین مباحث لاراول رو پوشش بدهم
و همچنین به هر چیزی که یک برنامه نویس لاراول نیاز داره اشاره کنم پس در این پست همراه من باشید که قصد دارم در خصوص Laravel Herd صحبت کنیم که چه امکاناتی داره و چه موقع بهتر است
اگر در شروع راه هستید و قصد دارید از WAMP ویا XAMPP استفاده کنید ابزارLaravel Herd برای شما گزینه بهتری هست
چرا ؟
1️⃣ نصب و راهاندازی سریع (بدون نیاز به Docker)
برخلاف ابزارهایی مثل Laradock یا Laravel Sail، Herd به Docker متکی نیست؛ بنابراین، فرآیند راهاندازی بسیار سادهتر میشه.
2️⃣ پشتیبانی از نسخههای مختلف PHP
بهسادگی میتونید بین ورژنهای مختلف PHP سوئیچ کنید و هر پروژه رو با نسخهٔ مناسب خودش اجرا کنید.
3️⃣ وبسرور و پایگاه داده آماده
بهصورت پیشفرض از Nginx و MySQL استفاده میکنه. همچنین امکان استفاده از phpMyAdmin و Mailhog برای مدیریت دیتابیس و تست ایمیل وجود داره.
4️⃣ ایجاد گواهی SSL
میتونید بهراحتی گواهی SSL برای دامنههای لوکال بسازید و با HTTPS کار کنید.
5️⃣ مدیریت لاگ در لحظه
یک بخش لاگ داره که به شما اجازه میده رویدادهای برنامه و خطاها رو بهصورت زنده رصد کنید.
6️⃣ پشتیبانی از Queue Worker و Redis
اگر پروژههاتون به صفها و Redis نیاز دارن، Herd از پیش این امکانات رو پیکربندی کرده.
7️⃣ سازگاری با مک و ویندوز
فرقی نداره کاربر macOS هستید یا ویندوز؛ در هر دو سیستمعامل میتونید از Herd استفاده کنید.
⚠️ اگر بهصورت حرفهای کار می کنید Herd گزینه خیلی خوبی برایتان نخواهد بود
در عین حال، اگر قصد دارید پروژههای سنگینتر یا چندنفره رو مدیریت کنید و نیاز به کانتینرهای ایزوله دارید، پیشنهاد میشه به ابزارهای Dockerمحور مثل Laradock یا Laravel Sail هم نگاهی بندازید. در پستهای آینده، این ابزارها رو بهصورت جدیتر با Herd و سایر روشها مقایسه خواهیم کرد.
⁉️ جمعبندی
ابزار Laravel Herd با تمرکز بر سادهسازی محیط توسعه و رفع دغدغههای پیکربندی، میتونه ابزار جذابی برای شروع سریع پروژههای Laravel باشه. اگر تجربه یا سوالی دربارهٔ Herd دارید، خوشحال میشیم بشنویم!
#LaravelHerd #Laravel #PHP #Developer #Windows #MacOS #LocalEnvironment #SSL #MySQL #Redis #MailHog #Laradock #LaravelSail
من توی کانال تلگرامی کدفیوز : https://t.me/codefuse1 تلاش میکنم جدیدترین مباحث لاراول رو پوشش بدهم
و همچنین به هر چیزی که یک برنامه نویس لاراول نیاز داره اشاره کنم پس در این پست همراه من باشید که قصد دارم در خصوص Laravel Herd صحبت کنیم که چه امکاناتی داره و چه موقع بهتر است
اگر در شروع راه هستید و قصد دارید از WAMP ویا XAMPP استفاده کنید ابزارLaravel Herd برای شما گزینه بهتری هست
چرا ؟
1️⃣ نصب و راهاندازی سریع (بدون نیاز به Docker)
برخلاف ابزارهایی مثل Laradock یا Laravel Sail، Herd به Docker متکی نیست؛ بنابراین، فرآیند راهاندازی بسیار سادهتر میشه.
2️⃣ پشتیبانی از نسخههای مختلف PHP
بهسادگی میتونید بین ورژنهای مختلف PHP سوئیچ کنید و هر پروژه رو با نسخهٔ مناسب خودش اجرا کنید.
3️⃣ وبسرور و پایگاه داده آماده
بهصورت پیشفرض از Nginx و MySQL استفاده میکنه. همچنین امکان استفاده از phpMyAdmin و Mailhog برای مدیریت دیتابیس و تست ایمیل وجود داره.
4️⃣ ایجاد گواهی SSL
میتونید بهراحتی گواهی SSL برای دامنههای لوکال بسازید و با HTTPS کار کنید.
5️⃣ مدیریت لاگ در لحظه
یک بخش لاگ داره که به شما اجازه میده رویدادهای برنامه و خطاها رو بهصورت زنده رصد کنید.
6️⃣ پشتیبانی از Queue Worker و Redis
اگر پروژههاتون به صفها و Redis نیاز دارن، Herd از پیش این امکانات رو پیکربندی کرده.
7️⃣ سازگاری با مک و ویندوز
فرقی نداره کاربر macOS هستید یا ویندوز؛ در هر دو سیستمعامل میتونید از Herd استفاده کنید.
⚠️ اگر بهصورت حرفهای کار می کنید Herd گزینه خیلی خوبی برایتان نخواهد بود
در عین حال، اگر قصد دارید پروژههای سنگینتر یا چندنفره رو مدیریت کنید و نیاز به کانتینرهای ایزوله دارید، پیشنهاد میشه به ابزارهای Dockerمحور مثل Laradock یا Laravel Sail هم نگاهی بندازید. در پستهای آینده، این ابزارها رو بهصورت جدیتر با Herd و سایر روشها مقایسه خواهیم کرد.
⁉️ جمعبندی
ابزار Laravel Herd با تمرکز بر سادهسازی محیط توسعه و رفع دغدغههای پیکربندی، میتونه ابزار جذابی برای شروع سریع پروژههای Laravel باشه. اگر تجربه یا سوالی دربارهٔ Herd دارید، خوشحال میشیم بشنویم!
#LaravelHerd #Laravel #PHP #Developer #Windows #MacOS #LocalEnvironment #SSL #MySQL #Redis #MailHog #Laradock #LaravelSail
👍3🔥1👏1
🔒 آموزش رمزنگاری فایلهای .env در لاراول
🚨 چرا باید فایلهای .enb را رمزنگاری کنیم؟
فایلهای محیطی (مانند `.env`) اطلاعات حساسی نظیر کلیدهای API، رمزهای پایگاه داده و سایر اطلاعات مهم را در خود ذخیره میکنند. ذخیره این فایلها بهصورت غیر رمزنگاریشده در مخازن گیت یا روی سرور production خطرناک است. اما لاراول به شما امکان میدهد این فایلها را رمزنگاری کنید تا با اطمینان بیشتری در مخزن سورس کنترل یا روی سرور production قرار گیرند.
---
🔐 رمزنگاری فایلهای محیطی
برای رمزنگاری فایل .env، دستور زیر را اجرا کنید:
🔑 پس از اجرای دستور، فایل
کلید رمزنگاری نیز در خروجی این دستور نمایش داده میشود؛ این کلید را در یک جای امن ذخیره کنید. برای رمزگشایی .env به آن نیاز خواهید داشت
✅ اگر بخواهید کلید رمزنگاری خود را مشخص کنید، میتوانید از گزینه
💡 توجه داشته باشید که طول کلید ارائهشده باید با الگوریتم رمزنگاری مورد استفاده هماهنگ باشد.
کلید رمزنگاری (Encryption Key) بخش مهمی از فرآیند رمزنگاری است. هر الگوریتم رمزنگاری نیاز به طول کلید مشخصی دارد که در صورت عدم تطابق، رمزنگاری یا رمزگشایی کار نخواهد کرد و با خطا روبرو میشوید.
مثال در لاراول:
AES-256-CBC:
- نیاز به کلید 32 کاراکتری دارد.
- مثال:
AES-128-CBC:
- نیاز به کلید 16 کاراکتری دارد.
- مثال:
### چرا طول کلید مهم است؟
- امنیت بیشتر: طول بیشتر کلید باعث افزایش امنیت میشود.
- پشتیبانی الگوریتم: هر الگوریتم فقط طول خاصی را میپذیرد.
⚠️ اگر طول کلید مناسب نباشد، خطای زیر ظاهر میشود:
لاراول بهصورت پیشفرض از الگوریتم AES-256-CBC استفاده میکند که نیازمند کلیدی به طول 32 کاراکتر است.
برای استفاده از الگوریتمهای دیگر، گزینه
🌐 اگر چندین فایل محیطی دارید (مانند
---
🔓 رمزگشایی فایلهای محیطی
برای رمزگشایی فایلهای محیطی، از دستور زیر استفاده کنید:
🔑 لاراول کلید رمزنگاری را از متغیر محیطی
همچنین میتوانید کلید را مستقیماً با گزینه
✅ با اجرای این دستور، محتوای فایل
برای استفاده از الگوریتمهای دیگر در رمزگشایی، میتوانید گزینه
🌐 اگر چندین فایل .env دارید، میتوانید فایل موردنظر را با گزینه
❗ اگر فایل
---
✨ با استفاده از این قابلیت، امنیت پروژه لاراول خود را به سطح بالاتری ببرید و اطلاعات حساس را با اطمینان مدیریت کنید.
🛡️ رمزنگاری امن، پروژهای امنتر!
🚨 چرا باید فایلهای .enb را رمزنگاری کنیم؟
فایلهای محیطی (مانند `.env`) اطلاعات حساسی نظیر کلیدهای API، رمزهای پایگاه داده و سایر اطلاعات مهم را در خود ذخیره میکنند. ذخیره این فایلها بهصورت غیر رمزنگاریشده در مخازن گیت یا روی سرور production خطرناک است. اما لاراول به شما امکان میدهد این فایلها را رمزنگاری کنید تا با اطمینان بیشتری در مخزن سورس کنترل یا روی سرور production قرار گیرند.
---
🔐 رمزنگاری فایلهای محیطی
برای رمزنگاری فایل .env، دستور زیر را اجرا کنید:
php artisan env:encrypt
🔑 پس از اجرای دستور، فایل
.env شما رمزنگاری شده و بهصورت یک فایل جدید به نام .env.encrypted ذخیره میشود.کلید رمزنگاری نیز در خروجی این دستور نمایش داده میشود؛ این کلید را در یک جای امن ذخیره کنید. برای رمزگشایی .env به آن نیاز خواهید داشت
✅ اگر بخواهید کلید رمزنگاری خود را مشخص کنید، میتوانید از گزینه
--key استفاده کنید:
php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
💡 توجه داشته باشید که طول کلید ارائهشده باید با الگوریتم رمزنگاری مورد استفاده هماهنگ باشد.
کلید رمزنگاری (Encryption Key) بخش مهمی از فرآیند رمزنگاری است. هر الگوریتم رمزنگاری نیاز به طول کلید مشخصی دارد که در صورت عدم تطابق، رمزنگاری یا رمزگشایی کار نخواهد کرد و با خطا روبرو میشوید.
مثال در لاراول:
AES-256-CBC:
- نیاز به کلید 32 کاراکتری دارد.
- مثال:
php artisan env:encrypt --key=ABCDEFGHIJKLMNOPQRSTUVWX123456
AES-128-CBC:
- نیاز به کلید 16 کاراکتری دارد.
- مثال:
php artisan env:encrypt --key=ABCDEFGH12345678 --cipher=AES-128-CBC
### چرا طول کلید مهم است؟
- امنیت بیشتر: طول بیشتر کلید باعث افزایش امنیت میشود.
- پشتیبانی الگوریتم: هر الگوریتم فقط طول خاصی را میپذیرد.
⚠️ اگر طول کلید مناسب نباشد، خطای زیر ظاهر میشود:
The key length does not match the requirements of the cipher.
لاراول بهصورت پیشفرض از الگوریتم AES-256-CBC استفاده میکند که نیازمند کلیدی به طول 32 کاراکتر است.
برای استفاده از الگوریتمهای دیگر، گزینه
--cipher را اضافه کنید:
php artisan env:encrypt --cipher=AES-128-CBC
🌐 اگر چندین فایل محیطی دارید (مانند
.env و .env.staging`)، میتوانید فایل موردنظر را با استفاده از گزینه `--env مشخص کنید:
php artisan env:encrypt --env=staging
---
🔓 رمزگشایی فایلهای محیطی
برای رمزگشایی فایلهای محیطی، از دستور زیر استفاده کنید:
php artisan env:decrypt
🔑 لاراول کلید رمزنگاری را از متغیر محیطی
LARAVEL_ENV_ENCRYPTION_KEY دریافت میکند.همچنین میتوانید کلید را مستقیماً با گزینه
--key ارائه دهید:
php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
✅ با اجرای این دستور، محتوای فایل
.env.encrypted رمزگشایی شده و در فایل .env ذخیره میشود.برای استفاده از الگوریتمهای دیگر در رمزگشایی، میتوانید گزینه
--cipher را اضافه کنید:
php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC
🌐 اگر چندین فایل .env دارید، میتوانید فایل موردنظر را با گزینه
--env مشخص کنید:
php artisan env:decrypt --env=staging
❗ اگر فایل
.env موجود باشد و بخواهید آن را بازنویسی کنید، از گزینه --force استفاده کنید:
php artisan env:decrypt --force
---
✨ با استفاده از این قابلیت، امنیت پروژه لاراول خود را به سطح بالاتری ببرید و اطلاعات حساس را با اطمینان مدیریت کنید.
🛡️ رمزنگاری امن، پروژهای امنتر!
👍6👌5
🧑💻 اهمیت
در دیتابیسها، collation نحوه مقایسه و ترتیب دادههای متنی (مثل رشتهها) را تعیین میکند. هنگام استفاده از دیتابیسهایی مثل MySQL، انتخاب collation مناسب میتواند تأثیر زیادی بر روی عملکرد، جستجوها و رفتار مقایسهای دادهها داشته باشد.
در این پست به Collation های مختلف در MySQL، تفاوتها و اهمیت آنها به خصوص در رابطه با حساسیت به حروف بزرگ و کوچک و چگونگی استفاده از آنها با مثالهای SQL پرداختهایم. ⚙️
🧐 انواع Collation در MySQL
دیتابیس MySQL از دو نوع اصلی collation پشتیبانی میکند:
1.نوع اول : هر نوع Collation که _ci دارد (case-insensitive)مقایسهها بدون توجه به حروف بزرگ و کوچک انجام میشود.
2. نوع دوم : هر نوع Collation که _bin دارد (case-sensitive): مقایسهها حساس به حروف بزرگ و کوچک است.
1.نوع اول : هر نوع Collation که _ci دارد (case-insensitive) ❌🔠
این نوع از collation ها برای مقایسه رشتهها حساس به حروف بزرگ و کوچک نیستند. به این معنی که وقتی دو رشته را با این collation مقایسه میکنید، تفاوتهای حروف بزرگ و کوچک در نظر گرفته نمیشود.
مثالهایی از collation های `*_ci`:
-
-
💡 مثال:
فرض کنید جدول
حالا اگر بخواهیم جستجویی انجام دهیم و رشتهای به شکل
نتیجه:
- چون collation
2. هر نوع Collation که _bin دارد (case-sensitive) ✅🔡
در این نوع از collation ها، مقایسه رشتهها حساس به حروف بزرگ و کوچک است. به این معنی که
مثالهایی از collation های `*_bin`:
-
-
💡 مثال:
حال فرض کنید همان جدول products را داریم، اما این بار collation ستون
حالا اگر دوباره دو کد محصول را وارد کنیم:
و بخواهیم جستجویی انجام دهیم برای
نتیجه:
- در اینجا چون collation
⚡ تفاوت در عملکرد
-در خوص Performance : زمانی که از
📋 جمعبندی
- در نوع اول : هر نوع Collation که _ci دارد مقایسهها حساس به حروف بزرگ و کوچک نیستند. به عنوان مثال در کالکشن utf8mb4_unicode_ci رفتار روی رکورد های
- در نوع دوم : هر نوع Collation که _bin دارد مقایسهها حساس به حروف بزرگ و کوچک هستند. به عنوان مثال در کالکشن utf8mb4_bin رفتار روی رکورد های
انتخاب بین این دو نوع collation بستگی به نیاز شما دارد: اگر حساسیت به حروف بزرگ و کوچک برای شما مهم است، از
collation در دیتابیس و تفاوتهای آن در MySQL 📊در دیتابیسها، collation نحوه مقایسه و ترتیب دادههای متنی (مثل رشتهها) را تعیین میکند. هنگام استفاده از دیتابیسهایی مثل MySQL، انتخاب collation مناسب میتواند تأثیر زیادی بر روی عملکرد، جستجوها و رفتار مقایسهای دادهها داشته باشد.
در این پست به Collation های مختلف در MySQL، تفاوتها و اهمیت آنها به خصوص در رابطه با حساسیت به حروف بزرگ و کوچک و چگونگی استفاده از آنها با مثالهای SQL پرداختهایم. ⚙️
🧐 انواع Collation در MySQL
دیتابیس MySQL از دو نوع اصلی collation پشتیبانی میکند:
1.نوع اول : هر نوع Collation که _ci دارد (case-insensitive)مقایسهها بدون توجه به حروف بزرگ و کوچک انجام میشود.
2. نوع دوم : هر نوع Collation که _bin دارد (case-sensitive): مقایسهها حساس به حروف بزرگ و کوچک است.
1.نوع اول : هر نوع Collation که _ci دارد (case-insensitive) ❌🔠
این نوع از collation ها برای مقایسه رشتهها حساس به حروف بزرگ و کوچک نیستند. به این معنی که وقتی دو رشته را با این collation مقایسه میکنید، تفاوتهای حروف بزرگ و کوچک در نظر گرفته نمیشود.
مثالهایی از collation های `*_ci`:
-
utf8mb4_unicode_ci-
utf8_general_ci💡 مثال:
فرض کنید جدول
products دارید که در آن یک ستون به نام product_code با collation utf8mb4_unicode_ci داریم و دو کد محصول وارد کردهایم:
INSERT INTO products (product_code, price)
VALUES ('Y1J09bGxwM', 100),
('Y1J09bgXwM', 200);
حالا اگر بخواهیم جستجویی انجام دهیم و رشتهای به شکل
Y1J09bGxwM را جستجو کنیم:
SELECT * FROM products WHERE product_code = 'Y1J09bGxwM';
نتیجه:
- چون collation
utf8mb4_unicode_ci حساس به حروف بزرگ و کوچک نیست، این کوئری هر دو مقدار Y1J09bGxwM و Y1J09bgXwM را به عنوان یکسان میبیند و نتیجه یکسان خواهد بود. 👫2. هر نوع Collation که _bin دارد (case-sensitive) ✅🔡
در این نوع از collation ها، مقایسه رشتهها حساس به حروف بزرگ و کوچک است. به این معنی که
A و a به عنوان دو حرف مختلف در نظر گرفته میشوند.مثالهایی از collation های `*_bin`:
-
utf8mb4_bin-
utf8_bin💡 مثال:
حال فرض کنید همان جدول products را داریم، اما این بار collation ستون
product_code را به utf8mb4_bin تغییر میدهیم.
ALTER TABLE products
MODIFY product_code VARCHAR(255) COLLATE utf8mb4_bin;
حالا اگر دوباره دو کد محصول را وارد کنیم:
INSERT INTO products (product_code, price)
VALUES ('Y1J09bGxwM', 100),
('Y1J09bgXwM', 200);
و بخواهیم جستجویی انجام دهیم برای
Y1J09bGxwM:
SELECT * FROM products WHERE product_code = 'Y1J09bGxwM';
نتیجه:
- در اینجا چون collation
utf8mb4_bin حساس به حروف بزرگ و کوچک است، این کوئری فقط رکوردی با product_code = 'Y1J09bGxwM' را برمیگرداند و هیچ رکوردی با product_code = 'Y1J09bgXwM' پیدا نمیشود، چون حروف بزرگ و کوچک متفاوت هستند. 🔍⚡ تفاوت در عملکرد
-در خوص Performance : زمانی که از
utf8mb4_bin استفاده میکنید، مقایسهها میتوانند سریعتر انجام شوند چون MySQL به طور مستقیم با بایتها مقایسه میکند و نیازی به انجام عملیات پیچیده بر روی رشتهها ندارد. در مقابل، در collation های `utf8mb4_unicode_ci`، مقایسهها پیچیدهتر است و ممکن است کمی زمانبرتر باشد، زیرا باید تفاوتهای ظریف را در نظر بگیرد (برای مثال، حروف با توجه به قواعد زبانها مقایسه میشوند).📋 جمعبندی
- در نوع اول : هر نوع Collation که _ci دارد مقایسهها حساس به حروف بزرگ و کوچک نیستند. به عنوان مثال در کالکشن utf8mb4_unicode_ci رفتار روی رکورد های
`، `Y1J09bGxwM و Y1J09bgXwM مشابه در نظر گرفته میشوند. 🔄- در نوع دوم : هر نوع Collation که _bin دارد مقایسهها حساس به حروف بزرگ و کوچک هستند. به عنوان مثال در کالکشن utf8mb4_bin رفتار روی رکورد های
`، `Y1J09bGxwM و Y1J09bgXwM کاملاً متفاوت هستند. 🔎انتخاب بین این دو نوع collation بستگی به نیاز شما دارد: اگر حساسیت به حروف بزرگ و کوچک برای شما مهم است، از
*_bin استفاده کنید، در غیر این صورت، *_ci برای شما مناسبتر خواهد بود.👍8
🌟 معرفی قابلیت جذاب Health Route در لاراول 11 🌟
سلام به همهی توسعهدهندههای عزیز! 😊
امروز میخوایم درباره یه قابلیت خیلی کاربردی توی لاراول 11 صحبت کنیم: Health Route. اگه پروژههایی داری که نیاز به بررسی وضعیت سلامت اپلیکیشن دارن، این ویژگی میتونه خیلی کارت رو راحت کنه. 🚀
قابلیت Health Route چیه؟
قابلیت Health Route توی لاراول یه مسیر داخلیه که میتونی ازش برای بررسی وضعیت اپلیکیشن استفاده کنی. فرض کن داری از ابزارهایی مثل مانیتورینگ آپتایم (Uptime Monitor) 🖥️، لود بالانسر (Load Balancer) یا سیستمهایی مثل Kubernetes استفاده میکنی. با این قابلیت، میتونی مطمئن بشی اپلیکیشن بدون مشکل داره کار میکنه.
به صورت پیشفرض، این قابلیت روی مسیر
نکته جالب اینه که میتونی مسیر پیشفرض رو تغییر بدی و متناسب با نیازت تنظیمش کنی. 🌐
در مسیر
bootstrap/app.php
کدی که به صورت پیشفرض وجود داره :
میتونی مسیر پیشفرض رو تغییر بدی :
چک کردن وضعیت خاصتر اپلیکیشن 🔍
جالبتر اینه که وقتی به مسیر Health Route درخواست میدی، یه رویداد به اسم
این یعنی دستت بازه که وضعیتهای خاص اپلیکیشن، مثل اتصال به دیتابیس یا حتی سرویسهای دیگه رو چک کنی.
مثال برای بررسی اتصال دیتابیس: 🛠️
فرض کن میخوای مطمئن بشی دیتابیس درست کار میکنه. میتونی یه Listener برای این رویداد تعریف کنی و اتصال به دیتابیس رو بررسی کنی. کد زیر یه نمونه از این کاره:
توی این مثال، ما داریم وضعیت دیتابیس رو بررسی میکنیم. اگه اتصال برقرار نباشه، لاراول یه ارور مناسب اعلام میکنه (مثلاً «Database connection failed!») و درخواست به Health Route، پاسخ HTTP 500 برمیگردونه.
💡 چرا این قابلیت مهمه؟ 💡
این قابلیت بهت کمک میکنه:
- آپتایم اپلیکیشن رو تضمین کنی. 🔄
- مشکلات احتمالی رو قبل از اینکه کاربرها متوجه بشن پیدا کنی. 🚨
- وضعیت سلامت اپلیکیشن رو به ابزارهای مانیتورینگ یا سیستمهای هماهنگی اطلاع بدی. 📡
جمعبندی 🎯
قابلیت Health Route یه ابزار قدرتمنده که کار توسعهدهندهها رو برای بررسی و تضمین پایداری اپلیکیشن خیلی راحتتر میکنه. با چند خط کد ساده میتونی مطمئن بشی همه چیز درست کار میکنه و اگه مشکلی باشه، سریع خبردار میشی.
حتماً این قابلیت رو توی پروژههات امتحان کن و اگه سوالی داشتی، همینجا بپرس!
سلام به همهی توسعهدهندههای عزیز! 😊
امروز میخوایم درباره یه قابلیت خیلی کاربردی توی لاراول 11 صحبت کنیم: Health Route. اگه پروژههایی داری که نیاز به بررسی وضعیت سلامت اپلیکیشن دارن، این ویژگی میتونه خیلی کارت رو راحت کنه. 🚀
قابلیت Health Route چیه؟
قابلیت Health Route توی لاراول یه مسیر داخلیه که میتونی ازش برای بررسی وضعیت اپلیکیشن استفاده کنی. فرض کن داری از ابزارهایی مثل مانیتورینگ آپتایم (Uptime Monitor) 🖥️، لود بالانسر (Load Balancer) یا سیستمهایی مثل Kubernetes استفاده میکنی. با این قابلیت، میتونی مطمئن بشی اپلیکیشن بدون مشکل داره کار میکنه.
به صورت پیشفرض، این قابلیت روی مسیر
/up در دسترسه. اگه همه چیز درست باشه، یه پاسخ HTTP 200 برمیگردونه. ولی اگه مشکلی وجود داشته باشه، جواب HTTP 500 میده. نکته جالب اینه که میتونی مسیر پیشفرض رو تغییر بدی و متناسب با نیازت تنظیمش کنی. 🌐
در مسیر
bootstrap/app.php
کدی که به صورت پیشفرض وجود داره :
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
میتونی مسیر پیشفرض رو تغییر بدی :
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/status',
)
چک کردن وضعیت خاصتر اپلیکیشن 🔍
جالبتر اینه که وقتی به مسیر Health Route درخواست میدی، یه رویداد به اسم
Illuminate\Foundation\Events\DiagnosingHealth اجرا میشه. این یعنی دستت بازه که وضعیتهای خاص اپلیکیشن، مثل اتصال به دیتابیس یا حتی سرویسهای دیگه رو چک کنی.
مثال برای بررسی اتصال دیتابیس: 🛠️
فرض کن میخوای مطمئن بشی دیتابیس درست کار میکنه. میتونی یه Listener برای این رویداد تعریف کنی و اتصال به دیتابیس رو بررسی کنی. کد زیر یه نمونه از این کاره:
use Illuminate\Foundation\Events\DiagnosingHealth;
Event::listen(DiagnosingHealth::class, function () {
try {
DB::connection()->getPdo();
} catch (\Exception $e) {
throw new \Exception('Database connection failed!');
}
});
توی این مثال، ما داریم وضعیت دیتابیس رو بررسی میکنیم. اگه اتصال برقرار نباشه، لاراول یه ارور مناسب اعلام میکنه (مثلاً «Database connection failed!») و درخواست به Health Route، پاسخ HTTP 500 برمیگردونه.
💡 چرا این قابلیت مهمه؟ 💡
این قابلیت بهت کمک میکنه:
- آپتایم اپلیکیشن رو تضمین کنی. 🔄
- مشکلات احتمالی رو قبل از اینکه کاربرها متوجه بشن پیدا کنی. 🚨
- وضعیت سلامت اپلیکیشن رو به ابزارهای مانیتورینگ یا سیستمهای هماهنگی اطلاع بدی. 📡
جمعبندی 🎯
قابلیت Health Route یه ابزار قدرتمنده که کار توسعهدهندهها رو برای بررسی و تضمین پایداری اپلیکیشن خیلی راحتتر میکنه. با چند خط کد ساده میتونی مطمئن بشی همه چیز درست کار میکنه و اگه مشکلی باشه، سریع خبردار میشی.
حتماً این قابلیت رو توی پروژههات امتحان کن و اگه سوالی داشتی، همینجا بپرس!
👍6
📌 چطور لاراول در روتها از توابع ناشناس (Closure) استفاده میکند؟
یکی از سئوالاتی که ممکن است در مصاحبههای استخدامی در برندهای معتبر ایرانی یا خارجی با آن روبرو شوید، استفاده از توابع ناشناس (Closure) در لاراول است.
🔹 احتمالاً شما در لاراول بارها از توابع ناشناس استفاده کردهاید، اما ممکن است نتوانید به درستی به این سئوال پاسخ دهید. بنابراین، در این پست قصد داریم در خصوص توابع ناشناس (Closure) و استفاده از آنها در روتها صحبت کنیم. 📝
توابع ناشناس (Closure) چیستند؟
توابع ناشناس یا Closureها توابعی هستند که بدون نام تعریف میشوند و میتوانند به متغیرهایی که در محیط خود قرار دارند دسترسی پیدا کنند. این توابع معمولاً برای استفاده در callbackها یا ارسال به متدهای دیگر به کار میروند.
مثال:
💡 در این مثال، متغیر $discount از خارج تابع به Closure وارد شده است تا بتوانیم از آن برای محاسبه قیمت نهایی استفاده کنیم.
استفاده از Closure در روتهای لاراول:
در لاراول، میتوان از توابع ناشناس در روتها برای تعریف رفتارهای خاص استفاده کرد. این روش معمولاً زمانی که نیاز به ارسال سریع کد برای پاسخگویی به درخواستها دارید، بسیار مفید است.
مثال از روت لاراول با Closure:
🔸 وقتی شما از این روش استفاده میکنید، در واقع از توابع ناشناس (Closure) در روتهای لاراول بهره میبرید. در این حالت، لاراول از Closure برای پردازش درخواستهای ورودی و بازگشت پاسخ استفاده میکند.
چرا این روش مفید است؟
- استفاده از توابع ناشناس در روتها برای پاسخگویی سریع به درخواستها و سادهتر کردن کد مفید است.
- در مواردی که نیاز به تعریف عملکرد خاص در روتها دارید و نمیخواهید کلاسهای پیچیده بنویسید، Closureها انتخاب مناسبی هستند.
🔑 نکته: حتی اگر شما بارها از این روشها در لاراول استفاده کردهاید، ممکن است در مصاحبههای فنی از شما خواسته شود که این مفهوم را توضیح دهید. پس بهتر است با دقت و درک کامل از این ابزار استفاده کنید. 🎯
———————————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
یکی از سئوالاتی که ممکن است در مصاحبههای استخدامی در برندهای معتبر ایرانی یا خارجی با آن روبرو شوید، استفاده از توابع ناشناس (Closure) در لاراول است.
🔹 احتمالاً شما در لاراول بارها از توابع ناشناس استفاده کردهاید، اما ممکن است نتوانید به درستی به این سئوال پاسخ دهید. بنابراین، در این پست قصد داریم در خصوص توابع ناشناس (Closure) و استفاده از آنها در روتها صحبت کنیم. 📝
توابع ناشناس (Closure) چیستند؟
توابع ناشناس یا Closureها توابعی هستند که بدون نام تعریف میشوند و میتوانند به متغیرهایی که در محیط خود قرار دارند دسترسی پیدا کنند. این توابع معمولاً برای استفاده در callbackها یا ارسال به متدهای دیگر به کار میروند.
مثال:
$discount = 0.2; // تخفیف 20 درصد
$productPrice = 100; // قیمت اولیه محصول
$applyDiscount = function ($price) use ($discount) {
return $price - ($price * $discount);
};
$finalPrice = $applyDiscount($productPrice);
echo "قیمت نهایی محصول: " . $finalPrice;
// خروجی: قیمت نهایی محصول: 80
💡 در این مثال، متغیر $discount از خارج تابع به Closure وارد شده است تا بتوانیم از آن برای محاسبه قیمت نهایی استفاده کنیم.
استفاده از Closure در روتهای لاراول:
در لاراول، میتوان از توابع ناشناس در روتها برای تعریف رفتارهای خاص استفاده کرد. این روش معمولاً زمانی که نیاز به ارسال سریع کد برای پاسخگویی به درخواستها دارید، بسیار مفید است.
مثال از روت لاراول با Closure:
Route::get('greet/{name}', function ($name) {
return "Hello, {$name}! 👋";
});
🔸 وقتی شما از این روش استفاده میکنید، در واقع از توابع ناشناس (Closure) در روتهای لاراول بهره میبرید. در این حالت، لاراول از Closure برای پردازش درخواستهای ورودی و بازگشت پاسخ استفاده میکند.
چرا این روش مفید است؟
- استفاده از توابع ناشناس در روتها برای پاسخگویی سریع به درخواستها و سادهتر کردن کد مفید است.
- در مواردی که نیاز به تعریف عملکرد خاص در روتها دارید و نمیخواهید کلاسهای پیچیده بنویسید، Closureها انتخاب مناسبی هستند.
🔑 نکته: حتی اگر شما بارها از این روشها در لاراول استفاده کردهاید، ممکن است در مصاحبههای فنی از شما خواسته شود که این مفهوم را توضیح دهید. پس بهتر است با دقت و درک کامل از این ابزار استفاده کنید. 🎯
———————————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
👍4
یکی از سوالات مهم در مصاحبههای استخدامی برای توسعهدهندگان لاراول این است که: "Contextual Attributes چیست و چگونه در لاراول استفاده میشود؟"
در نسخه 8.x و بعد از آن، لاراول به توسعهدهندگان این امکان را میدهد که وابستگیها و پیکربندیها را بدون نیاز به تعریف دستی در سرویسپروایدرها تزریق کنند. این ویژگی به نام Contextual Attributes شناخته میشود.
✨ مزایای این ویژگی:
کاهش پیچیدگی کد: بدون نیاز به نوشتن کد اضافی برای تنظیم bindings.
انعطافپذیری بالا: بهطور خودکار و بدون نیاز به پیکربندیهای اضافی میتوانید دیسکها یا مقادیر مختلف را تزریق کنید.
کاهش خطاهای انسانی: لاراول این تزریقها را بهطور خودکار مدیریت میکند و احتمال بروز اشتباهات را کاهش میدهد.
💻 مثال کد:
فرض کنید شما دو دیسک ذخیرهسازی دارید: یکی برای ذخیرهسازی عکسها و دیگری برای داکیومنتها. با استفاده از ویژگی **`#[Storage]`**، میتوانیم به راحتی این دیسکها را به کنترلر تزریق کنیم.
namespace App\Http\Controllers;
use Illuminate\Container\Attributes\Storage;
use Illuminate\Contracts\Filesystem\Filesystem;
class PhotoController extends Controller
{
public function __construct(
#[Storage('local')] protected Filesystem $photoStorage,
#[Storage('documents')] protected Filesystem $documentStorage
)
{
// دیسکها بهطور خودکار تزریق میشوند
}
public function storePhoto()
{
$path = $this->photoStorage->put('user_photo.jpg', file_get_contents('path_to_photo_file'));
return "Photo saved to local storage: $path";
}
public function storeDocument()
{
$path = $this->documentStorage->put('user_document.pdf', file_get_contents('path_to_document_file'));
return "Document saved to documents storage: $path";
}
}
در این مثال، ویژگی #[Storage] بهطور خودکار دیسکهای مختلف را به متغیرهای کنترلر تزریق میکند. در این حالت، ما از دیسک local برای ذخیرهسازی عکسها و از دیسک documents برای ذخیرهسازی داکیومنتها استفاده کردهایم.
🛠️ ویژگیهای دیگر Contextual Attributes در لاراول:
در کنار ویژگی #[Storage]، لاراول ویژگیهای دیگری مانند #[Auth]، #[Cache]، #[Config]، #[DB]، #[Log]، #[RouteParameter] و #[Tag] را نیز بهمنظور تزریق مقادیر مختلف به کنترلرها و کلاسها فراهم کرده است.
1. #[Auth]:
با استفاده از ویژگی #[Auth] میتوانید گاردهای مختلف auth را بهصورت خودکار به کنترلرها تزریق کنید. این ویژگی بهویژه زمانی مفید است که شما نیاز دارید تا در کلاسهای مختلف به گارد خاصی مانند web یا api دسترسی پیدا کنید.
#[Auth('web')] protected Guard $auth;
در این مثال، گارد web به متغیر $auth تزریق میشود.
2. #[Cache]:
این ویژگی به شما امکان میدهد تا یک مخزن کش خاص را بهصورت خودکار تزریق کنید. مثلاً میتوانید از redis برای کش کردن دادهها استفاده کنید.
#[Cache('redis')] protected Repository $cache;
در اینجا، redis بهعنوان مخزن کش به $cache تزریق میشود.
3. #[Config]:
با استفاده از ویژگی #[Config]، میتوانید مقادیر پیکربندی خاص را از فایلهای پیکربندی لاراول استخراج کرده و بهصورت مستقیم در کنترلرها تزریق کنید.
#[Config('app.timezone')] protected string $timezone;
در این مثال، مقدار timezone از فایل پیکربندی app.php به متغیر $timezone تزریق میشود.
4. #[DB]:
این ویژگی به شما این امکان را میدهد که یک اتصال به پایگاه داده خاص را بهصورت خودکار تزریق کنید. میتوانید برای انتخاب اتصال خاص از نام آن استفاده کنید.
#[DB('mysql')] protected Connection $connection;
در اینجا، اتصال به پایگاه داده mysql به $connection تزریق میشود.
5. #[CurrentUser]:
ویژگی #[CurrentUser] به شما این امکان را میدهد که کاربر جاری (authenticated user) را بهصورت خودکار به یک مسیر یا کلاس تزریق کنید. این ویژگی بهویژه برای دریافت اطلاعات کاربری که در حال حاضر وارد سیستم شده است مفید است.
use App\Models\User;
use Illuminate\Container\Attributes\CurrentUser;
Route::get('/user', function (#[CurrentUser] User $user) {
return $user;
})->middleware('auth');
در این مثال، کاربر جاری بهصورت خودکار به متغیر $user تزریق میشود.
این ویژگی یکی از قابلیتهای قدرتمند لاراول است که کمک میکند تا کد شما مرتبتر و سادهتر شود.
———————————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔴 example.com/user/123
🔴 example.com/post/456
✅ این آیدیها قابل حدس هستن و هر کسی میتونه با تغییر عدد، به اطلاعات بقیهی کاربران دسترسی پیدا کنه!
اینجاست که پکیج laravel-hashids به کمکمون میاد! 🎩
🔹 پکیج laravel-hashids چی کار میکنه؟
این پکیج (laravel-hashids) شناسههای عددی (ID) رو به رشتههای تصادفی و غیرقابل حدس تبدیل میکنه.
🔹 example.com/user/b9iLXiAa
🔹 example.com/post/qW8nG5zK
🔹 چطور استفاده کنیم؟
🔹 نصب:
composer require vinkla/laravel-hashids
🔹 رمزگذاری شناسه:
$hash = Hashids::encode(123);
echo $hash; // خروجی: b9iLXiAa
🔹 رمزگشایی شناسه:
$id = Hashids::decode($hash)[0] ?? null;
🔹 استفاده در URLها:
Route::get('/user/{hash}', function ($hash) {
$id = Hashids::decode($hash)[0] ?? abort(404);
return view('user.profile', ['user' => User::findOrFail($id)]);
});
📌 فرق laravel-hashids و UUID و کاربردهاشون
🔹 laravel-hashids
پکیج laravel-hashids شناسههای عددی (مثل IDهای دیتابیس) رو به رشتههای غیرقابل حدس و کوتاه تبدیل میکنه. مثلاً:
🔴 example.com/user/123 → example.com/user/b9iLXiAa
💡 این روش برای مخفیسازی شناسهها در URLها و جلوگیری از حدس زدن اونها استفاده میشه.
🔹شناسه جهانی یکتا (UUID)
یک شناسه طولانی و یونیکه که به صورت تصادفی یا بر اساس الگوریتمهایی خاص تولید میشه.
مثلاً:
🔴 123e4567-e89b-12d3-a456-426614174000
💡 کاربردش برای شناسههای یکتا در سیستمهاست، اما چون طولانیه، برای نمایش در URL مناسب نیست.
📢 کدوم روش رو برای مخفیسازی شناسهها ترجیح میدید؟ نظرتون رو بگید! 💬
✅ مخفی کردن شناسههای دیتابیس
✅ جلوگیری از دسترسی غیرمجاز به اطلاعات کاربران
✅ ایجاد URLهای کوتاه، امن و زیبا
📢 شما از چه روشی برای مخفیسازی شناسهها استفاده میکنید؟ نظرتون رو بگید! 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
چطور کوئریهای کند را در Laravel شناسایی میکنید؟ 🤔💡
فرض کنید یک پروژهی Laravel در حال اجرا دارید و کاربران از کندی برخی صفحات شکایت میکنند. 🚀 ولی شما نمیدانید کدام کوئریها باعث این مشکل شدهاند! 🤯
شما چطور این مشکل را بررسی میکنید؟
🔹 از Laravel Debugbar استفاده میکنید؟
🔹 سراغ Slow Query Log در MySQL میروید؟
🔹 یا شاید راهکار دیگری دارید؟
جوابهایتان را در کامنتها بنویسید! 💬👇
🎯 یکی از روشهایی که من استفاده میکنم:
یکی از سادهترین راهها برای شناسایی کوئریهای کند در Laravel، استفاده از DB::listen() در AppServiceProvider است.
با این روش، هر کوئری که بیشتر از ۱ ثانیه طول بکشد، در لاگ ذخیره میشود! 🚀
🔹 این کد چه کاری انجام میدهد؟
✅ همهی کوئریهای اجرا شده را مانیتور میکند
✅ اگر زمان اجرای کوئری بیش از ۱۰۰۰ میلیثانیه (۱ ثانیه) باشد، آن را در لاگ ثبت میکند
✅ با استفاده از Log::warning() کوئری را به همراه مقدار بایندینگها و زمان اجرا ذخیره میکند
💡 چرا این روش کاربردی است؟
🚀 بدون نیاز به تغییر در کوئریها یا مدلها، میتوان مشکلات کندی را شناسایی کرد
🔎 مناسب برای بررسیهای عملکردی و بهینهسازی دیتابیس
📊 ترکیب آن با ابزارهایی مثل Laravel Telescope یا Debugbar، تحلیل بهتری فراهم میکند
📢 تجربهی شما چیه؟
💡 آیا تا حالا با کوئریهای کند در Laravel مواجه شدهاید؟
شما چه روشی برای شناسایی و بهینهسازی آنها استفاده میکنید؟
منتظر نظرات ارزشمندتون هستم! 💬👇
فرض کنید یک پروژهی Laravel در حال اجرا دارید و کاربران از کندی برخی صفحات شکایت میکنند. 🚀 ولی شما نمیدانید کدام کوئریها باعث این مشکل شدهاند! 🤯
شما چطور این مشکل را بررسی میکنید؟
🔹 از Laravel Debugbar استفاده میکنید؟
🔹 سراغ Slow Query Log در MySQL میروید؟
🔹 یا شاید راهکار دیگری دارید؟
جوابهایتان را در کامنتها بنویسید! 💬👇
🎯 یکی از روشهایی که من استفاده میکنم:
یکی از سادهترین راهها برای شناسایی کوئریهای کند در Laravel، استفاده از DB::listen() در AppServiceProvider است.
با این روش، هر کوئری که بیشتر از ۱ ثانیه طول بکشد، در لاگ ذخیره میشود! 🚀
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
public function boot()
{
DB::listen(function ($query) {
if ($query->time > 1000) { // یک ثانیه
Log::warning('🚨 Slow Query Detected: ' . $query->sql, [
'bindings' => $query->bindings,
'time' => $query->time
]);
}
});
}
🔹 این کد چه کاری انجام میدهد؟
✅ همهی کوئریهای اجرا شده را مانیتور میکند
✅ اگر زمان اجرای کوئری بیش از ۱۰۰۰ میلیثانیه (۱ ثانیه) باشد، آن را در لاگ ثبت میکند
✅ با استفاده از Log::warning() کوئری را به همراه مقدار بایندینگها و زمان اجرا ذخیره میکند
💡 چرا این روش کاربردی است؟
🚀 بدون نیاز به تغییر در کوئریها یا مدلها، میتوان مشکلات کندی را شناسایی کرد
🔎 مناسب برای بررسیهای عملکردی و بهینهسازی دیتابیس
📊 ترکیب آن با ابزارهایی مثل Laravel Telescope یا Debugbar، تحلیل بهتری فراهم میکند
📢 تجربهی شما چیه؟
💡 آیا تا حالا با کوئریهای کند در Laravel مواجه شدهاید؟
شما چه روشی برای شناسایی و بهینهسازی آنها استفاده میکنید؟
منتظر نظرات ارزشمندتون هستم! 💬👇
👍11
🔥 نظرتون در مورد کنترلرهای تکعملکردی (Single Action Controllers) در لاراول چیه؟ 🔥
👨💻 به نظرتون استفاده از کنترلرهای تکعملکردی روش درستی هست یا باعث پیچیدگی های غیر ضروری میشه ؟ ، نظرتون رو برایم در کامنت ها بنویسید
اما امروز میخواهم در مورد کنترلر های عملکردی invokable و یا (Single Action Controllers) باهم صحبت کنیم
یکی از روش هایی که برخی از برنامه نویس ها انجام میدهند اینه که میان یک روت تعریف میکنند که فقط یک متد داره این جوری تقریبا
اما لاراول میگه وقتی میخواهید کنترلری بسازید که تنها یک متد داره یا قرار هست فقط یک کاری رو برای ما انجام بده ،روش تمیز تری هم هست :
که از اون به نام های (Single Action Controllers) یا کنترلر های invokable یاد می شود
ممکن در مصاحبه های استخدامی هم سئوالاتی تحت عنوان کنترلر های invokable چی هستند ازتون پرسیده بشه ،پس مهم هست که در مورد آن بدانید
در واقع این کنترلر ها به این صورت ساخته می شوند
🚀 مرحله ۱: ایجاد کنترلر تکعملکردی
🚀 مرحله ۲: تعریف کنترلر
🚀 مرحله ۳: ثبت مسیر در `routes/web.php`
در بخش route ها هم مثلا در فایل web.php به این صورت میتونید آنها را تعریف کنید
🚀 مرحله ۴: تست API
✅ حالا هر درخواست
❓ شما از این نوع کنترلرها استفاده کردید؟ اگر تجربهای در این مورد دارید، توی نظرات بگید! 💬
————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
👨💻 به نظرتون استفاده از کنترلرهای تکعملکردی روش درستی هست یا باعث پیچیدگی های غیر ضروری میشه ؟ ، نظرتون رو برایم در کامنت ها بنویسید
اما امروز میخواهم در مورد کنترلر های عملکردی invokable و یا (Single Action Controllers) باهم صحبت کنیم
یکی از روش هایی که برخی از برنامه نویس ها انجام میدهند اینه که میان یک روت تعریف میکنند که فقط یک متد داره این جوری تقریبا
Route::post('server', [ProvisionServerController::class, 'createServer']);
اما لاراول میگه وقتی میخواهید کنترلری بسازید که تنها یک متد داره یا قرار هست فقط یک کاری رو برای ما انجام بده ،روش تمیز تری هم هست :
که از اون به نام های (Single Action Controllers) یا کنترلر های invokable یاد می شود
ممکن در مصاحبه های استخدامی هم سئوالاتی تحت عنوان کنترلر های invokable چی هستند ازتون پرسیده بشه ،پس مهم هست که در مورد آن بدانید
در واقع این کنترلر ها به این صورت ساخته می شوند
🚀 مرحله ۱: ایجاد کنترلر تکعملکردی
php artisan make:controller ProvisionServer --invokable
🚀 مرحله ۲: تعریف کنترلر
<?php
namespace App\Http\Controllers;
class ProvisionServerController extends Controller
{
public function __invoke()
{
return response()->json(['message' => 'Server provisioned successfully!']);
}
}
🚀 مرحله ۳: ثبت مسیر در `routes/web.php`
در بخش route ها هم مثلا در فایل web.php به این صورت میتونید آنها را تعریف کنید
use App\Http\Controllers\ProvisionServerController;
Route::post('/server', ProvisionServerController::class);
🚀 مرحله ۴: تست API
curl -X POST http://your-app-url/server
✅ حالا هر درخواست
POST به مسیر /server مستقیماً متد __invoke در ProvisionServerController را اجرا میکند.❓ شما از این نوع کنترلرها استفاده کردید؟ اگر تجربهای در این مورد دارید، توی نظرات بگید! 💬
————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
👍9
آیا تنظیم worker_processes در Nginx را انجام میدید؟ 🤔
اول از همه، worker_processes چیه ؟ 🤷♂️
بیاید از ابتدا شروع کنیم! وقتی شما از Nginx برای مدیریت وبسایتتون استفاده میکنید، یکی از اولین تنظیماتی که باید بهش توجه کنید، worker_processes هست.
این تنظیم مشخص میکنه که Nginx چقدر پردازش موازی برای مدیریت درخواستها و ترافیک به وبسایت شما ایجاد کنه. به عبارت سادهتر، تعداد پردازشهایی که Nginx برای پاسخ به درخواستهای کاربران راه میاندازه، به عهده همین تنظیمه.
حالا worker_processes در Nginx را چگونه پیکربندی کنیم ؟
در تنظیمات پیشفرض، Nginx معمولاً تعداد worker_processes رو روی ۲ تا ۴ تا تنظیم میکنه.
اما حالا فرض کنید که این مقدار رو به حالت auto تنظیم کنید. 🤖
وقتی worker_processes رو روی Auto بذارید چه اتفاقی میافته؟ 🔧
خب، وقتی این گزینه رو روی auto بذارید، Nginx خودش بهطور خودکار تعداد پردازشها رو مطابق با تعداد هستههای پردازنده سرور شما تنظیم میکنه. اینجوری Nginx بهطور هوشمندانه از تمام منابع پردازشی سرور استفاده میکنه و عملکرد کلی بهتر میشه. 🚀
اما سوال اینجاست: آیا همیشه باید از Auto استفاده کنیم؟ 🤔
در حالی که حالت auto برای اکثر سناریوها انتخاب مناسبی است، در بعضی شرایط خاص، تنظیم دستی worker_processes میتواند مزایای بیشتری داشته باشد.
1. سرور با تعداد هستههای زیاد یا کم:
سرور با هستههای زیاد (مثلاً ۱۲ هسته و یا بیشتر): اگر سرور شما ۱۲ هسته دارد و ترافیک کمی دریافت میکند، حالت auto ممکن است منابع اضافی مصرف کند. در این صورت، تنظیم دستی تعداد پردازشها (مثلاً روی ۴ یا ۶) میتواند مصرف منابع را بهینهتر کند.
سرور با هستههای کم (مثلاً ۴ هسته): اگر سرور شما ۴ هسته دارد و ترافیک زیادی میآید، حالت auto ممکن است باعث مصرف بیمورد منابع شود. تنظیم دستی تعداد پردازشها (مثلاً روی ۳ یا ۴) میتواند عملکرد را بهبود دهد و از مصرف اضافی منابع جلوگیری کند.
2.پروژههای با پردازشهای سنگین:
برای پروژههایی با پردازشهای سنگین مانند استریمینگ ویدئو یا بار پردازشی بالا، تنظیم دستی worker_processes کمک میکند تا منابع بهطور دقیقتری اختصاص داده شوند و عملکرد بهینه شود. زمانی که تعداد درخواستها زیاد و پردازشها زمانبر هستند، تنظیم تعداد پردازشها میتواند تاثیر زیادی داشته باشد.
مثال: برای سرویس ویدئو استریمینگ با درخواستهای همزمان زیاد، تنظیم تعداد پردازشها روی ۸ یا ۱۲ میتواند عملکرد و مدیریت منابع را بهبود دهد.
حالا نظر شما چیه؟ 🗣️
تا حالا از گزینه auto استفاده کردید؟ چطور بوده تجربهتون؟ خوشحال میشیم نظرات و تجربیات شما رو بشنویم! 💬
————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
اول از همه، worker_processes چیه ؟ 🤷♂️
بیاید از ابتدا شروع کنیم! وقتی شما از Nginx برای مدیریت وبسایتتون استفاده میکنید، یکی از اولین تنظیماتی که باید بهش توجه کنید، worker_processes هست.
این تنظیم مشخص میکنه که Nginx چقدر پردازش موازی برای مدیریت درخواستها و ترافیک به وبسایت شما ایجاد کنه. به عبارت سادهتر، تعداد پردازشهایی که Nginx برای پاسخ به درخواستهای کاربران راه میاندازه، به عهده همین تنظیمه.
حالا worker_processes در Nginx را چگونه پیکربندی کنیم ؟
در تنظیمات پیشفرض، Nginx معمولاً تعداد worker_processes رو روی ۲ تا ۴ تا تنظیم میکنه.
اما حالا فرض کنید که این مقدار رو به حالت auto تنظیم کنید. 🤖
وقتی worker_processes رو روی Auto بذارید چه اتفاقی میافته؟ 🔧
خب، وقتی این گزینه رو روی auto بذارید، Nginx خودش بهطور خودکار تعداد پردازشها رو مطابق با تعداد هستههای پردازنده سرور شما تنظیم میکنه. اینجوری Nginx بهطور هوشمندانه از تمام منابع پردازشی سرور استفاده میکنه و عملکرد کلی بهتر میشه. 🚀
اما سوال اینجاست: آیا همیشه باید از Auto استفاده کنیم؟ 🤔
در حالی که حالت auto برای اکثر سناریوها انتخاب مناسبی است، در بعضی شرایط خاص، تنظیم دستی worker_processes میتواند مزایای بیشتری داشته باشد.
1. سرور با تعداد هستههای زیاد یا کم:
سرور با هستههای زیاد (مثلاً ۱۲ هسته و یا بیشتر): اگر سرور شما ۱۲ هسته دارد و ترافیک کمی دریافت میکند، حالت auto ممکن است منابع اضافی مصرف کند. در این صورت، تنظیم دستی تعداد پردازشها (مثلاً روی ۴ یا ۶) میتواند مصرف منابع را بهینهتر کند.
سرور با هستههای کم (مثلاً ۴ هسته): اگر سرور شما ۴ هسته دارد و ترافیک زیادی میآید، حالت auto ممکن است باعث مصرف بیمورد منابع شود. تنظیم دستی تعداد پردازشها (مثلاً روی ۳ یا ۴) میتواند عملکرد را بهبود دهد و از مصرف اضافی منابع جلوگیری کند.
2.پروژههای با پردازشهای سنگین:
برای پروژههایی با پردازشهای سنگین مانند استریمینگ ویدئو یا بار پردازشی بالا، تنظیم دستی worker_processes کمک میکند تا منابع بهطور دقیقتری اختصاص داده شوند و عملکرد بهینه شود. زمانی که تعداد درخواستها زیاد و پردازشها زمانبر هستند، تنظیم تعداد پردازشها میتواند تاثیر زیادی داشته باشد.
مثال: برای سرویس ویدئو استریمینگ با درخواستهای همزمان زیاد، تنظیم تعداد پردازشها روی ۸ یا ۱۲ میتواند عملکرد و مدیریت منابع را بهبود دهد.
حالا نظر شما چیه؟ 🗣️
تا حالا از گزینه auto استفاده کردید؟ چطور بوده تجربهتون؟ خوشحال میشیم نظرات و تجربیات شما رو بشنویم! 💬
————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
👍6🔥2
سلام رفقا!
یه ویژگی باحال توی لاراول هست به اسم Macroable که شاید خیلیا هنوز باهاش آشنا نباشن یا کمتر ازش استفاده میکنن.
🧠 اصلاً Macroable چیه؟
لاراول یه trait داره به اسم Macroable که بهت اجازه میده به یه کلاس، بعد از تعریف شدنش، متدهای جدید اضافه کنی — بدون اینکه نیاز باشه اون کلاس رو extend یا دستکاری کنی!
مثلاً به کلاسهایی مثل Response، Collection، Str و... میتونیم متدهای خودمون رو اضافه کنیم!
مثلا فرض کنید میخواهیم به کلاس Response یک متد جدید اضافه کنیم :
use Illuminate\Support\Facades\Response;
Response::macro('apiSuccess', function ($data = [], $message = 'با موفقیت انجام شد') {
return response()->json([
'status' => true,
'message' => $message,
'data' => $data,
]);
});
بعدش میتونی راحت استفاده کنی:
return Response::apiSuccess(['user' => $user]);
✅ کجا تعریفش کنیم؟
معمولاً این جور macroها رو توی فایل AppServiceProvider و متد boot() مینویسیم، تا با شروع برنامه لود بشن:
public function boot()
{
Response::macro('apiSuccess', function (...) {
// ...
});
}
اگر از Macroable قبلا استفاده کردی بگو کجا اضافه کردی تا بقیه هم با این قابلیت بیشتر آشنا بشن
————————————————————
@codefuse1 | کُدفیوز : آموزش و نکات حرفه ای php و لاراول
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4