| AmirHossein | – Telegram
| AmirHossein |
593 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
فصل هفت - Services و Dependency Injection

بخش اول - سرویس کانتینر (قسمت چهارم)


‏Extending Bindings‏

گاهی اوقات شما می‌خواهید یک سرویس را که قبلاً در Service Container ثبت (bind) شده است، تغییر دهید یا چیزی به آن اضافه کنید. به جای اینکه کل آن را از نو بنویسید، می‌توانید از متد extend استفاده کنید. این متد به شما اجازه می‌دهد تا سرویس اصلی را دریافت کرده، آن را تغییر دهید و سپس نسخه تغییریافته را برگردانید.
$this->app->singleton(ApiClient::class, function () {
return new ApiClient();
});

$this->app->extend(ApiClient::class, function ($client, $app) {
$client->config['timeout'] = 10;
return $client;
});


‏Resolving

متد make برای دریافت (resolve) یک نمونه از یک کلاس یا اینترفیس از Service Container استفاده می‌شود. هر زمان که شما به یک نمونه از کلاسی که در کانتینر ثبت شده نیاز دارید، می‌توانید از این متد استفاده کنید.
فرض کنید یک کلاس برای مدیریت کاربران دارید.
$this->app->bind('UserManager', function ($app) {
return new UserManager();
});

// Resolving
$userManager = app()->make('UserManager');


تزریق خودکار (Automatic Injection)

لاراول به قدری هوشمند است که می‌تواند وابستگی‌های (dependencies) یک کلاس را به صورت خودکار از روی Type-Hint در سازنده (constructor) یا متدهای آن تشخیص داده و آن‌ها را تزریق کند. این یعنی در اکثر موارد شما نیازی به استفاده از متد make ندارید.

به جای اینکه در مثال قبل به صورت دستی UserManager را make کنیم، می‌توانیم آن را به سازنده کنترلر تزریق کنیم.
public function __construct(UserManager $userManager)
{
$this->userManager = $userManager;
}

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

فراخوانی متد و تزریق وابستگی (Method Invocation & Injection)

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

فرض کنید یک سرویس برای اعتبارسنجی ورودی‌ها دارید که فقط در متد store از آن استفاده می‌کنید.
public function store(Request $request, UserValidator $validator)
{
// Request and UserValidator injected.
}


رویدادهای کانتینر (Container Events)

‏‌‎Service Container هنگام دریافت (resolve) هر آبجکت، یک رویداد (event) را فراخوانی می‌کند. شما می‌توانید به این رویداد گوش دهید تا هر زمان که یک آبجکت خاص از کانتینر گرفته شد، یک عملیات دلخواه را انجام دهید. این قابلیت برای دیباگ کردن یا اضافه کردن منطق‌های خاص بسیار کاربردی است.

فرض کنید می‌خواهیم هر زمان که یک آبجکت از کلاس MyService ساخته شد، یک پیام در لاگ ثبت کنیم.
$this->app->resolving(MyService::class, function ($service, $app) {
Log::info('MyService resolved!');
});

همچنین می‌توانید به تمام resolving ها گوش دهید
$this->app->resolving(function ($object, $app) {
Log::info('Resolved: ' . get_class($object));
});


‏Rebinding

گاهی اوقات شما نیاز دارید تا بعد از اینکه یک سرویس ساخته و استفاده شد، اگر دوباره bind شد، یک عملیات خاص را انجام دهید. برای مثال، فرض کنید یک سرویس دارید که به اطلاعات کاربر لاگین شده وابسته است. وقتی کاربر لاگ اوت کرده و یک کاربر دیگر لاگین می‌کند، شما نیاز دارید که این سرویس با اطلاعات کاربر جدید به‌روزرسانی شود.
$this->app->rebinding('UserData', function ($app, $instance) {
// logic
});


#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
7🍓2
حمایت کنید از کانال بیایم روی 1K بعد 2 سال و خورده‌ای
کلا ۲۰۰ تا ممبر فعال داریم
17
| AmirHossein |
حمایت کنید از کانال بیایم روی 1K بعد 2 سال و خورده‌ای کلا ۲۰۰ تا ممبر فعال داریم
کانال های خودتونم بذارید اینجا
درسته ممبرهام کمه ولی خب
5🍓1
| AmirHossein |
کانال های خودتونم بذارید اینجا درسته ممبرهام کمه ولی خب
کانالتون رو بذارید، ولی در مقابل قرار بود یه حمایتی هم از اینجا بکنید
🍓6🤣3👍21
از امشب مجددا با کاهش ۱۰۰ درصدی هکرها مواجه هستیم، تا اواخر خرداد ماه
🤣321
وقتی دنیا میفهمه میخوام سی‌شارپ یاد بگیرم
7🤣2🍓1
سلام به همه

اومدم یک آپدیتی از خودم بدم و اعلام زنده بودن بکنم.

پست‌های دوره لاراول تا حد قابل قبولی پیشرفته، فعلا یه چند وقتی عقب می‌ندازمش چون واقعا فرصت نمی‌کنم. در عوض یه سری پست کوتاه‌تر آماده می‌کنم که غیرفعال هم نباشیم، چند پست درمورد Reflectionها داخل PHP.
در آینده اگر فرصت کنم دوره لاراول هم تموم می‌کنم.

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

از طرفی درحال یادگیری C# و ASP.Net هستم که احتمالا در آینده از C# هم پست می‌نویسم.

در کنار پروژه‌ها و کارها توی اوقات فراغت هم روی یک MailServer با Rust کار می‌کنم که خودش تجربه جالبی هست.

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

به امید موفقیت❤️
216🍓3👍2
Software Architecture & Design
1. Designing Data-Intensive Applications
2. Fundamentals of Software Architecture - Mark Richards, Neal Ford
3. Robert Martin - Clean Architecture: A Craftsman’s Guide to Software Structure and Design
4. Modern Software Engineering
5. M. Noback - Advanced Web Application Architecture (2020)
6. Software Engineering - Pressman
7. System Design Interview
8. The Design of Web APIs
9. 2020-Scrum-Guide-US

Design Patterns & Domain-Driven Design
1. Addison-Wesley - Implementing Domain-Driven Design - Eric Evans, Vaughn Vernon
2. Scott Millett, Nick Tune - Patterns, Principles and Practices of Domain-Driven Design
3. Head First Design Patterns (2nd Edition) - Elisabeth Robson, Eric Freeman
4. Design Patterns Cheatsheet
5. Learning Domain-Driven Design

Software Development & Coding Practices
1. Code Complete
2. Microsoft Press - Adaptive Code (2nd Edition)
3. Building Microservices
4. Caching Web
5. Docker in Action

Programming Languages & Tools
1. Jon Bodner - Learning Go
2. Allen A. - Consuming APIs in Laravel: Build Robust and Powerful API with Ease (2023)
3. Steve Shivering - Redis for Dummies (2021)
4. Paul DuBois - MySQL Cookbook (O’Reilly, 2014)

این لیست کتاب‌هایی هست که خوندم/می‌خونم.
یکی از دوستان بهم معرفی کرده و من توی دانشگاه سر کلاس‌ها می‌خونم.
۸ تا ازشون مونده هنوز، واقعا کتاب‌های قوی و خوبی هستن، اگر علاقه داشتید می‌تونید PDF دانلود کنید یا بدید صحافی کنند واستون

@AmirhDeveloper
.
5🔥2
آشنایی با Reflection در PHP
بخش اول - مقدمه‌ای بر مفهوم Reflection


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

به عنوان مثال:

- فریم‌ورکی که بتواند کنترلرها و متدهای آن‌ها را به صورت خودکار شناسایی کند؛
- ابزاری برای تست خودکار که بدون دخالت انسان، متدهای آزمون را پیدا و اجرا نماید؛
- یا حتی سیستمی که بر اساس type hintها، وابستگی‌ها را به صورت خودکار تزریق کند.

چنین قابلیت‌هایی با استفاده از Reflection API در PHP امکان‌پذیر است.
این ابزار یکی از بخش‌های پیشرفته و کمتر شناخته‌شده‌ی زبان PHP است که قدرت زیادی برای تحلیل، بازرسی و حتی تغییر رفتار کد در زمان اجرا در اختیار توسعه‌دهنده قرار می‌دهد.

تعریف Reflection


به طور خلاصه، Reflection در PHP به مجموعه‌ای از کلاس‌ها و متدها گفته می‌شود که امکان بازتاب (reflection) و خودشناسی (introspection) کد را در زمان اجرا فراهم می‌کنند.

به بیان دیگر، با استفاده از Reflection می‌توان:

- ساختار کلاس‌ها، توابع و متدها را شناسایی کرد،
- نوع و ویژگی‌های پارامترها را تشخیص داد،
- متدها را به صورت پویا فراخوانی کرد،
- و حتی به اعضای private و protected دسترسی پیدا نمود (در صورت نیاز و آگاهی از خطرات امنیتی آن).

کاربردهای Reflection در دنیای واقعی


‏Reflection در پروژه‌های واقعی کاربردهای متعددی دارد. در ادامه به برخی از مهم‌ترین آن‌ها اشاره می‌شود:

1- فریم‌ورک‌ها و سیستم‌های خودکارسازی

در فریم‌ورک‌هایی مانند Laravel و Symfony، از Reflection برای شناسایی خودکار کنترلرها، متدها و type hintها استفاده می‌شود.
به عنوان نمونه، در زمان اجرای Dependency Injection Container، با استفاده از Reflection مشخص می‌شود که هر کلاس چه نوع وابستگی‌هایی دارد و باید چه اشیایی به آن تزریق شود.

2- تست‌نویسی (Unit Testing)

در ابزارهایی مانند PHPUnit، از Reflection برای یافتن متدهایی استفاده می‌شود که با test آغاز می‌شوند.
همچنین از این قابلیت برای دسترسی به متدها و پراپرتی‌های خصوصی (private/protected) جهت تست دقیق‌تر منطق داخلی کلاس‌ها بهره گرفته می‌شود.

3- ‏ORM و Map کردن داده‌ها

کتابخانه‌هایی مانند Doctrine ORM از Reflection برای بررسی ساختار کلاس‌ها و تبدیل آن‌ها به جداول پایگاه داده استفاده می‌کنند.
در واقع، Reflection به ORM کمک می‌کند تا بدون نیاز به پیکربندی دستی، تشخیص دهد هر property به کدام ستون از جدول مرتبط است.

4- ابزارهای تحلیل و اشکال‌زدایی

ابزارهای Debug و Code Analysis می‌توانند با استفاده از Reflection، در زمان اجرا اطلاعات دقیقی از وضعیت کلاس‌ها و اشیاء جمع‌آوری کنند.
این اطلاعات در ساخت ابزارهای Documentation Generator، Profiler و Static Analyzer کاربرد فراوان دارد.

ملاحظات عملکرد و امنیت


هرچند Reflection امکانات بسیار قدرتمندی در اختیار توسعه‌دهنده قرار می‌دهد، اما باید در استفاده از آن احتیاط نمود:

- اجرای Reflection ممکن است اندکی باعث افزایش بار پردازشی (Performance Overhead) شود.
- دسترسی به متدها و پراپرتی‌های private/protected در صورت استفاده‌ی نادرست می‌تواند ریسک امنیتی ایجاد کند.

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

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

@AmirhDeveloper
.
🔥5🍓1
پکیج Watchdog برای LaraGram منشتر شده تا کار توسعه و نگهداری برنامه‌ها را برای شما راحت‌تر کند.

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

علاوه بر این، Watchdog دارای یک Log Manager در محیط تلگرام است که به شما امکان می‌دهد:
- فایل‌های لاگ را مشاهده و باز کنید
- بین لاگ‌ها پیمایش کنید
- فایل‌های لاگ را حذف کنید
و همه این‌ها بدون نیاز به دسترسی مستقیم به سرور امکان‌پذیر است.

این پکیج به زودی به صورت پیش‌فرض همراه با LaraGram نصب خواهد شد؛ در این ‌حین می‌توانید به صورت دستی نصب و استفاده کنید:
composer r laraxgram/watchdog


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

⭐️ Watchdog
⭐️ LaraGram
⭐️ Core

@LaraXGram
@LaraGramChatFa

@AmirHDeveloper
.
11👍2🔥1
100 🔥
2🔥181
بالاخره PHP 8.5 منتشر شده🔥

این آپدیت شامل تغییرات جالبی به خصوص Pipe Operator هست که به زودی برای هر کدوم یک پست آماده میشه.

@AmirhDeveloper
.
🍓1
عملگر پایپ (Pipe Operator) در PHP

عملگر پایپ ( |> ) از PHP 8.5 با هدف ساده‌سازی جریان داده و افزایش خوانایی کد اضافه شده است. این عملگر امکان می‌دهد خروجی یک عبارت به‌عنوان ورودی تابع بعدی استفاده شود؛ بدون آنکه نیاز به تو در تو کردن فراخوانی‌ها یا استفاده از متغیرهای موقتی باشد.

ساختار کلی عملگر پایپ:
$value |> callable;


در این ساختار:
- مقدار سمت چپ (value) محاسبه شده و سپس به تابع سمت راست (callable) ارسال می‌شود، و نتیجهٔ آن تابع، خروجی نهایی عبارت خواهد بود.

- تابع سمت راست باید فقط یک پارامتر لازم داشته باشد؛ زیرا همان یک پارامتر از پایپ دریافت می‌شود.

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

چند مثال:

پیش از اضافه شدن پایپ تواع پشت سر هم نوشته می‌شد:
$result = strtolower(trim($noscript));

یا از متغیرهای موقتی استفاده می‌شد:
$trim = trim($noscript);
$result = strtolower($trim);

اما با استفاده از پایپ می توان ساختار تمیزتر و قابل فهم‌تری را داشته باشیم:
$result = $noscript
|> trim(...)
|> strtolower(...);

ترتیب اجرای عملیات کاملا روشن و خوانا است:
ابتدا trim، سپس strtolower.

ترکیب توابع استاندارد با Closure
$slug = $noscript
|> trim(...)
|> (fn($s) => str_replace(' ', '-', $s))
|> strtolower(...);

از آنجایی که گفته شد توابع تنها یک متد داشته باشند، برای توابع با چند متد می‌توان از کلوژرها استفاده کرد.
در این مثال str_replace نیاز به پارامترهای بیشتری است به همین دلیل از arrow-function استفاده شده.

عملیات روی آرایه
$clean = $items
|> (fn(array $arr) => array_map(fn($x) => trim($x), $arr))
|> (fn(array $arr) => array_filter($arr, fn($x) => $x !== ''))
|> array_values(...);


چنین زنجیره‌ای بدون استفاده از پایپ، به‌طور معمول شامل متغیرهای واسطه یا تو در تویی توابع خواهد بود؛ اما با استفاده از پایپ، تمامی مراحل به صورت خوانا پشت سر هم نوشته شده‌اند.

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

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

- نیازی به ایجاد متغیر برای ذخیرهٔ نتیجهٔ هر مرحله نیست.

محدودیت‌ها و نکات مهم:
- توابعی که بیش از یک پارامتر ضروری دارند، مستقیماً با پایپ قابل استفاده نیستند.
"hello world" |> explode(' ', ...); // ERROR

"hello world" |> (fn($v) => explode(' ', $v)); // correct

- توابعی که پارامترشان با ارجاع (By Reference) دریافت می‌شود قابل استفاده نیستند (مانند array_pop یا sort)

- اگر تابعی مقدار بازگشتی نداشته باشد (void)، نتیجهٔ عملیات null خواهد بود و استفادهٔ آن در میانهٔ زنجیره صحیح نیست.


به طور کلی عملگر پایپ در PHP 8.5 امکان نگارش کدی خواناتر، مرحله‌ای و ساخت‌یافته را فراهم می‌کند.
این عملگر با ارسال خروجی هر مرحله به مرحلهٔ بعد، جریان داده را ساده‌سازی می‌کند و برای پردازش رشته‌ها، آرایه‌ها و داده‌های میان‌مرحله‌ای بسیار مناسب است.
در مقابل، محدودیت‌هایی نظیر نیاز به تک‌پارامتری بودن تابع یا عدم پشتیبانی از توابع دارای ارجاع وجود دارد که باید در استفادهٔ روزمره مورد توجه قرار گیرد.

@AmirhDeveloper
.
2👍62🔥2👎1🍓1
ارزان
1
ورژن 4 فریم‌ورک LaraGram درحال توسعه هست و دیگه از پس هر کاری بر میاد

اولین فیچری که می‌خوام بهش اشاره کنم پشتیبانی از MTProto به واسطه Wrapper خودش یعنی LaraProto هست
این یعنی می‌تونیم به سادی ربات‌های سلف‌ رو هم توسعه بدیم.

بعد از اون می‌رسیم به ابزارهای توسعه مینی‌اپ‌ها
لاراگرام توی این ورژن یک سیستم روتینگ تمام‌اعیار مشابه روتینگ لاراول رو در اختیارمون قرار میده و در کنارش یک Template Engine پیشرفته برای رندر ReactJS، VueJS، و احتمالا چیزای دیگه.
این یعنی شما به سادگی فرانت مینی‌اپتون رو توسعه بدید، و بک‌اند اون رو کنار بک‌اند ربات خودتون و کاملا سینک با اون توسعه بدید

این دو فیچرهای کلیدی لاراگرام 4 هستن.
برای باقی فیچرها می‌تونم به کانورسیشن‌ها اشاره کنم.
اگر مدت زیادی اینجا عضو بوده باشید، می‌دونید تا الان دوبار این سیستم به لاراگرام اضافه شده و حذف شده
و دلیلش هم این بوده که اون چیزی که انتظارش رو داشتم از آب در نیومده
ولی این دفعه به لطف زیرساخت استیبل و کامل لاراگرام می‌تونیم چیزی که واقعا ازش انتظار داریم رو داشته باشیم

این سیستم می‌تونه به سادگی یک گفت‌و‌گو بین کاربر و ربات ایجاد کنه، بدون این که نیاز باشه استپ‌هارو مدیریت کنید یا چیزی رو دستی ولیدیشن و نگهداری کنید،
صرفا سوالات رو به این سیستم میدید و باقی کار با لاراگرام هست

فیچر بعدی Acting هست، که باهاش می‌تونید خودتون رو جای یک کاربر دیگه بذارید
فرض کنید یک بخش سفارشات برای کاربر نوشتید، که کاربر سفارشات خودش رو مشاهده کنه
همچنین یکبار هم این سیستم رو توی پنل ادمین پیاده کردید که ادمین لیست سفارش هر کاربر رو ببینه
با این قابلیت فقط یکبار این سیستم برای کاربر توسعه داده میشه، و ادمین کافیه خودش رو جای کاربر بذاره

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

به واسطه این سیستم، سیستم برادکست اضافه میشه که خیلی ساده متن و لیست کاربران رو بهش میدید و عملیات ارسال و ... رو به عهده لاراگرام می‌ذارید

قابلیت دیگه Json Schema هست که باهاش‌میتونید یک ساختار جیستون استاتیک تایپ داشته باشید.
این قابلیت برای API نویسی TMA‌ها و ... می‌تونه کاربردی باشه

اینها بخشی از قابلیت‌های لاراگرام ورژن ۴ هستن که سال آینده ریلیز میشه.

باز هم مثل همیشه استار به ریپوزیتوری باعث شادمانی ماست🔥❤️

⭐️ LaraGram
⭐️ Core

@AmirHDeveloper
.
4🍓54👍2