Panic Dev – Telegram
Panic Dev
1.11K subscribers
123 photos
29 videos
2 files
132 links
Panic Dev; your Panic's solution 🔥

🍿 Telegram
🔰 t.me/PanicDev

🍿 Laravel Community
🔰 t.me/LaravelGroups

😇 Contact Me
🔰 t.me/MentionHex

Thanks for sharing us 💛
Download Telegram
📝 یک Rich Text Editor در لاراول با پکیج Rich Text Laravel

اگه توی پروژه‌هاتون نیاز به یه ویرایشگر متن پیشرفته دارین، پکیج Rich Text Laravel که از Trix Editor پشتیبانی می‌کنه، گزینه‌ی عالی‌ایه! 🎯

📌 نصب و راه‌اندازی:

composer require tonysm/rich-text-laravel

php artisan richtext:install




🛠 بروزرسانی مدل
use Tonysm\RichTextLaravel\Models\Traits\HasRichText;

class Product extends Model
{
use HasFactory, HasRichText;

protected $richTextAttributes = ['denoscription']; // فیلدهای ویرایشگر متن
protected $fillable = ['name', 'price', 'type', 'denoscription'];
}



📝 اعتبارسنجی در Form Request
$this->validate([
'name' => ['required', 'string', 'max:255'],
'price' => ['required', 'decimal:10,2'],
'type' => ['required'],
'denoscription' => ['nullable', 'string'],
]);



🖋 استفاده از Blade Component
<x-trix-input id="denoscription" name="denoscription" 
:value="old('denoscription', $product->denoscription?->toTrixHtml())" autocomplete="off" />



💡 می‌تونین دکمه‌های ویرایشگر رو شخصی‌سازی کنین و حتماً ورودی‌ها رو با Symfony’s HTML Sanitizer ایمن‌سازی کنین! 🔒

💡 نگران attachment ها هم نباشید . اون هارو هم بخوبی پشتیبانی میکنه و راحت میتونید دریافتشون کنید و مدیریتشون کنید

💡 کامپوننت لایوایری هم داره که میتونید توی پروژه های لایوایری هم ازش استفاده کنید .

💡 داکیومنت خوب و تکمیلی داره که میتونید ریپازیتوری مربوطه را مشاهده کنید . لینک

اگه به یه ویرایشگر متن قوی برای لاراول نیاز دارین، این پکیج رو امتحان کنین! 🚀
👍8🔥4❤‍🔥2
🔐 افزایش امنیت حساب با Auth::logoutOtherDevices() در لاراول


لاراول یه قابلیت امنیتی قوی داره که با Auth::logoutOtherDevices() می‌تونین تمام سشن‌های کاربر روی دستگاه‌های دیگه رو ببندین و فقط دستگاه فعلی رو فعال نگه دارین. این ویژگی برای محافظت از داده‌های حساس خیلی مفیده! 🚀

🛠 چطور پیاده‌سازی کنیم؟

مثلاً وقتی کاربر فعالیت مشکوک حس کرد، می‌تونیم همه سشن‌ها (به‌جز فعلی) رو ببندیم:

public function secureSessions(Request $request)
{
Auth::logoutOtherDevices($request->password);
return back()->with('status', 'همه‌ی سشن‌های دیگر بسته شدند');
}


نکته: این قابلیت نیاز به auth.session middleware داره:

Route::middleware(['auth', 'auth.session'])->group(function () {
// مسیرهای محافظت‌شده
});


🔑 تغییر رمز عبور + خروج از تمام دستگاه‌ها

class SecurityController extends Controller
{
public function updatePassword(Request $request)
{
$validated = $request->validate([
'current_password' => 'required',
'new_password' => 'required|min:8|confirmed'
]);

if (!Hash::check($request->current_password, Auth::user()->password)) {
return back()->withErrors([
'current_password' => 'رمز عبور فعلی اشتباه است'
]);
}

Auth::logoutOtherDevices($request->current_password);
Auth::user()->update([
'password' => Hash::make($request->new_password)
]);

return redirect('/dashboard')
->with('status', 'رمز عبور بروزرسانی شد و همه‌ی دستگاه‌های دیگر خارج شدند');
}
}


🔒 چرا این قابلیت مهمه؟

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

دسترسی غیرمجاز به حساب به خاطر سشن‌های فراموش‌شده جلوگیری می‌شه.

یه لایه‌ی امنیتی قوی‌تر برای اپلیکیشن‌های لاراول! 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4😁1
برای دوستانی که میگن میخوام برنامه نویسی یادبگیرم
نمیدونم از کجا شروع کنم
کدوم آموزش خوبه
بک بزنم یا فرانت
فول استک باشم خوبه ؟
کدوم زبان خوبه ؟

@panicdev
🤣20🔥1
شاید برای شما هم اتفاق افتاده باشد 😊


@panicdev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16🤣12👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍1
لاراول cloud هم ریلیز شد 🔥
هم اکنون میتوانید ثبت نام کنید 😊

https://app.laravel.cloud/sign-up
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Deployed by Laravel Cloud 🤩

https://cloudy-develop-tgs3td.laravel.cloud
🔥9👍2
🚀 خوب Laravel 12 و قابلیت جدید `when()` با Closure!


توسعه‌دهنده‌های لاراول، احتمالاً با متد when() آشنا هستین، ولی می‌دونستین که توی Laravel 12 به بعد حالا می‌تونین از Closure به‌عنوان شرط استفاده کنین؟ 🤌


💡 چرا این قابلیت مهمه؟
چون باعث می‌شه شرط‌های پیچیده‌تر رو به‌شکل خواناتر و تمیزتر بنویسیم!


مثال:

$taxRate = when(
$country === 'US',
fn() => 0.07, // ۷٪ مالیات برای آمریکا
fn() => 0.2 // ۲۰٪ مالیات برای سایر کشورها
);


یا برای تعیین مهلت پرداخت فاکتور:

$invoiceDueDate = when(
fn() => $user->isVIP() && now()->isWeekday(),
fn() => now()->addDays(10), // کاربران VIP ده روز اضافه دارند
fn() => now()->addDays(5) // کاربران عادی پنج روز اضافه دارند
);


نتیجه؟ کد تمیزتر، خواناتر و انعطاف‌پذیرتر! 😎

@panicdev
🔥16❤‍🔥1👍1
🚀 معرفی defer در لاراول

لاراول یه helper به اسم defer داره که می‌تونین بعضی از پردازش‌ها رو بعد از ارسال پاسخ اجرا کنین، بدون نیاز به صف‌ها! 🎯

🔹 مثال ساده:

Route::get('/', function () {
defer(function () {
sleep(3);
\Log::info('Some log');
});

return response(' پاسخ ارسال شد');
});


پاسخ فوراً به کاربر نمایش داده می‌شه، اما بعد از ۳ ثانیه، لاگ ذخیره می‌شه!

🔹 کاربرد واقعی:
مثلاً توی یه صفحه‌ی مشاهده دوره آموزشی، می‌خوایم دوره رو به عنوان "در حال پیشرفت" برای کاربر علامت بزنیم، ولی این عملیات نیازی نداره که قبل از نمایش صفحه اجرا بشه:

defer(fn () => $this->addCourseToProgress->handle(auth()->user(), $course));


کاربر صفحه رو فوراً می‌بینه، اما عملیات در پس‌زمینه اجرا می‌شه.

🔥 چرا defer بهتر از صف‌هاست؟
✔️ برای کارهای سبک و سریع که نیاز به اجرا در لحظه ندارن.
✔️ نیازی به تنظیمات صف و اجرای queue:work نداره.
✔️ پردازش بعد از ارسال پاسخ انجام می‌شه، بدون تأخیر در نمایش صفحه!

⚠️ بهتره برای کارهای سنگین مثل پردازش ویدیو از صف‌ها استفاده کنین، نه `defer`!

نتیجه: یه ابزار عالی برای بهینه‌سازی درخواست‌های لاراول! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🛠 چطور `defer` در لاراول کار می‌کند؟

در نگاه اول، ممکنه فکر کنین که defer یه چیزی شبیه صف‌ها (queues) هست، ولی در واقع اینطور نیست!

لاراول از طریق Middleware مخصوص به نام InvokeDeferredCallbacks پردازش‌های defer رو بعد از ارسال پاسخ اجرا می‌کنه.

🔍 پشت صحنه اجرای defer
📌 لاراول متدی به نام terminate داره که بعد از ارسال پاسخ، توابع defer ذخیره‌شده رو اجرا می‌کنه:


class InvokeDeferredCallbacks
{
public function terminate(Request $request, Response $response)
{
Container::getInstance()
->make(DeferredCallbackCollection::class)
->invokeWhen(fn ($callback) => $response->getStatusCode() < 400 || $callback->always);
}
}


یعنی اگه پاسخ موفقیت‌آمیز باشه (کد ۲xx یا ۳xx)، توابع defer اجرا می‌شن!


🤔 چطور لاراول بعد از ارسال پاسخ، defer رو اجرا می‌کنه؟
شاید عجیب باشه، چون درخواست کاربر تموم شده و پاسخ ارسال شده، ولی چطور defer هنوز اجرا می‌شه؟ 🤔

دلیلش اینه که PHP روی FastCGI اجرا می‌شه که اجازه می‌ده پردازش بعد از ارسال پاسخ هم باز بمونه و اجرا بشه!

📌 ترتیب اجرای defer در لاراول

1️⃣ کاربر / رو باز می‌کنه.
2️⃣ لاراول کال‌بک defer رو ذخیره می‌کنه (ولی اجرا نمی‌کنه).
3️⃣ پاسخ (response) فوراً به کاربر نمایش داده می‌شه.
4️⃣ (پردازش PHP هنوز باز هست) 🚀
5️⃣ لاراول متد terminate رو اجرا می‌کنه.
6️⃣ و`defer` اجرا شده و عملیات در پس‌زمینه پردازش می‌شه.
7️⃣ بعد PHP این کد رو بدون تأخیر در نمایش پاسخ، در پس‌زمینه اجرا می‌کنه.

این دقیقاً مثل queue نیست ولی شبیه اجراهای پس‌زمینه‌ای هست که بعد از ارسال پاسخ، وظایف رو اجرا می‌کنه!


@panicdev
👍7🔥1
یک سوال چالشی

من به عنوان attacker وب سایت شمارو مورد بررسی قرار میدم
و میخوام که یوزر نیم پسورد کاربران شمارو پیدا کنم !

یک روش که میتونه کار من رو راحت کنه این هستش که وقتی یوزر نیم و پسورد رو وارد میکنم
به من یک خطای واضح برگرونید
مثلا

- ایمیل وارد شده یافت نشد
- پسورد وارد شده اشتباه است .


خوب من اگه رندوم ایمیل های مختلف رو وارد کنم و یه جا به جای خطای
- ایمیل / یوزر نیم وارد شده اشتباه است ببینم که خطای پسورد وارد شده اشتباه هست رو برگردوندید .

میفهمم که این ایمیل تو سیستم شما وجود داره و میرم سراغ پسورد .



حالا برای این که کار من رو سخت کنید .
میاید تحت هر شرایطی ( چه ایمیل چه پسورد ) اشتباه باشه
خطا میدید که اطلاعات وارد شده صحیح نمی باشد .


خوب من میام یکم پیشرفته تر عمل میکنم
چند درخواست همزمان میفرستم سمت سرور شما و تایم ریسپانسی که به من میدید رو چک میکنم

هرجایی که ریسپانس زودتری برگردونید میفهمم که یوزر/ایمیلی که دادم تو سیستم شما نیست .

هرجایی که ریسپانس بیشتر طول کشید میفهمم که ایمیل/یوزر نیم داخل سیستم شما هست و فقط پسورد اشتباه هست .

برای این که کار من و سخت تر کنید . چه راه حلی دارید ؟ ( بدون AI بگید اگر که جوابی دارید . ) 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
Panic Dev
یک سوال چالشی من به عنوان attacker وب سایت شمارو مورد بررسی قرار میدم و میخوام که یوزر نیم پسورد کاربران شمارو پیدا کنم ! یک روش که میتونه کار من رو راحت کنه این هستش که وقتی یوزر نیم و پسورد رو وارد میکنم به من یک خطای واضح برگرونید مثلا - ایمیل…
مچکرم از مشارکتتون

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


اما هدف از طرح چالش این بود که شما رو با کلاس Timebox
تو لاراول آشنا کنم که ۲۰۲۲ معرفی شد .
شاید خیلی ها تو داکیومنت دیده باشیدش ولی نمیدونستید کاربرد واقعیش چی بوده . و یا کجا میشه ازش استفاده کرد
یا اینکه با این حمله و مفهوم Timeless Timing Attack اشنا نبودید


لاراول برای چنین چالش هایی که فقط برای لاگین نیستش
میتونه برای عملیات کریپتوگرافی هم باشه . امده این کلاس و فیچر و اضافه کرده😊

که مثالش میشه این




protected function hasValidCredentials($user, $credentials)
{
return $this->timebox
->call(function ($timebox) use ($user, $credentials) {
$validated = ! is_null($user)
&& $this->provider->validateCredentials($user, $credentials);

if ($validated) {
$timebox->returnEarly();

$this->fireValidatedEvent($user);
}

return $validated;
}, 200 * 1000);
}



اگر علاقه دارید برای توضیحات بیشتر میتونید این لینک هارم مشاهده نمایید .

🔗 داکیومنت
🔗مقاله مربوطه


@panicdev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
حال دولوپرا تا چند هفته 🫣
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣24👍2🌚2😁1
لایووایر توی نسخه جدیدش چندتا دایرکتیو و تابع جدید معرفی کرده 🥳

wire:text
wire:show
wire:cloak
wire:transition
$js(...)
$this->js(...)

اول از همه این‌که شما به سادگی و با ران کردن
composer update livewire/livewire

میتونید به راحتی این آپدیت رو دریافت کنید و از این فیچرها استفاده کنید 📝


حالا هرکدوم از این موارد چیکار میکنن؟ 🙄

با استفاده از wire:text میتونید به راحتی متن پروپرتی‌تون رو توی المان های blade قرار بدید
public int $likes = 85;

توی Blade به این‌صورت عمل کنید
<span wire:text="likes"></span>

نتیجه این میشه که 85 توی spanتون قرار میگیره 🤟


با استفاده از wire:show میتونید بر اساس یک پروپرتی توی کلاس کامپوننت؛ یک المان از blade رو نمایش بدید یا مخفی کنید
public bool $showModal = false;

توی Blade به این‌صورت عمل کنید
<div wire:show="showModal"></div>

و زمانی که مقدار showModal برابر با true بشه، div شما نمایش داده میشه.

حتی میتونید از transition ها برای انیمیت کردنش استفاده کنید


مستندات توابع و دایرکتیو هارو میتونید از داکیومنت ببینید 🙄

⭐️ wire:text docs
⭐️ wire:show docs
⭐️ wire:transition docs
⭐️ wire:cloak docs
⭐️ $js & this->js() docs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥9👍9
همه چی عالی !
جای شما خالی ....
🤣18👍1🔥1🕊1🌚1
بحث #دیتابیس #mysql

داشتم یک مطلبی میخوندم ،‌ به یک دستوری اشاره کرد به اسم ANALYZE کنجکاو شدم که بدونم به چه کاری میاد و باهاش میشه چیکار کرد .

مواردی که تونستم در بیارم زیاد نبود ،‌
ولی یه خلاصه و چند مورد از سناریو هایی که بهتر هست از این دستور استفاده کنیم رو بخوام بگم. این هستش که :

دستور ANALYZE TABLE یک دستور مفید برای به‌روزرسانی آمار داخلی جدول که به بهینه‌سازی اجرای کوئری‌ها کمک میکنه !

حالا مواردی که اشاره شده بود برای استفاده از این دستور این ها هستش :


زمانی که بعد از تغییرات بزرگ در داده‌ها، کوئری‌ها کند شدند.
زمانی که بعد از افزودن ایندکس، ایندکس استفاده نمی‌شود.
زمانی که MySQL به جای استفاده از ایندکس، کل جدول را اسکن می‌کند.
زمانی که بعد از بازیابی بکاپ، سرعت پایگاه داده کاهش یافته است.
زمانی که جدول را با OPTIMIZE TABLE بهینه کرده‌اید.



✴️ نکات و best practices
🔹 تحلیل منظم: به‌طور مرتب دستور ANALYZE TABLE را روی جداولی که تغییرات داده‌ای زیادی دارند اجرا کنید تا عملکرد کوئری‌ها حفظ شود.

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

🔹 توجه به سربار پردازشی: در نظر داشته باشید که ANALYZE TABLE ممکن است هنگام تجزیه و تحلیل، جداول را قفل کند که می‌تواند بر عملیات همزمان تأثیر بگذارد. بهتر است آن را در ساعات کم‌بار اجرا کنید تا اثرات منفی کاهش یابد.

🔹 سازگاری با موتورهای ذخیره‌سازی: این دستور در موتورهای ذخیره‌سازی مانند InnoDB و MyISAM پشتیبانی می‌شود اما ممکن است برای همه موتورهای ذخیره‌سازی قابل استفاده نباشد. قبل از استفاده، از سازگاری آن اطمینان حاصل کنید.

🔹 اجرای خودکار: در برخی شرایط، MySQL ممکن است به‌طور خودکار ANALYZE TABLE را اجرا کند، اما اجرای دستی آن تضمین می‌کند که آمارها به‌روز باشند.

🔹 ارزیابی اثربخشی: برای بررسی تأثیر ANALYZE TABLE، برنامه‌های اجرای کوئری (Execution Plan) را قبل و بعد از آن مقایسه کنید. اگر موتور ذخیره‌سازی شما از آن پشتیبانی نمی‌کند یا باعث افت عملکرد قابل‌توجهی می‌شود، از اجرای آن خودداری کنید.


نکته اضافه :

دستور EXPLAIN ANALYZE در MySQL هم داریم که اطلاعات دقیقی درباره‌ی برنامه‌ی اجرای کوئری میده ،‌ از جمله جزئیات مربوط به تصمیمات بهینه‌ساز، روش‌های دسترسی و هزینه‌های تخمینی. برخلاف EXPLAIN که فقط طرح اجرای کوئری را بدون اجرای واقعی آن نمایش میده EXPLAIN ANALYZE کوئری را اجرا میکنه و آمار زمان اجرا را ارائه می‌کند. این ویژگی یک ابزار ارزشمند برای تحلیل عملکرد کوئری‌ها و شناسایی نقاط قابل بهبود .


منابع که شاید برای مطالعه بیشتر دوست داشته باشید .

- لینک
- لینک
-لینک


#تجربه

خیلی دوست دارم کسانی که تجربه کار با این کامند داشتند ، تجربیاتشون رو با ما به اشتراک بگذارند . تاثیراتی که روی دیتابیس و کوئری ها بوده به چه صورتی بود و چقدر تائیر گذار داشته ، آیا این رو به صورت دوره ای schedule کردن ؟
ایا تجربه بدی هم ازش داشتن .
آیا اطلاعات بیشتری یا سناریو هایی بیشتری میشناسید که از این کامند استفاده کنیم ؟


با اشتراک گذاری اطلاعاتتون مارا خوشحال کنید .
سپاس

@panicdev
👍6
🚀 پکیج GPDF یک پکیج PHP/Laravel برای تولید PDFهای عربی، راست‌چین (RTL) و چندزبانه است که به‌صورت بومی از ۱۷ فونت عربی داخلی پشتیبانی می‌کند. این پکیج با پشتیبانی از فضای ابری S3 بر اساس DomPDF توسعه یافته و مشکلات رندر متن عربی را حل کرده است، در عین حال قابلیت‌های مدرنی را برای اسناد، فاکتورها و گزارش‌ها اضافه می‌کند.


https://github.com/omaralalwi/Gpdf



#package

@panicdev
🔥9👍4
حتماً برات پیش اومده که بخوای از سرورهای ایران به وب‌سرویس ربات‌های تلگرام وصل بشی، ولی همیشه کلی دردسر داشتی. خوب، یه راه‌حل ساده، رایگان و بی‌دردسر برات دارم که می‌تونی راحت ازش استفاده کنی! 🚀

راه حل چیه؟
Cloudflare Workers

سرویس Cloudflare Workers این امکان رو بهت می‌ده که یه قطعه کد یا پروژه رو روی ساب‌دامین خودت یا حتی ساب‌دامین workers.dev (که خود کلادفلر ارائه می‌ده) اجرا کنی. این سرویس کاملاً رایگانه و استفاده ازش خیلی ساده‌ست.

🎯 چطور راه‌اندازی کنیم؟
خیلی راحت:
1. تو Cloudflare ثبت‌نام کن.
2. یه Worker جدید بساز.
3. این کد رو توش کپی کن:

export default {
async fetch(request, env, ctx) {
const requestClone = request.clone();
try {
const url = new URL(request.url);
const targetUrl = `https://api.telegram.org${url.pathname}${url.search}`;
const telegramRequest = new Request(targetUrl, {
method: request.method,
headers: request.headers,
body: request.method !== 'GET' && request.method !== 'HEAD' ? await requestClone.blob() : undefined,
});
const response = await fetch(telegramRequest);
return new Response(await response.clone().blob(), {
status: response.status,
statusText: response.statusText,
headers: response.headers,
});
} catch (error) {
return new Response(`Proxy Error: ${error.message}`, { status: 500 });
}
},
};


🚀 چطور ازش استفاده کنیم؟
وقتی Worker رو دیپلوی کردی، یه دامنه اختصاصی براش می‌گیری. حالا کافیه به‌جای این که درخواست‌هات رو به api.telegram.org بفرستی، به دامنه Worker خودت بفرستی و همون جواب رو بگیری. 🎉

💡 چرا این روش عالیه؟
کاملاً رایگان و بدون نیاز به سرور
نیازی نیست کدهای اصلی باتت رو تغییر بدی
سرعت بالا و بدون محدودیت دسترسی
امکان استفاده روی دامنه اختصاصی

برای جزئیات بیشتر، یه سر به مستندات Cloudflare Workers بزن. 😉

Happy Coding! 🥳
@PanicDev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍10❤‍🔥5
واقعا بعضیا خودشونو مسخره کردن 😐

بعد همینا میگن :
بابا ما آگهی میزنیم نیرو کار نیست .
دیگه کسی کار نمیکنه
یا همه روزمه هایی که میفرستن سطح پایین جونیور
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣15👍3