پکیج جدیدی برای LaraGram منتشر شد به نام LaraGram MongoDB.
این پکیج به شما این امکان رو میده که از دیتابیس MongoDB با استفاده از Eloquent ORM استفاده کنید. یعنی میتونید از مدلها، مایگریشنها، سیدرها و فکتوریهای Eloquent استفاده کنید.
همچنین تمامی روابط مثل یک به یک و چند به چند برای دیتابیس MongoDB رو شبیهسازی میکنه و میتونید در یک دیتابیس غیررابطهای از روابط استفاده کنید.
از طرفی، درایورهای MongoDB برای سیستم کش و صفها هم در اختیارتون میذاره.
برای نصب و اضافه کردن به پروژهتون کافیه این دستور رو اجرا کنید:
بعد از اون کافیه کانکشن دیتابیس رو تغییر بدید، بدون نیاز به تغییر در مدلها و کوئریها، دیتابیس به MongoDB تغییر میکنه.
گیتهاب پروژه هم اینجاست اگر مایل بودید حمایت کنید:
LaraGram MongoDB
@AmirhDeveloper
.
این پکیج به شما این امکان رو میده که از دیتابیس MongoDB با استفاده از Eloquent ORM استفاده کنید. یعنی میتونید از مدلها، مایگریشنها، سیدرها و فکتوریهای Eloquent استفاده کنید.
همچنین تمامی روابط مثل یک به یک و چند به چند برای دیتابیس MongoDB رو شبیهسازی میکنه و میتونید در یک دیتابیس غیررابطهای از روابط استفاده کنید.
از طرفی، درایورهای MongoDB برای سیستم کش و صفها هم در اختیارتون میذاره.
برای نصب و اضافه کردن به پروژهتون کافیه این دستور رو اجرا کنید:
composer require laraxgram/mongodb
بعد از اون کافیه کانکشن دیتابیس رو تغییر بدید، بدون نیاز به تغییر در مدلها و کوئریها، دیتابیس به MongoDB تغییر میکنه.
گیتهاب پروژه هم اینجاست اگر مایل بودید حمایت کنید:
LaraGram MongoDB
@AmirhDeveloper
.
🔥8❤2🍓1
فصل هفت - Services و Dependency Injection
بخش اول - سرویس کانتینر (قسمت دوم)
Contextual Binding (وابسته به موقعیت)
وقتی یک کلاس یا اینترفیس در یک زمینه (context) خاص نیاز به یک وابستگی (dependency) داره، از کدوم پیادهسازی (implementation) استفاده بشه. این ویژگی بهویژه زمانی مفیده که چند کلاس به یک اینترفیس نیاز دارن، اما هرکدوم باید پیادهسازی متفاوتی از اون اینترفیس رو دریافت کنن.
فرض کن دو کلاس داریم که هرکدوم به
حالا میخواهیم برای هر کلاس پیادهسازی متفاوتی از
با این تنظیمات:
در
در
Binding Primitives
گاهی اوقات ممکنه کلاسی نیاز به تزریق مقادیر سادهای مثل اعداد، رشتهها یا آرایهها داشته باشه. در این مواقع، میتونیم با استفاده از Contextual Binding، این مقادیر رو بهصورت دقیق برای هر کلاس یا متد مشخص کنیم.
فرض کن یک کلاس
برای تزریق مقدار
با این کار، هنگام ساخت نمونهای از
Binding Typed Variadics
میتونیم متدهایی با پارامترهای متغیر (variadic) و تایپشده داشته باشیم. این ویژگی به ما این امکان رو میده که وابستگیهایی با تعداد و نوع مشخص رو بهصورت دقیق تزریق کنیم.
فرض کن یک کلاس
برای تزریق فیلترها، میتونیم از
با این کار، هنگام ساخت نمونهای از
متدهای مرتبط با Contextual Binding
1- متد when
این متد مشخص میکنه که binding در چه کلاسی اعمال بشه.
2- متد needs
با این متد مشخص میکنیم که کدوم وابستگی نیاز به تزریق داره.
3- متد give
با این متد پیادهسازی مورد نظر رو برای وابستگی مشخص میکنیم.
4- متد giveConfig
یک متد راحت برای تزریق مقادیر تنظیماتی به کلاسهاست، بهویژه زمانی که کلاس نیاز به مقادیر ساده (primitive) داره. درواقع نسخهی مخصوص برای
5- متد giveTagged
برای تزریق تمام instanceهای مرتبط با یک tag به کلاسها یا متدها استفاده میشه. این زمانی مفیده که یک کلاس نیاز به مجموعهای از وابستگیها (مثلاً چندین سرویس، middleware، فیلتر و…) داره.
تمام instanceهای تگ شده با
نکته: درمورد تگها در قسمت بعدی توضیح کامل داده میشود.
در قسمتهای بعدی با سایر Injectionها آشنا خواهیم شد.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
بخش اول - سرویس کانتینر (قسمت دوم)
Contextual Binding (وابسته به موقعیت)
وقتی یک کلاس یا اینترفیس در یک زمینه (context) خاص نیاز به یک وابستگی (dependency) داره، از کدوم پیادهسازی (implementation) استفاده بشه. این ویژگی بهویژه زمانی مفیده که چند کلاس به یک اینترفیس نیاز دارن، اما هرکدوم باید پیادهسازی متفاوتی از اون اینترفیس رو دریافت کنن.
فرض کن دو کلاس داریم که هرکدوم به
LoggerInterface نیاز دارن:interface LoggerInterface {
public function log(string $message);
}
class FileLogger implements LoggerInterface {
public function log(string $message) {
}
}
class DatabaseLogger implements LoggerInterface {
public function log(string $message) {
}
}حالا میخواهیم برای هر کلاس پیادهسازی متفاوتی از
LoggerInterface تزریق کنیم:$this->app->when(OrderService::class)
->needs(LoggerInterface::class)
->give(FileLogger::class);
$this->app->when(UserService::class)
->needs(LoggerInterface::class)
->give(DatabaseLogger::class);
با این تنظیمات:
در
OrderService، کلاس FileLogger تزریق میشه.در
UserService، کلاس DatabaseLogger تزریق میشه.Binding Primitives
گاهی اوقات ممکنه کلاسی نیاز به تزریق مقادیر سادهای مثل اعداد، رشتهها یا آرایهها داشته باشه. در این مواقع، میتونیم با استفاده از Contextual Binding، این مقادیر رو بهصورت دقیق برای هر کلاس یا متد مشخص کنیم.
فرض کن یک کلاس
OrderProcessor داریم که به یک مقدار حداکثر تعداد سفارش نیاز داره:class OrderProcessor {
public function __construct(
protected int $maxOrders
) {}
public function process() {
}
}برای تزریق مقدار
maxOrders، میتونیم از needs() و give() استفاده کنیم:$this->app->when(OrderProcessor::class)
->needs('$maxOrders')
->give(100);
با این کار، هنگام ساخت نمونهای از
OrderProcessor، مقدار 100 بهعنوان maxOrders به سازنده تزریق میشه.Binding Typed Variadics
میتونیم متدهایی با پارامترهای متغیر (variadic) و تایپشده داشته باشیم. این ویژگی به ما این امکان رو میده که وابستگیهایی با تعداد و نوع مشخص رو بهصورت دقیق تزریق کنیم.
فرض کن یک کلاس
ReportGenerator داریم که به تعدادی فیلتر نیاز داره:class ReportGenerator {
public function __construct(
protected FilterInterface ...$filters
) {}
public function generate() {
}
}برای تزریق فیلترها، میتونیم از
needs() و give() استفاده کنیم:$this->app->when(ReportGenerator::class)
->needs(FilterInterface::class)
->give(function ($app) {
return [
new DateFilter(),
new StatusFilter(),
];
});
با این کار، هنگام ساخت نمونهای از
ReportGenerator، آرایهای از فیلترها بهعنوان وابستگیها تزریق میشه.متدهای مرتبط با Contextual Binding
1- متد when
این متد مشخص میکنه که binding در چه کلاسی اعمال بشه.
2- متد needs
با این متد مشخص میکنیم که کدوم وابستگی نیاز به تزریق داره.
3- متد give
با این متد پیادهسازی مورد نظر رو برای وابستگی مشخص میکنیم.
4- متد giveConfig
یک متد راحت برای تزریق مقادیر تنظیماتی به کلاسهاست، بهویژه زمانی که کلاس نیاز به مقادیر ساده (primitive) داره. درواقع نسخهی مخصوص برای
give() هست که با config() همخوانی داره.$this->app->when(PaymentGateway::class)
->needs('$apiKey')
->giveConfig('services.stripe.key');
5- متد giveTagged
برای تزریق تمام instanceهای مرتبط با یک tag به کلاسها یا متدها استفاده میشه. این زمانی مفیده که یک کلاس نیاز به مجموعهای از وابستگیها (مثلاً چندین سرویس، middleware، فیلتر و…) داره.
$this->app->tag([DateFilter::class, StatusFilter::class], 'filters');
$this->app->when(ReportGenerator::class)
->needs('$filters')
->giveTagged('filters');
تمام instanceهای تگ شده با
'filters' رو به $filters تزریق میکنه.نکته: درمورد تگها در قسمت بعدی توضیح کامل داده میشود.
در قسمتهای بعدی با سایر Injectionها آشنا خواهیم شد.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
❤5🍓1
| AmirHossein |
فصل هفت - Services و Dependency Injection بخش اول - سرویس کانتینر (قسمت دوم) Contextual Binding (وابسته به موقعیت) وقتی یک کلاس یا اینترفیس در یک زمینه (context) خاص نیاز به یک وابستگی (dependency) داره، از کدوم پیادهسازی (implementation) استفاده بشه.…
انقد پست نذاشتم دنبال کنندههای دوره لاراول ناامید شدن رفتن
| AmirHossein |
انقد پست نذاشتم دنبال کنندههای دوره لاراول ناامید شدن رفتن
دنبال کننده های واقعیش موندن😉🤓
👍1
فصل هفت - Services و Dependency Injection
بخش اول - سرویس کانتینر (قسمت سوم)
Contextual Attributes
این قابلیت امکان استفاده از PHP Attributes را در سازندهها و متدها فراهم میکند تا تزریق وابستگیها در Service Container به شکل سادهتر، شفافتر و قابل خواندنتری انجام شود.
این ویژگی در عمل جایگزین بسیاری از مواردی است که پیشتر تنها از طریق Contextual Binding (مانند when()->needs()->give()) امکانپذیر بود.
فرض کنید در یک کنترلر نیاز دارید از یک دیسک خاص برای ذخیرهسازی استفاده کنید. پیشتر لازم بود این موضوع را در Service Provider تعریف کنید، اما اکنون کافی است از Attribute استفاده نمایید:
در این مثال، لاراول بهطور خودکار دیسک با نام 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]
برای تزریق مستقیم کاربر احراز هویتشدهٔ فعلی.
مثال:
در این مثال، Attribute CurrentUser باعث میشود که نمونهای از مدل User که معادل کاربر احراز هویتشدهٔ جاری است، بدون هیچ کد اضافهای تزریق گردد.
تعریف Attributes سفارشی
در برخی پروژهها ممکن است نیاز به منطق خاصی داشته باشید. در این حالت میتوانید Attribute سفارشی خود را تعریف کنید.
برای ساخت یک Attribute سفارشی یک کلاس با annotation #[Attribute] تعریف کنید و رابط ContextualAttribute را پیادهسازی کنید.
نمونه استفاده:
Tagging
در سرویس کانتینر، Tagging این امکان را فراهم میکند که چندین کلاس یا binding را تحت یک نام مشترک گروهبندی کنید و بعداً همه آنها را با یک فراخوانی ساده دریافت نمایید. این ویژگی بهویژه زمانی مفید است که چند پیادهسازی از یک interface یا کلاس وجود داشته باشد و بخواهید همه یا تعدادی از آنها را در یک زمان استفاده کنید.
در این مثال، دو کلاس مربوط به پیامرسانی با تگ 'messengers' علامتگذاری میشوند.
در جایی از اپ که نیاز به اجرای عملیات روی همهی پیامرسانها دارید:
تمام instanceهای مربوط به تگ 'messengers' را برمیگرداند.
در قسمتهای بعدی با سایر Injectionها آشنا خواهیم شد.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
بخش اول - سرویس کانتینر (قسمت سوم)
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
.
❤5🔥2🍓1
Forwarded from </DevLogIR >
📌 سلام به همهی اونایی که شبها با ترمینال خوابشون میبره!
اینجا DevLogIR ـه. یه کانال برای اونایی که عاشق کدنویسیان، با لینوکس حال میکنن، و از روزمرگیهای فنی نمیترسن.
من ابوالفضل هستم. اینجا قراره از تجربههای واقعیم بگم—از باگهایی که دیوونهم کردن، از تمهایی که دسکتاپم رو خوشگل کردن و از چالشهایی که هر هفته خودم رو باهاش تست میکنم.
اگه دنبال یه فضای خودمونی، فنی، و الهامبخش هستی، خوش اومدی.
هر هفته منتظر یه پست جدید باش—گاهی یه نکتهی لینوکسی، گاهی یه کد کوچیک، گاهی یه روایت از دل ترمینال.
#DevLogIR #LinuxLife #CodeAndCoffee@dev_logir
اینجا DevLogIR ـه. یه کانال برای اونایی که عاشق کدنویسیان، با لینوکس حال میکنن، و از روزمرگیهای فنی نمیترسن.
من ابوالفضل هستم. اینجا قراره از تجربههای واقعیم بگم—از باگهایی که دیوونهم کردن، از تمهایی که دسکتاپم رو خوشگل کردن و از چالشهایی که هر هفته خودم رو باهاش تست میکنم.
اگه دنبال یه فضای خودمونی، فنی، و الهامبخش هستی، خوش اومدی.
هر هفته منتظر یه پست جدید باش—گاهی یه نکتهی لینوکسی، گاهی یه کد کوچیک، گاهی یه روایت از دل ترمینال.
#DevLogIR #LinuxLife #CodeAndCoffee@dev_logir
🔥4❤1🍓1
فصل هفت - Services و Dependency Injection
بخش اول - سرویس کانتینر (قسمت چهارم)
Extending Bindings
گاهی اوقات شما میخواهید یک سرویس را که قبلاً در Service Container ثبت (bind) شده است، تغییر دهید یا چیزی به آن اضافه کنید. به جای اینکه کل آن را از نو بنویسید، میتوانید از متد extend استفاده کنید. این متد به شما اجازه میدهد تا سرویس اصلی را دریافت کرده، آن را تغییر دهید و سپس نسخه تغییریافته را برگردانید.
Resolving
متد make برای دریافت (resolve) یک نمونه از یک کلاس یا اینترفیس از Service Container استفاده میشود. هر زمان که شما به یک نمونه از کلاسی که در کانتینر ثبت شده نیاز دارید، میتوانید از این متد استفاده کنید.
فرض کنید یک کلاس برای مدیریت کاربران دارید.
تزریق خودکار (Automatic Injection)
لاراول به قدری هوشمند است که میتواند وابستگیهای (dependencies) یک کلاس را به صورت خودکار از روی Type-Hint در سازنده (constructor) یا متدهای آن تشخیص داده و آنها را تزریق کند. این یعنی در اکثر موارد شما نیازی به استفاده از متد make ندارید.
به جای اینکه در مثال قبل به صورت دستی UserManager را make کنیم، میتوانیم آن را به سازنده کنترلر تزریق کنیم.
در این حالت، لاراول به صورت خودکار UserManager را برای شما make کرده و به عنوان آرگومان به سازنده پاس میدهد.
فراخوانی متد و تزریق وابستگی (Method Invocation & Injection)
علاوه بر تزریق وابستگی در سازنده، لاراول میتواند وابستگیها را مستقیماً به متدهای کلاس نیز تزریق کند. این قابلیت به خصوص در کنترلرها بسیار مفید است، زمانی که یک وابستگی فقط در یک متد خاص مورد نیاز است.
فرض کنید یک سرویس برای اعتبارسنجی ورودیها دارید که فقط در متد store از آن استفاده میکنید.
رویدادهای کانتینر (Container Events)
Service Container هنگام دریافت (resolve) هر آبجکت، یک رویداد (event) را فراخوانی میکند. شما میتوانید به این رویداد گوش دهید تا هر زمان که یک آبجکت خاص از کانتینر گرفته شد، یک عملیات دلخواه را انجام دهید. این قابلیت برای دیباگ کردن یا اضافه کردن منطقهای خاص بسیار کاربردی است.
فرض کنید میخواهیم هر زمان که یک آبجکت از کلاس MyService ساخته شد، یک پیام در لاگ ثبت کنیم.
همچنین میتوانید به تمام resolving ها گوش دهید
Rebinding
گاهی اوقات شما نیاز دارید تا بعد از اینکه یک سرویس ساخته و استفاده شد، اگر دوباره bind شد، یک عملیات خاص را انجام دهید. برای مثال، فرض کنید یک سرویس دارید که به اطلاعات کاربر لاگین شده وابسته است. وقتی کاربر لاگ اوت کرده و یک کاربر دیگر لاگین میکند، شما نیاز دارید که این سرویس با اطلاعات کاربر جدید بهروزرسانی شود.
#laravel #لاراول #فصل_۷
@AmirhDeveloper
.
بخش اول - سرویس کانتینر (قسمت چهارم)
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👍2❤1
از امشب مجددا با کاهش ۱۰۰ درصدی هکرها مواجه هستیم، تا اواخر خرداد ماه
🤣32❤1
سلام به همه
اومدم یک آپدیتی از خودم بدم و اعلام زنده بودن بکنم.
پستهای دوره لاراول تا حد قابل قبولی پیشرفته، فعلا یه چند وقتی عقب میندازمش چون واقعا فرصت نمیکنم. در عوض یه سری پست کوتاهتر آماده میکنم که غیرفعال هم نباشیم، چند پست درمورد Reflectionها داخل PHP.
در آینده اگر فرصت کنم دوره لاراول هم تموم میکنم.
یه سری کار متفاوت دارم انجام میدم که بعدا توضیح میدم درموردش، تجربه خیلی جالبی هست درمورد راهاندازی استارتاپ دانشبنیان، که احتمالا براتون جالب باشه.
از طرفی درحال یادگیری C# و ASP.Net هستم که احتمالا در آینده از C# هم پست مینویسم.
در کنار پروژهها و کارها توی اوقات فراغت هم روی یک MailServer با Rust کار میکنم که خودش تجربه جالبی هست.
پروژه LaraGram هم روزبهروز درحال گستردهتر شدن هست، چند پکیج جدید داره براش نوشته میشه که بعدا معرفی میکنم.
به امید موفقیت❤️
اومدم یک آپدیتی از خودم بدم و اعلام زنده بودن بکنم.
پستهای دوره لاراول تا حد قابل قبولی پیشرفته، فعلا یه چند وقتی عقب میندازمش چون واقعا فرصت نمیکنم. در عوض یه سری پست کوتاهتر آماده میکنم که غیرفعال هم نباشیم، چند پست درمورد Reflectionها داخل PHP.
در آینده اگر فرصت کنم دوره لاراول هم تموم میکنم.
یه سری کار متفاوت دارم انجام میدم که بعدا توضیح میدم درموردش، تجربه خیلی جالبی هست درمورد راهاندازی استارتاپ دانشبنیان، که احتمالا براتون جالب باشه.
از طرفی درحال یادگیری C# و ASP.Net هستم که احتمالا در آینده از C# هم پست مینویسم.
در کنار پروژهها و کارها توی اوقات فراغت هم روی یک MailServer با Rust کار میکنم که خودش تجربه جالبی هست.
پروژه LaraGram هم روزبهروز درحال گستردهتر شدن هست، چند پکیج جدید داره براش نوشته میشه که بعدا معرفی میکنم.
به امید موفقیت❤️
2❤16🍓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
.
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ها، وابستگیها را به صورت خودکار تزریق کند.
چنین قابلیتهایی با استفاده از
این ابزار یکی از بخشهای پیشرفته و کمتر شناختهشدهی زبان 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
.
بخش اول - مقدمهای بر مفهوم 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 نصب خواهد شد؛ در این حین میتوانید به صورت دستی نصب و استفاده کنید:
خوشحال میشم با استار دادن به ریپوزیتوری از پروژه حمایت کنید.
لینکهای پروژه:
⭐️ Watchdog
⭐️ LaraGram
⭐️ Core
@LaraXGram
@LaraGramChatFa
@AmirHDeveloper
.
واچداگ میتواند لاگها را به صورت لحظهای در ترمینال نمایش دهد یا در یک چت تلگرامی گزارش کند.
- در زمان توسعه، اگر خطایی رخ دهد، همان لحظه در ترمینال خودتان مشاهده میکنید.
- در محیط تولید و نگهداری، اگر خطایی پیش بیاید، به صورت لحظهای در چتهای مشخص شده اطلاعرسانی میشود.
علاوه بر این، Watchdog دارای یک Log Manager در محیط تلگرام است که به شما امکان میدهد:
- فایلهای لاگ را مشاهده و باز کنید
- بین لاگها پیمایش کنید
- فایلهای لاگ را حذف کنید
و همه اینها بدون نیاز به دسترسی مستقیم به سرور امکانپذیر است.
این پکیج به زودی به صورت پیشفرض همراه با LaraGram نصب خواهد شد؛ در این حین میتوانید به صورت دستی نصب و استفاده کنید:
composer r laraxgram/watchdog
خوشحال میشم با استار دادن به ریپوزیتوری از پروژه حمایت کنید.
لینکهای پروژه:
⭐️ Watchdog
⭐️ LaraGram
⭐️ Core
@LaraXGram
@LaraGramChatFa
@AmirHDeveloper
.
❤11👍2🔥1