Autoloading کلاس ها با Composer

Autoloading کلاس ها با Composer

پنج شنبه 18 آبان 1396

همانطور که می دانیم در php برای استفاده از هر کلاسی باید اون کلاس رو در صفحه ای که لازم داریم include یا require کنیم تا php آن کلاس را بشناسد و بتوان از آن استفاده کرد . خب مشکل اینجاست که اگر تعداد کلاس های مورد استفاده زیاد شود این include کردن هر کلاس واقعا مشکل ساز میشه و تمرکز مارو کم می کنه و بیشتر وقتمون میره سمت اینکه کلاس ها در داخل کدام دایرکتوری هستند و تک تک آن ها را به صفحه ی خودمون include کنیم .

خوشبختانه composer این مشکل را برای ما حل کرده و خودش این موضوع را به عهده می گیرد و ما فقط کافی است بسته به نیازمون یکی از 3 روش زیر را که در فایل composer.json می باشد استفاده نماییم . داخل فایل composer آبجکتی به نام autoload وجود دارد که داخل آن تعریف می کنیم که چه فایل هایی را و از چه طریق برای ما autoload بسازد.

3روش autoloading در composer عبارتند از :

سایت اصلی composer روش PSR-4 Autoloading را پیشنهاد می کند اما ما در این مقاله  هر 4 روش را بررسی می نماییم .

روش File Based Autoloading

  1. در روت (root) پروژه خودتون یک فولدر به نامaldemo ایجاد کنید .
  2. سپس داخل فولدرaldemo یک فولدر دیگر به نام mylibrary ایجاد می کنیم تا فایل های خودمون را داخل اش قرار بدهیم .
  3. داخل فولدر mylibrary یک فایل به نام functions.php ایجاد و کدهای زیر را قرار دهید :
    <?php
    
    function lego () {
        return 'You are now a master builder.';
    }
    
  4. حالا داخل فولدر(aldemo) پروژه امون فایل composer.json را ایجاد و کدهای زیر را قرار می دهیم :
    {
        "autoload": {
            "files": ["mylibrary/functions.php"]
        }
    }
    
  5. همانطور که در بالا مشاهده می کنید یک آبجکت به نام autoload داریم و داخل آن  مشخص کردیم که به چه روشی autoload برای ما ساخته شود . ما روش files را تعیین کردیم و جلوی آن فایل هایی که قرار است به صورت autoload درآیند را بصورت عناصر آرایه مشخص می کنیم .
  6. حالا برای ایجاد autoload باید ترمینال را باز کرده و به روت پروژه بروید و یکی از دستورات زیر را اجرا کنید :
    
    composer dump
    یا
    composer dumpautoload
    

    بعد از اجرای فرمان بالا و زدن دکمه اینتر مشاهده می کنید که در روت پروژه , فولدری به نام vendor ساخته می شود .جهت مشاهده تغییرات وارد پوشه vendor سپس پوشه composer شده و فایل autoload_files.php را باز نمائید.

    <?php
    // autoload_files.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        '239a881d87672da709af2b939c130dab' => $baseDir . '/mylibrary/functions.php',
    );
    

    در خط 8 مشاهده می کنید مسیر فایل function.php به این فایل افزوده شده است.

  7. اگر تمام مراحل بالا به درستی انجام شده باشد, فرایند ساخت autoload به وسیله composer و از روش files به موفقیت به اتمام رسیده است . حالا برای استفاده از فایل function.php کافی است در فولدر aldemo فایلی به نام index.php ایجاد کنید و کدهای زیر را قرار دهید :
    <?php
    require 'vendor/autoload.php';
    echo lego();
    
  8. در کدهای بالا در خط اول لازم بود که autoload.php را به فایل index امان require کنید . و در خط بعدی از فانکشن lego که در فایل function.php موجود هست استفاده کردیم .

روش Classmap Based Autoloading

این روش از روش File Based Autoloading بهتر است به این خاطر که شما لازم نیست مسیر واقعی فایل خود را مشخص کنید و تنها دایرکتوری که فایل در آن قرار دارد را مشخص می کنیم.

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

  1. فولدری به نام classes در شاخه aldemo ایجاد نمائید.سپس فایل myclass.php را در آن ایجاد و کدهای زیر را در آن قرار دهید :
    <?php
    Class Cmautoload {
     
    	  public function classmap () {
    		  return 'that knows how to autoload with a classmap! ';
    	  }
    }
    
  2. فایل index.php را مطابق زیر تغییر دهید :
    <?php
     
    require 'vendor/autoload.php';
     
    echo lego();
     
    $cm = new Cmautoload;
    echo $cm->classmap();
    
  3. فایل composer.json را مطابق زیر تغییر دهید :
    {
        "autoload": {
            "files": [
    			"mylibrary/functions.php"
    		],
    		"classmap": [
    			"classes"
    		]
    	}
    }
    
  4. حالا برای ایجاد autoload باید ترمینال را باز کرده و به روت پروژه بروید و یکی از دستورات زیر را اجرا کنید :
    
    composer dump
    یا
    composer dumpautoload
    

    جهت مشاهده تغییرات وارد پوشه vendor سپس پوشه composer شده و فایل autoload_classmap.php را باز نمائید.

    <?php
    
    // autoload_classmap.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'Cmautoload' => $baseDir . '/classes/myclass.php',
    );
    
    

    در خط شماره 9 مشاهده می کنید مسیر کلیه کلاس های موجود در پوشه classes افزوده شده است.

روش PSR-4 Based Autoloading

استاندارد psr-4 بر خلاف دو روش قبلی یعنی File Based Autoloading , Classmap Based Autoloading با namespace ها در کلاس ها سرو کار دارد .

  1. مسیر زیر را در پروژه خود ایجاد نمائید:

    src/vegibit/library

  2. فایل greeting.php را در مسیر بالا ایجاد و کدهای زیر را در آن قرار دهید:
    <?php
    namespace VegibitLibrary;
     
    Class Greeting
    {
        public function hi()
        {
            return "We got you covered";
        }
    }
    
    
  3. فایل index.php را مطابق زیر تغییر دهید :

    <?php
     
    require 'vendor/autoload.php';
     
    echo lego();
     
    $cm = new Cmautoload;
    echo $cm->classmap();
     
    $obj = new VegibitLibrary\Greeting();
    
    echo $obj->hi();
    
  4. فایل composer.json را مطابق زیر تغییر دهید:
    
    {
        "autoload": {
            "files": [
    			"mylibrary/functions.php"
    		],
    		"classmap": [
    			"classes"
    		],
    		"psr-4": {
    			"VegibitLibrary\\" : "src/vegibit/library/"
    		}
    	}
    }
    
  5. حالا برای ایجاد autoload باید ترمینال را باز کرده و به روت پروژه بروید و یکی از دستورات زیر را اجرا کنید :
    
    composer dump
    یا
    composer dumpautoload
    

    جهت مشاهده تغییرات وارد پوشه vendor سپس پوشه composer شده و فایل autoload_psr4.php را باز نمائید.

    <?php
    
    // autoload_psr4.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'VegibitLibrary\\' => array($baseDir . '/src/vegibit/library'),
    );
    
    
    

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


کلیه فایل های بالا را می توانید از لینک زیر دانلود نمایید:

aldemo.zip


منابع مورد مطالعه جهت جمع آوری این مطلب:
https://alihossein.ir/tutorials/آموزش-autoloading-کلاس-compose
http://vegibit.com/composer-autoloading-tutorial/


نظرات