Golden Code – Telegram
Golden Code
738 subscribers
53 photos
248 links
نکات laravel, php و...
Download Telegram
متود segment() در لاراول به شما این امکان رو میده که بخش‌های مختلف مسیر URL رو به راحتی استخراج و بررسی کنید. این متود برای ساخت منطق‌های داینامیک بر اساس URL بسیار کاربردیه.

📌 کاربردهای اصلی:

خواندن بخش‌های جداگانه مسیر URL

شرط گذاری و تصمیم گیری بر اساس مسیر فعلیمون

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

نحوه استفاده
$segment1 = $request->segment(1);  // بخش اول مسیر
$segment2 = $request->segment(2); // بخش دوم مسیر

شماره بخش‌ها از 1 شروع میشه.

مثال:
اگه URL برابر باشه با:
https://example.com/products/electronics/phones

$request->segment(1) مقدار "products"

$request->segment(2) مقدار "electronics"

$request->segment(3) مقدار "phones"

نکته :
اگه بخش مورد نظر در URL وجود نداشته باشه، مقدار null برمی‌گردد.
@GoldenCodeir

#Laravel
(به منبع و مثالش دقت 👇🏾)
https://x.com/MilwadDev/status/1943673513291690462?s=35
👍6🆒31🔥1
در Eloquent، فرض کنید میخواین یک رابطه‌ی hasMany رو فقط در صورتی load کنید که هنوز بارگذاری نشده باشه تا از اجرای کوئری‌های تکراری جلوگیری بشه. کدوم گزینه بهترین انتخابه؟؟
Anonymous Quiz
23%
$user->with('posts')
16%
$user->load('posts')
22%
$user->loadMissing('posts')
39%
$user->loadIfMissing('posts')
5🔥2
متود ensure() در کلاس Collection لاراول این امکانو به شما میده تا نوع همه‌ی آیتم‌های داخل کالکشن رو اعتبارسنجی کنید. این متود بررسی میکنه که آیا همه موارد از یک کلاس مشخص یا نوع داده‌ای مثل int، string یا bool هستن یا نه.

اگه حتی یکی از آیتم‌ها نوع متفاوتی داشته باشه، یک Exception رخ میده و سریعاً متوجه خطا میشید.

چرا استفاده کنیم؟

تضمین سازگاری داده ها

جلوگیری از خطاهای زمان اجرا ناشی از نوع داده ی اشتباه

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

پشتیبانی از انواع اولیه و کلاس‌ها

مثال:
$numbers = collect([10, 20, 30]);

$numbers->ensure('int'); // بدون خطا اجرا میشه

یا:
$products = collect([$product1, 'not a product']);

$products->ensure(Product::class); // یک exception رخ‌ میده

متود ensure() یک روش ساده و موثر برای اطمینان از صحت نوع دیتاهای داخل کالکشنه که باعث میشه کد شما ایمن‌تر و قابل نگهداری‌تر باشه.

@GoldenCodeir

#Laravel
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/MrPunyapal/status/1947691817694335268?s=1
🔥63👍1
متود insertOrIgnore() در لاراول برای وارد کردن چند رکورد بصورت دسته‌ ای هستش. اگه رکوردی باعث تکرار unique key یا نقض محدودیتهای دیتابیس بشه، بجای ایجاد خطا، اون رکورد هارو نادیده میگیره و بقیه رکورد هارو‌ وارد میکنه.


این متود زمانی خیلی کاربردیه که بخوای داده‌های حجیم رو وارد کنی و احتمال بدی بعضی رکوردها قبلاً توی دیتابیس داشتن. درین حالت، برنامه بدون خطا ادامه پیدا میکنه و کل عملیات bulk insert متوقف نمیشه.

📌 مثال:
$data = [
['email' => 'user1@example.com', 'name' => 'User One'],
['email' => 'user2@example.com', 'name' => 'User Two'],
['email' => 'user1@example.com', 'name' => 'User One Duplicate'], // ایمیل تکراری
];

// جدول users ایمیل رو به عنوان UNIQUE تعریف کردیم

DB::table('users')->insertOrIgnore($data);

درین مثال، رکورد سوم دارای ایمیلی هستش که قبلاً در جدول وجود داره (پس تکراریه).

با insertOrIgnore() رکوردهای تکراری رو نادیده میگیره و فقط رکوردهای جدید (user2@example.com) رو وارد میکنه.

@GoldenCodeir

#Laravel
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/PovilasKorop/status/1950492837373469057?s=1
7👏2
Forwarded from Python Hints
#تجربه

بیش از ۹۸٪ پروژه‌های اپلیکیشن‌هایی که کار کردم دیتابیس رو اشتباه انتخاب کرده بودند!

اصلا طبیعیت دیتاها و کار با دیتابیس و ... اشون SQL نیست
اما ۱۰۰٪ تأکید دارند که از SQL استفاده بشه و اکثراً بعد از مدتی کوئری‌های پیچیده کل سیستمشون رو می‌گیره !


مشکل کجاس ؟
- عدم شناخت کافی از دیتابیس‌های دیگه:
Mongo, Janus, Casandra, Scylla, ....
این بیشترین موردی هست که دیدم.

- عدم توانایی طراحی درست سیستم؛ معماری سیستم خیلی مهم هست.

- عدم بررسی و آنالیز نیازمندی‌های سیستم؛ اینکه درگیر دنبال بهترین‌ها بودن نشید چیز خوبیه ولی اینکه سر چیزای ابتدایی هم تحقیق نمی‌کنید و می‌ندازید گردن اینکه من نمی‌خوام کمالگرا باشم یک موضوع متفاوت هست.

- ترس، ترس از تست کردن چیزای جدید.
طرف می‌گه من ۱۰ ساله دارم SQL کار می‌کنم (خب به درک!!)، نهایت همرو خودم Query می‌نویسم! به فکر نفرات بعدی روی پروژه هم باش
احمقانه تصمیم نگیر


راجب mongodb بخونید، خیلی از شما چیزی که بهش نیاز دارید mongodb هست
Transaction
رو هم داره؛ تا ۱۰۰ لول ارتباط تو در تو هم نگه میداره (که عمرا و عملاً بهش نمی‌رسید)
به راحتی می‌تونید replication و read-only داشته باشید

دیزاین collection (مثل table بهش فکر کنید) می‌تونی ثانیه‌ای عوض بشه اگر بخواید.
فرض کنید توی sql بتونید، هروقت خواستید بدون دردسر و migration, ... ستون اضافه کنید.

به کمک پکیج motor خیلی راحت؛ async رو هم در اختیار خواهید داشت

Janus
هم گزینه خوبی هست برای اون‌هایی که به دیتابیس Graph نیاز دارند.
۶ سال قبل بعنوان جایگزین رایگان Neo4j ازش استفاده کردم روی حجم داده بسیار بسیار بالا و خیلی رضایت بخش بود.


خلاصه که زرتی نرید با SQL شروع کنید.
👍10🤔5😁2
وقتی شما از Request دیتایی دریافت میکنی، معمولاً مقدار ورودی به صورت رشته string هستش.
اما گاهی لازم داری که مقدار ورودی رو به نوع خاصی مثل integer ، boolean، array, ،date یا enum تبدیل کنی.

قبلاً باید خودت دستی این تبدیل هارو انجام میدادی، مثلاً با استفاده از (int) یا boolval() یا کدهای مشابه. ولی توی نسخه جدید لاراول ، متودهایی مثل integer(), boolean(), array(), date(), و enum() بهت اجازه میدن که به سادگی و مستقیم ورودی رو به نوع مورد نظرت تبدیل کنی.

📌 یه مثال:
$age = $request->integer('age');     
  // مقدار 'age' رو به عدد صحیح تبدیل می‌کنه

$isActive = $request->boolean('active');
// مقدار 'active' رو به true یا false تبدیل می‌کنه

$tags = $request->array('tags');   
    // مقدار 'tags' رو به آرایه تبدیل می‌کنه

بدون نیاز به تبدیل دستی، کد تمیزتر و خواناتری داری.
#Laravel

@GoldenCodeir

(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/PovilasKorop/status/1952304768493277191?s=35
9👍4🔥2
نکته مهم برای کوئری‌های MySQL

اگه روی یک ستون دیتابیس ایندکس تعریف شده، استفاده از توابعی مثل YEAR(), MONTH() یا هر تابع دیگه ای روی همون ستون در شرط‌های WHERE باعث میشه MySQL نتونه از ایندکس استفاده کنه.

📌 چرا؟

چون وقتی تابعی روی ستون اعمال میشه، مقدار ستون تغییر میکنه و ایندکس روی مقدار اصلی ستونه، نه مقدار تبدیل‌شده توسط تابع.
در نتیجه MySQL مجبور میشه کل جدول رو اسکن کنه (Full Table Scan) که عملکرد کوئری رو به شدت کاهش میده.

مثال

فرض کنین روی ستون تاریخ paid_at ایندکس دارید و میخواید رکوردهای مربوط به سال 2023 رو بگیرید.

روش اشتباه:

WHERE YEAR(paid_at) = 2023

درین حالت، MySQL برای هر ردیف ابتدا تابع YEAR() رو اجرا میکنه و سپس مقایسه میکنه، که باعث غیرفعال شدن ایندکس میشه.

روش بهینه:
WHERE paid_at >= '2023-01-01' AND paid_at < '2024-01-01'

درین حالت شرط مستقیماً روی ستون paid_at اعمال میشه و MySQL میتونه از ایندکس استفاده کنه، بنابرین کوئری بسیار سریعتر اجرا میشود.
#SQL
#MySql

@GoldenCodeir

(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/mmartin_joo/status/1952704402038333586?s=35
12🔥5👍2
نمایش فایل در مرورگر بجای دانلود( لاراول):

گاهی در پروژه‌ها لازم داری یک فایل (مثل PDF یا تصویر) مستقیما در مرورگر باز بشه و دانلود نشه!
لاراول برای این کار متود ساده و تمیز response()->file() رو داره.

📌 مثال:

Route::get('/manual', function () {
$path = storage_path('app/public/manual.pdf');
return response()->file($path);
});

با این کار، مرورگر سعی میکنه PDF رو inline نمایش بده.

حالا تفاوتش با download() چیه؟

file() → نمایش فایل در مرورگر (inline)
download() → دانلود اجباری فایل


📌 نکات مهم:

1. مرورگر فقط فایل‌های پشتیبانی‌شده (مثل PDF، JPG، PNG، TXT) رو نمایش میده.

2. بعضی تنظیمات مرورگر یا افزونه‌ها ممکنه باعث دانلود اجباری بشن.

3. مسیر فایل باید معتبر باشه (storage_path() یا public_path()).

4. میتونی MIME-Type رو خودت مشخص کنی:
return response()->file($path, [
'Content-Type' => 'application/pdf'
]);


#Laravel

@GoldenCodeir

(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/PovilasKorop/status/1955203877453590922?s=35
6👍6🔥1
وقتی در لاراول داده‌ها رو با Model::all() می‌گیریم، نتیجه همیشه یک Collection هست.
اما می‌تونیم برای هر مدل، یک کالکشن اختصاصی تعریف کنیم.

🔹 فایدش چیه؟

متودهای مخصوص لیست داده‌ها رو فقط یک‌بار تعریف میکنی.

منطق کار با لیست‌ها (مثل فیلترها) از مدل جدا میشه.

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

نمونه عملی:
// کالکشن اختصاصی
class PostCollection extends Collection {
public function published() {
return $this->filter(fn($post) => $post->is_published);
}
}

// اتصال به مدل
class Post extends Model {
public function newCollection(array $models = []) {
return new PostCollection($models);
}
}

چطور استفاده کنیم؟
$posts = Post::all()->published();

حالا هر وقت Post::all() رو صدا بزنی، علاوه بر متودهای پیش فرض کالکشن، متد اختصاصی published() هم در دسترسه.

📌 نتیجه: دیگه نیاز نیست یک منطق رو بارها تکرار کنی یا دستی فیلتر بزنی.
#Laravel

@GoldenCodeir

(به منبع و مثالش دقت کنید👇🏾)
https://x.com/mmartin_joo/status/1955241116992741659?s=19
👍9🔥4🥰1
یکی از چالشای رایج در اپلیکیشن‌های تحت وب اینه که اجرای مکرر کوئری‌های دیتابیس باعث کندی برنامه و افزایش فشار روی سرور میشه.

لاراول برای حل این مشکل یک سیستم Cache قدرتمند ارائه داده. با کش می‌تونیم داده‌های پرمصرف رو در حافظه ذخیره کنیم و دفعات بعد بدون مراجعه به دیتابیس، سریع به کاربر برگردونیم.

نتیجه؟
سرعت بالاتر
کاهش بار روی دیتابیس
تجربه‌ی بهتر برای کاربر

📌 روش‌های اصلی کار با Cache در لاراول

1. ذخیره‌ی موقت دیتا (remember)

وقتی دیتا ای رو می‌خوایم برای مدت مشخصی نگه داریم:
$posts = Cache::remember('posts', 60, function () {
return Post::all();
});

داده‌ی posts برای ۶۰ ثانیه در کش میمونه.
اگر وجود داشته باشه، دیگه کوئری اجرا نمیشه.
اگه وجود نداشته باشه، کوئری اجرا میشه و نتیجه ذخیره میشه.

2. ذخیره‌ی دائمی دیتا (forever)

برای داده‌هایی که به‌ندرت تغییر میکنن:
Cache::forever('settings', $settings);

این داده هیچ وقت منقضی نمی‌شه.
فقط وقتی با forget پاکش کنیم از کش حذف می‌شه.


3. ذخیره و دریافت مستقیم (put, get)
Cache::put('key', 'value', 300); // ذخیره به مدت 300 ثانیه
$value = Cache::get('key'); // دریافت داده

کنترل کامل روی ذخیره‌سازی و گرفتن داده دارید.


4. حذف داده‌های کش شده
Cache::forget('posts'); // حذف یک کلید خاص
Cache::flush(); // حذف همه داده‌های کش

🔹 و forget برای حذف داده‌ی مشخص استفاده میشه.
🔹و flush همه کش‌ها رو یک‌جا خالی میکنه (مثلاً در زمان توسعه).


5. کار با چندین استور کش

لاراول از استورهای مختلف مثل Redis, Memcached, Database یا File پشتیبانی میکنه:
Cache::store('redis')->put('bar', 'baz', 10);

این قابلیت انعطاف بالایی میده و میتونید بر اساس نیاز پروژه، استور مناسب انتخاب کنین.

6. گروه‌بندی کش با تگ‌ها (Tags)

وقتی بخواین چندین کش مرتبط رو مدیریت کنین:
Cache::tags(['people', 'authors'])->put('Anne', $anne, 120);
Cache::tags('authors')->flush();

🔹 با tags میتونین گروهی از کش‌ها رو حذف کنین بدون اینکه بقیه دیتاها پاک بشن.


7. استفاده از rememberForever

برای داده‌هایی که تقریبا ثابت هستن:
$setting = Cache::rememberForever('website_denoscription', function () {
return App\Models\Setting::firstWhere('name', 'website_denoscription');
});

🔹 مثل forever کار میکنه ولی ترکیب با callback داره.
🔹 مناسب برای دیتاهایی که همیشه به یک شکل نیاز داریم.


📌 چه دیتا هایی رو بهتره کش کنیم؟

لیست مقالات یا محصولات پر بازدید
دسته‌بندی‌ها و منوهای سایت
تنظیمات عمومی سایت
نتایج کوئری‌های سنگین و پرتکرار

خلاصه:

از کش برای داده‌های پر مصرف و کم تغییر استفاده کنید.
با remember داده رو موقت ذخیره کنین.
با forever یا rememberForever داده‌های ثابت رو نگه دارین.
با forget و flush داده‌ها رو بروز یا پاکسازی کنین.

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

با مدیریت درست کش، اپلیکیشن لاراولی شما نه‌تنها سریع‌تر میشه، بلکه دیتابیس هم نفس راحتی می‌کشه!
#Laravel

@GoldenCodeir
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1957404629148611054?s=1
8🔥4
👍52🔥1
Forwarded from Code Lab (𝘮𝘰𝘯𝘪𝘣 𝘴𝘢𝘭𝘦𝘩𝘪)
🔥 تفاوت جاوااسکریپت و تایپ‌اسکریپت

جاوااسکریپت یه زبان Dynamic هست یعنی تایپ داده‌ها رو موقع اجرا مشخص می‌کنه و این باعث میشه گاهی با خطاهای عجیب روبرو بشی
تایپ‌اسکریپت اومده تا این مشکل رو حل کنه و به جاوااسکریپت قدرت Static Typing بده یعنی از همون اول تایپ متغیرها رو مشخص کنی و قبل از اجرا خطاها رو ببینی
در واقع تایپ‌اسکریپت مثل یه لایه امن روی جاوااسکریپت عمل می‌کنه و کدتو تمیزتر و قابل پیش‌بینی‌تر می‌کنه
یه نکته مهم بدون تایپ‌اسکریپت تبدیل به جاوااسکریپت میشه پس برای اجرا همیشه به JS برمی‌گرده

#TypeScript #JavaScript

CODELAB | GpCodeLab
👍5🔥1
نکته امنیتی در لاراول

وقتی کاربر لاگینه، بصورت پیش‌فرض میتونه به همه‌ی Route هایی که با Middleware auth محافظت شدن دسترسی داشته باشه.
اما برای عملیات‌های حساس مثل:

حذف حساب کاربری،

تغییر رمز عبور یا ایمیل،

عمومی‌کردن یک ریپازیتوری،


بهتره مطمئن بشیم کاربر دوباره رمز عبور خودشو وارد کنه. این کار باعث میشه اگه کسی بطور موقت به سیستمش دسترسی داشت، نتونه تغییرات جدی ایجاد کنه.

برای این موضوع، لاراول میدلوری آماده‌ داره به نام:
->middleware(['auth', 'password.confirm'])

با افزودنش به Route موردنظر:

اگه کاربر اخیراً رمزو تأیید نکرده باشه (پیش‌فرض: ۳ ساعت گذشته باشه)، لاراول اونو به صفحه‌ی تأیید رمز هدایت میکنه.

پس از وارد کردن صحیح رمز، عملیات ادامه پیدا میکنه.

مثال:
Route::delete('/account', [AccountController::class, 'destroy'])
->middleware(['auth', 'password.confirm']);

📌 این روش، امنیت برنامه رو بالا میبره و مانع سوءاستفاده‌ی افراد غیرمجاز از Session کاربر میشه.
#Laravel

@GoldenCodeir

(به منبع و مثالش دقت کنین👇🏾)
https://x.com/PovilasKorop/status/1959190135313989925?t=5aL0dPVcclbcVOF4-4iMDA&s=19
14🔥3👍1
Forwarded from WebBaz | وب باز (Mr. Nouri)
فکت:
برنامه نویسی یاد گرفتن فقط ۳۰ درصد پول در آوردن از برنامه نویسیه.

۳۰ درصدش درست معرفی کردنه

۴۰ درصدش شبکه سازیه
👍16
از نسخه ۱۱ لاراول میتونی توی فایل bootstrap/app.php با متود withRouting() نحوه‌ی بارگذاری روت‌ها رو کاملاً شخصی‌سازیشون کنی.

کاربردهاش:

ساخت فایل‌های روت اختصاصی (مثلاً routes/admin.php)

تغییر prefix پیش‌فرض برای API

کنترل کامل روی ثبت و مدیریت مسیرها


مثال:
return Application::configure(basePath: dirname(DIR))
->withRouting(
web: DIR.'/../routes/web.php',
api: DIR.'/../routes/api.php',
then: function () {
require base_path('routes/admin.php'); // روت‌های پنل ادمین
}
)
->withMiddleware()
->withExceptions()
->create();

با این قابلیت، نیازی به دستکاری RouteServiceProvider نداری و همه‌چیز خیلی تمیز و متمرکز میشه.
#Laravel

@GoldenCodeir
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/PovilasKorop/status/1961019184587969014?s=35
👏53
در لاراول، متود boot() در ServiceProvider دقیقاً چه زمانی اجرا میشه؟؟
Anonymous Quiz
35%
قبل از register
41%
بعد از register همه provider ها
19%
همزمان با Kernel boot
5%
بعد از middleware pipeline
5
کوئری‌های دیتابیس که زمان زیادی میبرند باعث کندی برنامه میشن و بار اضافی روی سرور ایجاد میکنن. Laravel یک روش ساده برای شناسایی و لاگ کردن کوئری‌های کند داره.

🔹 لاگ کردن کوئری‌های طولانی
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

DB::listen(function ($query) {
if ($query->time > 100) { // میلی‌ثانیه
Log::warning(" Slow Query: {$query->time}ms; SQL: {$query->sql}");
}
});

این کد فقط کوئری‌های بیشتر از 100 میلی‌ثانیه رو ثبت میکنه و به راحتی میشه اونارو شناسایی کرد.
.

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

📌 نکته: حتی لاگ کردن کوئری‌های کمی طولانی‌تر از حد معمول میتونه مشکلات پنهان دیتابیس رو نشان بده.
#Laravel

@GoldenCodeir

(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1962840547317731790?s=35
👍162
نکته Boot Traits با Attribute ها

🔹 قبلاً وقتی توی لاراول میخواستیم داخل یک Trait متودی بذاریم که به صورت خودکار موقع Boot شدن مدل اجرا بشه، مجبور بودیم اسم متود رو دقیقاً طبق contract بنویسیم:

trait HasSomething {
protected static function bootHasSomething()
{
// کد اجرا هنگام Boot
}
}

مشکلش این بود که همیشه باید اسم متود رو boot + اسم Trait میذاشتیم. نه انعطاف داشت و نه خوانا بود.

از لاراول 12.22 به بعد، این محدودیت برداشته شده.
یعنی میتونیم با استفاده از PHP Attributes هر متودی رو برای Boot علامت‌گذاری کنیم، بدون نیاز به نام‌گذاری اجباری:
use Illuminate\Database\Eloquent\Attributes\Booted;

trait HasSomething
{
#[Booted]
public static function initializeSomething()
{
// این متد هر وقت مدل Boot بشه اجرا میشه
}
}

مهم نیست اسم متود چی باشه، کافیه Attribute #[Booted] رو اضافه کنی. لاراول خودش متوجه میشه که این متود باید هنگام Boot اجرا شه.
#Laravel #لاراول

@GoldenCodeir
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1963339643140833741?t=wz9DcZRTw9IvVmbBBZ1_9g&s=35
👍8💯21
Forwarded from یک برنامه نویس تنبل (Lazy 🌱)
🔶 مهندسان نرم‌افزار عزیز،

سعی کنید پیچیدگی کدهای خود را کاهش دهید.
به نفر بعدی رحم کنید، شما همیشه آنجا نخواهید بود.

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

#توییت

@TheRaymondDev
12👍6👏1
در لاراول، اگه بخوایم یک Service Provider تنها زمانی بارگذاری بشه که واقعا استفاده بشه، از کدوم ویژگی استفاده میکنیم؟
Final Results
17%
$defer در Service Provider
33%
lazyLoad()
13%
provides()
38%
bootWhen()
👍5