بایگانی دسته: Laravel

لاراول یه فریم ورک باحاله PHP ایه که باهاش خیلی راحت میتونید برنامه تحت وب پیاده کنید

پراپرتی و متدهای استاتیک در php

نوشته‌شده در توسط .

قبل از اینکه بخوام در مورد facade  در لاراول صحبت کنم باید اطلاعات کلی در مورد توابع یا متدهای استاتیک php داشته باشید. متدهای استاتیک متدهایی از یک کلاس هستند که بدون نمونه گیری از کلاس و بصورت استاتیک قابل دسترسی هستند. یعنی بدون داشتن شئ از کلاس ، میتونیم از این نوع متدها استفاده کنیم.

قبل از مثال در مورد متدهای استاتیک میخوام کمی در مورد متغیرها یا پراپرتی های استاتیک صحبت کنم. یک پراپرتی استاتیک بدون استفاده از $this  و به راحتی با استفاده از ::  قابل دسترسی هست. همچنین میتونید یک متغیر استاتیک رو با استفاده از کلمه کلیدی static  تعریف کنید. به مثال زیر توجه کنید :

میبینید که چقدر راحت میشه به پراپرتی های استاتیک دسترسی داشت. با استفاده از کلمه های کلیدی self  و parent  هم میتونید به پراپرتی های این کلاس و یا کلاس پدر دسترسی داشته باشید.

نحوه ی تعریف متدهای استاتیک

همونطور که در بالا میبینید متد start()  بصورت استاتیک تعریف شده و خیلی شیک و مجلسی میشه ازش نمونه ساخت. این نوع توابع در نگاه اول خیلی جالب به نظر میرسن… و سوالی که پیش میاد اینه که چرا همه متد هارو استاتیک تعریف نمیکنیم؟ 

متدهای استاتیک با اینکه اولش خیلی باحال به نظر میرسن ولی محدودیتی دارن که تنها در بعضی موارد میتونیم ازشون استفاده کنیم : “بخاطر استاتیک تعریف شدن این متدها ، امکان استفاده از $this  در این نوع متدها وجود ندارد.” ولی در مجموع این نوع متدهای خیلی پرکاربرذ هستند.

حذف کلید خارجی در لاراول

نوشته‌شده در توسط .

همونطور که میدونید اگه یه کلید خارجی توی مایگریشن ها و متد up()  اضافه کنیم ، باید اون رو توی متد down()  حذفش کنیم و یا به اصطلاح drop کنیم. روابط رو میتونید در phpmyadmin->structure->Relation view  ببینید . برای حذف این روابط داکیومنت خود لاراول گفته این کار رو بکنید :

To drop a foreign key, you may use the dropForeign method. Foreign key constraints use the same naming convention as indexes. So, we will concatenate the table name and the columns in the constraint then suffix the name with “_foreign”:

 

یک راه دیگه که توی داکیومنت لاراول گفته نشده اینه :

 

کار با بیش از یک دیتابیس در لاراول ۵

نوشته‌شده در توسط .

بعضی وقتا نیازه که شما با بیش از یک دیتابیس در ارتباط باشید در لاراول ، مثلا ممکنه برای هر وبلاگی که توی سیستم وبلاگ دهی شما ایجاد میشه یک دیتابیس درست کنید(البته فک نکنم تو این مورد ، این کار معقول باشه) اونجا نیاز هست که در اولین قدم توی فایل  config/database.php  کانکشن مربوط به این کار رو ایجاد کنید. بصورت پیشفرض ۴ کانکشن در لاراول ۵ تعریف شده که میتونید شما هم کانکشن دیگه ای برای استفاده تعریف کنید.

تعریف کانکشن برای اتصال به بیش از یک دیتابیس

توی کد بالا ما کانکشن mysql2  رو تعریف کردیم. دقت داشته باشید که کد بالا باید درون connectios تعریف کنید. همچنین توی ریشه اصلی پروژه و توی فایل .env  هم کانکشن باید مشخص شه… اون فایل رو ادیت کنید و مقادیر دلخواهتون رو اضافه کنید :

حالا کانکشن های شما آماده هستند و میتونید به روشی که در ادامه میگم از اونها استفاده کنید.

تغییر کانکشن پیشفرض در لاراول

برای اینکه در کل پروژه کانکشن پیشفرض رو تغییر بدیم ، در فایل  config/database.php  مقدار  'default' => 'mysql',  رو به  'default' => 'mysql2',  تغییر میدیم. در این صورت در کل پروژه شما mysql2 بعنوان کانکشن دیفالت استفاده خواهد شد.

استفاده از یک کانکشن در یک مدل خاص

اما گاهی لازمه که در یک مدل از یک کانکشن خاص استفاده بشه ، برای انجام این کار به روش زیر عمل میکنیم :

از این پس تمام اتصالاتی که با مدل بالا به دیتابیس وصل میشه با کانکشن mysql2 خواهد بود.

تغییر کانکشن در کنترلر

شاید بخواید جزئی تر شید و بخواید درون یک کنترلر خاص کانکشن رو عوض کنید . برای اینکار به راحتی از روش زیر اشتفاده کنید :

همونطور که میبینید با استفاده از متد  setConnection()  این کار شدنیه…

و استفاده در Query Builder :

برای استفاده از کانکشن دیگه توی کوئوری بیلدر هم بصورت زیر عمل میکنیم :

همونطور که میبینید لاراول بصورت خیلی شیک و تمیز کار شما رو راه میندازه و نیاز به اضافه کاری نیست.

امیدوارم به دردتون خورده باشم 🙂

آموزش و کاربرد استفاده IOC container در Laravel – قسمت ۱

نوشته‌شده در توسط .

امروز بحث رو اندکی تخصصی تر میکنیم و میریم سمت container قدرتمند لاراول. یکی از مشخصه هایی که لاراول رو از سایر فریمورک های PHP جدا میکنه ، همین IOC هست. Dependency injection  یا DI یا تزریق نیازمندیها یک موضوع مهم در همه زبانهای شئ گراست. اینکه شما سایر کلاسها رو در کلاس خودتون استفاده کنید خیلی مهمه… 

اما IOC کانتینر چیست؟

برای اینکه از یک کلاس در کدمون استفاده کنیم باید از اون نمونه بگیریم. یه چیزی مثل کد زیر :

 

حتما بارها شده که مقدار  Request $request  رو بعنوان ورودی به یک تابع در کنترلر میفرستید . سوالی که پیش میاد اینه که بدون نمونه گرفتن از کلاس Request چطور php اونو میشناسه؟ اینجاست که کاربرد IOC مشخص میشه. لاراول با کانتینرش شرایطی رو مهیا کرده که شما به راحتی با آبجکت ها کار کنید… لاراول وقتی کدی مثل FOO $foo  رو میبینه دنبال کلاس FOO میگرده که از اون نمونه بگیره. این خیلی خوبه. شما بدون اینکه از کلاس نمونه بگیرید نمونه گرفته میشه. بعضی وقتا پیش میاد که شما میخواید یک ریپازیتوری بنویسید که دیگران هم بتونن ازش استفاده کنن. اینجا نیاز هست که کلاس خودتون رو به لاراول برای نمونه گیری معرفی کنید و شما باید بصورت دستی کلاس رو به IOC بچسبونید یا به اصطلاح bind کنید.

نحوه ی bind یک کلاس به IOC در لاراول

در کد بالا EloquentUserRepository رو چسبوندیم به کانتینر و از این به بعد لاراول کلاس EloquentUserRepository رو میشناسه همه جا.

برای اطلاعات بیشتر کتاب Laravel: From Apprentice To Artisan رو که نوشته تیلور آتول -سازنده لاراول – هست رو بخونید

مفهوم و کاربرد اینترفیس – interface در PHP

نوشته‌شده در توسط .

قبلا در مورد کلاسهای abstract در PHP مطلبی نوشتم ، کلاسهای انتزاعی یا abstract کلاسهایی هستند که قابل نمونه گیری نیستند و میتونیم درون کلاسهای انتزاعی متد هایی بنویسیم و در کلاسهایی که از اون مشتق شدن ازش استفاده کنیم. اینترفیس ها دقیقا مثل کلاسهای انتزاعی هستند ، با این تفاوت که در اینترفیس ها هیچ متدی نمیتونه دارای بدنه باشه. اولش خیلی عجیب به نظر میرسه… وقتی متدها بدنه نداشته باشن ، به چه دردی میخودن؟

به خاطر داشته باشید که شما با تعریف یک متد در کلاس abstract نویسنده کلاسهای دیگه (که از این کلاس مشتق شدن) رو وادار نمیکردید که متدهای کلاس پدر رو بازنویسی کنه. ولی در اینترفیس ها اینطور هست ، یعنی هر کلاسی که یک اینرفیس رو implement کنه ، باید تمام متدهای کلاس پدر رو بازنویسی کنه.

مثلا شما میخواید کلاسی بسازید که یک تگ html رو رندر کنه و برای این کار نیاز هست که به تگ ، id و class داده بشه. شما میاید یه اینترفیس میسازید و درون اون دو تابع setID و setClass رو مینویسید. از اون به بعد هر کسی که کلاس خودش رو از اینترفیس شما مشتق کرد مجبوره که دو تا تابع رو بنویسه و این از خطای برنامه جلوگیری میکنه… شاید در پروژه های کوچیک زیاد به درد نخوره ، ولی پروژه هایی که تعداد زیادی توسعه دهنده روشون کار میکنند ، برای پیاده سازی design pattern ها حتما باید از اینترفیس ها استفاده کنن.

نحوه ی تعریف interface ها در PHP

برای تعریف اینترفیس ها از کلمه کلیدی interface استفاده میکنیم :

در مثال بالا کلاسها رو مجبور میکنیم که متد xyz رو بنویسن. برای ارث بردن یا به اصطلاح تکمیل کردن یک اینترفیس از کلمه کلیدی implements استفاده میکنیم :

نکته قابل توجه اینه که تمام متد ها و پراپرتی هایی که درون یک اینترفیس تعریف میشن باید بصورت عمومی یا public تعریف بشن ، در غیر اینصورت با اررور مواجه میشیم.

یک نکته دیگه اینکه یک کلاس میتونه بیش از یک اینترفیس رو implement کنه و همچنین یک اینترفیس میتونه از چند اینترفیس دیگه مشتق بشه.

کلاسهای abstract یا انتزاعی در PHP

نوشته‌شده در توسط .

کلاسهای abstract در اکثر زبان های شئ گرا وجود دارند. کلاسهایی هستند که قابل نمونه گیری نیستند ، و سایر کلاسها فقط میتوانند از آنها ارث بری کنند.

فرض کنید که شما یک کلاس animal دارید و میخواهید همه حیوانات از آن کلاس یا شئ مشتق شوند ، خود کلاس animal به تنهایی قابل نمونه گیری نیست. چون ما موجود حیون نداریم و مثلا گربه با به ارث بردن بخشی از ویژگی های حیوان به موجودیت میرسد . پس دلیل اینکه اسم این نوع کلاسها را abstact گذاشته اند هم قابل درک هست…

کاربرد کلاسهای abstract

حتما الان این سوال براتون پیش اومده که ” چه کاریه از abstract استفاده کنیم ؟ کلاس معمولی درست میکنیم ، ازش ارثم میبریم 🙂 ”

سوال به جایی هم هست ، در پروژه های بزرگ برای خوانایی برنامه از abstract ها استفاده میکنند . شما وقتی یک کلاس abstract رو میبینید ، خیلی راحت میفهمید که این تابع قابل نمونه گیری نیست و یک کلاس برای ارث برده شدن هست. در پروژه های کوچیک این مسئله زیاد خودش رو نشون نمیده ولی در پروژه های بزرگ خیلی کاربرد داره. مثلا همین فریمورک لاراول خودمون خیلی جاها از همین نوع کلاسها استفاده کرده…

کاربرد دیگه ی کلاسهای abstract این هست که شما با این نوع کلاسها میتونید نویسنده های کلاسهای فرزند رو وادار کنید که برخی توابع رو بازنویسی کنند( در ادامه بیشتر متوجه این موضوع میشید).

نحوه ی تعریف یک کلاس abstract

برای تعریف یک کلاس انتزاعی از کلمه کلیدی abstract  قبل از class  استفاده میکنیم :

الان اگه شما از کلاس بالا نمونه بگیرید با اررور مواجه میشید. طبیعی هم هست دیگه 🙂

یادتون باشه درون کلاس abstractتون میتونید متد هایی رو تعریف کنید و از اونها استفاده کنید و اون متد ها میتونن abstract باشن یا نه…

اگه متدی رو از نوع abstract تعریف کردید ، توسعه دهنده های دیگه رو مجبور میکنید : در صورتی که از کلاس شما کلاسی رو به ارث بردن ، حتما نابع رو دوباره بنویسن. مثلا هر کلاسی که از کلاس بالا مشتق بشه ، باید متد Greet رو دوباره بنویسه.

و یادتون باشه که متد های انتزاعی فقط درون کلاسهای انتزاعی قابل نوشته شدن هستند.

کلاس زیر از کلاس بالا مشتق شده :

همونطور که میبینید ما مجبور بودیم که متد  Greet()  رو بازنویسی کنیم. حالا میتونیم از کلاس Dog بصورت زیر نمونه بگیریم :

خیلی واضح و cool 🙂

امیدوارم کمکتون کرده باشم