سلام دوستان چرا بعضی از متد ها در Eloquent مثل find و ... پیدا نمیشه و auto complete نمیشه ؟
تو برنامه نویسی شی گرا مبحثی رو داریم به نام وراثت
وراثت: کلاسی میتونه خواص و عملکرد های کلاس دیگه رو به ارث ببره.
و به همین شکل هست که داخل تمام مدل های Eloquent یه سری ویژگی های مشترک وجود داره
چون همشون از کلاس اصلی مدل در لاراول (Illuminate\Database\Eloquent\Model) ارث بری میکنند.
اما اگر داخل این کلاس دنبال متد find بگردی، پیداش نمیکنی.
اتفاقی که میفته اینه که متد اصلی که داخل این کلاس صدا زده میشه، متد newQuery هست
که اگر این متد رو دنبال کنی نهایتا ما رو به کلاس کوئری بیلدر (Illuminate\Database\Query\Builder) میرسونه.
که متدهایی مثل find و where اونجا قرار دارند.
اما اینکه لاراول چطوری متوجه میشه متدهایی مثل find رو صدا بزنه که در کلاس خودشون هستند
به علت استفاده از مجیک متد ها (magic methods) هست
/**
* Handle dynamic method calls into the model.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
if ($resolver = (static::$relationResolvers[get_class($this)][$method] ?? null)) {
return $resolver($this);
}
return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}
این مجیک متد کارش اینه که: اگر متدی صدا زده شد و داخل کلاس وجود نداشت، به چه شکل باید مدیریت بشه.
همچنین یه متد callstatic__ هم داریم که برای متدهای static استفاده میشه.
چون بعضی متدها مثل find مستقیما داخل کلاس Model اصلی نیستند
و با استفاده از Magic method ها از جاهای دیگه فراخوانی میشند
تو برنامه نویسی شی گرا مبحثی رو داریم به نام وراثت
وراثت: کلاسی میتونه خواص و عملکرد های کلاس دیگه رو به ارث ببره.
و به همین شکل هست که داخل تمام مدل های Eloquent یه سری ویژگی های مشترک وجود داره
چون همشون از کلاس اصلی مدل در لاراول (Illuminate\Database\Eloquent\Model) ارث بری میکنند.
اما اگر داخل این کلاس دنبال متد find بگردی، پیداش نمیکنی.
اتفاقی که میفته اینه که متد اصلی که داخل این کلاس صدا زده میشه، متد newQuery هست
که اگر این متد رو دنبال کنی نهایتا ما رو به کلاس کوئری بیلدر (Illuminate\Database\Query\Builder) میرسونه.
که متدهایی مثل find و where اونجا قرار دارند.
اما اینکه لاراول چطوری متوجه میشه متدهایی مثل find رو صدا بزنه که در کلاس خودشون هستند
به علت استفاده از مجیک متد ها (magic methods) هست
/**
* Handle dynamic method calls into the model.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
if ($resolver = (static::$relationResolvers[get_class($this)][$method] ?? null)) {
return $resolver($this);
}
return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}
این مجیک متد کارش اینه که: اگر متدی صدا زده شد و داخل کلاس وجود نداشت، به چه شکل باید مدیریت بشه.
همچنین یه متد callstatic__ هم داریم که برای متدهای static استفاده میشه.
توضیحات فنی و دقیق علت این ماجرا رو آقای بیات بالا اشاره کردند. و علت اینکه PHPStorm هم متوجهشون نیمشه همین هست و باید گفت تقریبا متوجه شدنش هم غیر ممکن هست.
ولی برای رفع این مشکل یک پکیجی وجود داره IDE Helper که میاد با ایجاد چندتا فایل Helper به phpstrom کمک میکنه که این قضیه به اضافه کلی امکان دیگه رو متوجه بشه و از این به بعد در لیست Auto Complete ها پیشنهاد بده. خوبیش هم اینه که صرفا یک پکیج برای محیط development هست و نیازی به نصب و بارگزاریش روی سرور ندارید و هیچ چیز تغییر خاصی نمیکنه. فقط در محیط لوکال کلی کارتون رو راحت میکنه.
حتما در هر پروژه لاراولی نصبش کنید. زندگیتون از این رو به اون رو میشه 😉
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟