| AmirHossein |
الذهاب إلى القناة على Telegram
635
المشتركون
-324 ساعات
-87 أيام
-230 أيام
أرشيف المشاركات
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)
سلام به همه
اومدم یک آپدیتی از خودم بدم و اعلام زنده بودن بکنم.
پستهای دوره لاراول تا حد قابل قبولی پیشرفته، فعلا یه چند وقتی عقب میندازمش چون واقعا فرصت نمیکنم. در عوض یه سری پست کوتاهتر آماده میکنم که غیرفعال هم نباشیم، چند پست درمورد Reflectionها داخل PHP.
در آینده اگر فرصت کنم دوره لاراول هم تموم میکنم.
یه سری کار متفاوت دارم انجام میدم که بعدا توضیح میدم درموردش، تجربه خیلی جالبی هست درمورد راهاندازی استارتاپ دانشبنیان، که احتمالا براتون جالب باشه.
از طرفی درحال یادگیری C# و ASP.Net هستم که احتمالا در آینده از C# هم پست مینویسم.
در کنار پروژهها و کارها توی اوقات فراغت هم روی یک MailServer با Rust کار میکنم که خودش تجربه جالبی هست.
پروژه LaraGram هم روزبهروز درحال گستردهتر شدن هست، چند پکیج جدید داره براش نوشته میشه که بعدا معرفی میکنم.
به امید موفقیت❤️
کسی اینجا هست دانشگاه دولتی خوب باشه و رشته مهندسی کامپیوتر بخونه؟
اگر هست بگید ببینیم اونجا استادها بدرد بخور هستن یا نه؟
فصل هفت - 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
.Repost from N/a
📌 سلام به همهی اونایی که شبها با ترمینال خوابشون میبره!
اینجا DevLogIR ـه. یه کانال برای اونایی که عاشق کدنویسیان، با لینوکس حال میکنن، و از روزمرگیهای فنی نمیترسن.
من ابوالفضل هستم. اینجا قراره از تجربههای واقعیم بگم—از باگهایی که دیوونهم کردن، از تمهایی که دسکتاپم رو خوشگل کردن و از چالشهایی که هر هفته خودم رو باهاش تست میکنم.
اگه دنبال یه فضای خودمونی، فنی، و الهامبخش هستی، خوش اومدی.
هر هفته منتظر یه پست جدید باش—گاهی یه نکتهی لینوکسی، گاهی یه کد کوچیک، گاهی یه روایت از دل ترمینال.
#DevLogIR #LinuxLife #CodeAndCoffee@dev_logir
فصل هفت - Services و Dependency Injection
بخش اول - سرویس کانتینر (قسمت سوم)
Contextual Attributes
این قابلیت امکان استفاده از PHP Attributes را در سازندهها و متدها فراهم میکند تا تزریق وابستگیها در Service Container به شکل سادهتر، شفافتر و قابل خواندنتری انجام شود.
این ویژگی در عمل جایگزین بسیاری از مواردی است که پیشتر تنها از طریق Contextual Binding (مانند when()->needs()->give()) امکانپذیر بود.
فرض کنید در یک کنترلر نیاز دارید از یک دیسک خاص برای ذخیرهسازی استفاده کنید. پیشتر لازم بود این موضوع را در Service Provider تعریف کنید، اما اکنون کافی است از Attribute استفاده نمایید:
use Illuminate\Container\Attributes\Storage;
use Illuminate\Contracts\Filesystem\Filesystem;
class PhotoController extends Controller
{
public function __construct(
#[Storage('local')] protected Filesystem $filesystem
) {}
}
در این مثال، لاراول بهطور خودکار دیسک با نام local را پیدا کرده و به متغیر $filesystem تزریق میکند.
لاراول چندین Attribute داخلی پرکاربرد ارائه کرده است، از جمله:
1- #[Storage('disk-name')]
برای تزریق یک دیسک ذخیرهسازی مشخص.
2- #[Config('config.key')]
برای تزریق مستقیم مقادیر پیکربندی.
3- #[DB('connection-name')]
برای تزریق یک اتصال پایگاهداده خاص.
4- #[Auth('guard-name')]
برای تزریق گارد احراز هویت مشخص.
5- #[Cache('store-name')]
برای تزریق یک cache store.
6- #[Log('channel')]
برای تزریق یک کانال لاگ.
7- #[RouteParameter('param')]
برای تزریق پارامترهای مسیر.
8- #[Tag('tag-name')]
برای تزریق مجموعهای از سرویسهای تَگشده.
9- #[CurrentUser]
برای تزریق مستقیم کاربر احراز هویتشدهٔ فعلی.
مثال:
Route::get('/user', function (#[CurrentUser] User $user) {
return $user;
})->middleware('auth');
در این مثال، Attribute CurrentUser باعث میشود که نمونهای از مدل User که معادل کاربر احراز هویتشدهٔ جاری است، بدون هیچ کد اضافهای تزریق گردد.
تعریف Attributes سفارشی
در برخی پروژهها ممکن است نیاز به منطق خاصی داشته باشید. در این حالت میتوانید Attribute سفارشی خود را تعریف کنید.
برای ساخت یک Attribute سفارشی یک کلاس با annotation #[Attribute] تعریف کنید و رابط ContextualAttribute را پیادهسازی کنید.
namespace App\Attributes;
use Attribute;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Container\ContextualAttribute;
#[Attribute(Attribute::TARGET_PARAMETER)]
class AppConfig implements ContextualAttribute
{
public function __construct(
public string $key,
public mixed $default = null
) {}
public static function resolve(self $attribute, Container $container)
{
return $container->make('config')->get($attribute->key, $attribute->default);
}
}
نمونه استفاده:
public function __construct(
#[AppConfig('app.name')] protected string $appName
) {}
Tagging
در سرویس کانتینر، Tagging این امکان را فراهم میکند که چندین کلاس یا binding را تحت یک نام مشترک گروهبندی کنید و بعداً همه آنها را با یک فراخوانی ساده دریافت نمایید. این ویژگی بهویژه زمانی مفید است که چند پیادهسازی از یک interface یا کلاس وجود داشته باشد و بخواهید همه یا تعدادی از آنها را در یک زمان استفاده کنید.
$this->app->bind(SlackMessenger::class, function ($app) {
return new SlackMessenger(/* ... */);
});
$this->app->bind(TwilioMessenger::class, function ($app) {
return new TwilioMessenger(/* ... */);
});
$this->app->tag([SlackMessenger::class, TwilioMessenger::class], 'messengers');
در این مثال، دو کلاس مربوط به پیامرسانی با تگ 'messengers' علامتگذاری میشوند.
در جایی از اپ که نیاز به اجرای عملیات روی همهی پیامرسانها دارید:
$messengers = $this->app->tagged('messengers');
تمام instanceهای مربوط به تگ 'messengers' را برمیگرداند.
در قسمتهای بعدی با سایر Injectionها آشنا خواهیم شد.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
