سلام و عرض ادب
داخل متد TwoFactor اومدیم متد generateCodeFor رو به صورت استاتیک تعریف کردیم:
namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class TwoFactor extends Model
{
public static function generateCodeFor($user)
{
$user->code()->delete();
return static::create([
'user_id' => $user->id,
'code' => random_int(1000, 9999)
]);
}
}
وقتی متد رو به صورت استاتیک تعریف کنیم، دیگه نیازی نیست از اون کلاس آبجکتی ساخته بشه و بعد اون متد روی اون آبجکت صدا زده بشه، مثل اینجا:
namespace App\\Services\\Auth;
use App\\Models\\TwoFactor;
use App\\Models\\User;
class TwoFactorAuthentication
{
public const CODE_SENT = 'code.sent';
public function requestCode(User $user)
{
$code = TwoFactor::generateCodeFor($user);
$code->send();
return static::CODE_SENT;
}
}
موضوعی که اینجا متوجهش نمیشم اینه که خب اگر ما از مدل TwoFactor یه آبجکت بسازیم، بعد از روی آبجکتش همه متدهاش رو صدا بزنیم، چه فرقی داره؟
به طور مثال، به این صورت:
مدل TwoFactor:
namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class TwoFactor extends Model
{
public function generateCodeFor($user)
{
$user->code()->delete();
return static::create([
'user_id' => $user->id,
'code' => random_int(1000, 9999)
]);
}
}
بعد هر جا که خواستیم ازش استفاده کنیم، به این صورت یه آبجکت ازش میسازیم و متدهاش رو صدا میزنیم:
namespace App\\Services\\Auth;
use App\\Models\\TwoFactor;
use App\\Models\\User;
class TwoFactorAuthentication
{
public function __construct(private TwoFactor $twoFactor)
{
}
public const CODE_SENT = 'code.sent';
public function requestCode(User $user)
{
$code = $this->twoFactor->generateCodeFor($user);
$code->send();
return static::CODE_SENT;
}
}
به این صورت هم داره کار میکنه.
۱- این روش چه اشکالاتی داره؟
۲- از کجا باید متوجه بشیم که متدی که میخوایم واسه یه کلاس تعریف کنیم به صورت استاتیک باشه بهتره یا نباشه؟