اعتراف می کنم – در طول پنج سال کار با لاراول ، مجذوب “جادوی” آن شده ام و اینکه کد کمی برای کارکرد واقعی چیزهایی لازم است. اما اخیراً ، با بزرگ شدن پروژه های من ، آن “جادو” به یک معضل تبدیل شد. یکی از نمونه های معمولی این است اکسسورهای فصیح، بنابراین در این مقاله من بر علیه استفاده از آنها بحث خواهم کرد ، و اینکه در عوض چه کاری باید انجام شود.


نحوه دسترسی و چرا عالی بودن آنها

بیایید به یاد داشته باشیم ، نحوه کار اکسسورها. تصور کنید که در کاربران جدول DB شما ستون دارد نام و نام خانوادگی، اما در جدول خود می خواهید آنها را به عنوان یکی مشاهده کنید نام و نام خانوادگی. اما شما نمی خواهید هر بار آن اتصال رشته را انجام دهید ، بنابراین لوازم جانبی یک راه حل عالی هستند!

شما فقط این را تعریف کنید در برنامه / User.php:

public function getFullNameAttribute()
{
    return $this->name . ' ' . $this->surname;
}

و سپس ، هر زمان که شما داشته باشید $ کاربر شی ، می توانید این را بنویسید ، به عنوان مثال ، در Blade:

{{ $user->full_name }}

Eloquent از فراخوانی این روش و همچنین تبدیل مراقبت خواهد کرد نام و نام خانوادگی مورد مار را در مورد شتر getFullNameAttribute قرار دهید. جادو ، اینطور نیست؟


مسئله 1: این زمینه چیست؟

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

به عنوان مثال ، هنگامی که قسمتهای زیادی در جدول یا مکان دیگری ذکر شده است ، و بدیهی نیستید که فیلد خاصی اکسسوری است. مثلاً اگر می بینید $ user-> full_name و $ user-> آدرس_خانگی در این نزدیکی هست ، کسی احتمالاً انتظار دارد که هر دو ستون DB باشند ، درست است؟

بنابراین ، دسترسی کنندگان به خوانایی کد آسیب می رسانند. حتی اگر یک توسعه دهنده ارشد (یا کسی که کمتر با لاراول آشنایی ندارد) روی این قسمت از کد کار کند ، حتی بدتر می شود که بفهمند چرا این قسمت در پایگاه داده وجود ندارد و ممکن است چند دقیقه / ساعت را در حفاری های گذشته به جستجو بپردازید نام و نام خانوادگی ستون

همچنین ، این فیلدها در IDE شما “قابل کلیک” نیستند ، بنابراین یافتن آنچه که روش واقعاً درون شما پنهان کرده آسان نیست. شما باید تمام پروژه (یا پرونده مدل) را برای “getFullName” در IDE خود مانند PhpStorm جستجو کنید.


مشکل 2: بزرگترها ممکن است اشکالات را “پنهان” کنند

در اینجا ما یک مثال ساده از اتصال رشته ها داریم. اما اغلب من دسترسی ها را به عنوان روش های محاسبه کامل با 20+ خط منطق کد می بینم.

تصور کنید که این نام و نام خانوادگی منطق نام های بین المللی بزرگتر خواهد بود – در برخی کشورها سه بخش از نام ها وجود دارد ، همچنین شما می توانید “آقای / خانم / خانم” ، حروف اول ، حروف کوچک و بزرگ و موارد دیگر را شامل شوید. در حالی که هنوز کار می کند ، در این منطق بزرگ احتمال اشکالات زیادی وجود دارد.

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


راه حل: فقط از روش های “Getter” استفاده کنید

بنابراین ، چه باید کرد تا از “جادو” زیاد جلوگیری شود؟ ساده – فقط از روشها به عنوان روش استفاده کنید ، بدون اینکه به چیزی تبدیل شوید.

بنابراین ، به جای {{$ user-> full_name}} در Blade ، آیا داشتن این مطلب خواناتر نخواهد بود؟ {{$ user-> getFullName ()}}.

اول ، بلافاصله فهمید که این یک ستون DB نیست – با () در پایان ، مشخص است که یک روش. همچنین ، IDE شما به شما امکان می دهد تا بر روی آن کلیک کنید ، و درون آن روش را در مدل خود قرار دهید. ناوبری آسان تر ، ها؟

در مدل فقط تغییر نام دهید getFullNameAttribute () به getFullName ():

public function getFullName()
{
    return $this->name . ' ' . $this->surname;
}

قبول داری؟ آیا تاکنون با مشکل “بیش از حد جادو” در لاراول – با اکسسوری ها یا سایر روش های جادویی مواجه شده اید؟