ایجاد package در لاراول


در هر فرم ورک، شرکت یا گروه سازنده ساختاری را جهت توسه فرم ورک در نظر میگیرند تا بتوان با استفاده از این ساختار فرم ورک مورد نظر را توسعه داد. در بعضی از فرم ورکها این ساختار به نام package یا Module یا plugin معروف است. که هر کدام از آنها توانایی گسترش Core اصلی را به کاربر میدهد.

# مراحل آموزش

1- psr چیست

2- نحوه استفاده از فایل composer.json 

3- استفاده از service provder کلاس 

4- استفاده از facade کلاس

#psr چیست

برای ایجاد یک package در لاراول در ابتدا باید با psr ها آشنا شویم، psr که مخفف نام PHP Standard Recommendation میباشد. به معنی استانداردهای توصیه شده توسط php میباشد.

در php سه category وجود دارد که زیر مجموعه آنها از هفت psr متشکل میشود .

Autoloading: psr0, psr4

Interfaces: psr3, psr6, psr7

CodeStyle: psr1, psr2

category که برای ما در این آموزش حائز اهمیت میباشد Autoloading است که شامل psr0 و psr4 میباشد.

لاراول در package های استفاده شده در پوشه vendor از psr4 استفاده کرده است. ما هم در این آموزش از psr4 استفاده میکنیم. داریکتوری psr4 به شکل زیر میباشد.

vendor\package-name\classname

  و در فایل composer.json میتونیم با استفاده از دستور زیر namespace خود را تعریف کنیم .

"psr-4": {
            "Vendor-name\\Package-name\\": "src/"
        }

با استفاده از کد بالا میتونیم به composer بگیم که در صورتی که این Vendor-name\Package-name صدا زده شد باید به پوشه src اشاره کنی . 

در پوشه src دو فایل حائز اهمیت میباشند . facade کلاس , serviceProvider هر کدام از این کلاسهای باید در package که برای لاراول نوشته میشود وجود داشته باشند . 

فرض کنید که ما میخواهیم بک package ایجاد کنیم که بر اساس ورودی که میگیره google رو سرچ کنه و نتیجه رو به صورت یک آرایه که شامل 10 جستجوی اول گوگل باشد به ما بدهد .

در ابتدا اینو باید بگم که ما هر package که ایجاد میکنیم و بخواهیم همه از این package استفاده کنند باید این package رو در شبکه هایی مثل github آپلود کنیم و بعد از اون ، اون package رو در وبسایت packages معرفی کنیم .

structure پوشه بندی یک package به شکل زیر میباشد .

#نحوه استفاده از فایل composer.json

در فایل composer.json باید مقادیری که مربوط به package ما و همچنین اطلاعات ما از قبیل ایمیل و نام ما میباشد نوشته شود، محتوای این فایل composer.json به شکل زیر میباشد .

{
    "name": "mkdesignn/googlesearch",
    "description": "search keyword, phrase, sentence in google",
    "require": {
        "php": ">=5.3"
    },
    "autoload":{
      "psr-4":{
          "mkdesignn\\googlesearch\\":"src/"
      }
    },
    "license": "mit",
    "authors": [
        {
            "name": "mohammad kaab",
            "email": "mohammad.kaab@gmail.com"
        }
    ]
}

خوب همانطور که از فایل بالا قابل تشخیص است با استفاده از autoload و psr4 میتونیم به composer بگیم که به چه صورت فایل ها موجود در پوشه src را استفاده کند . 

"mkdesignn\\googlesearch\\":"src/"

کد بالا به این معنی میباشد وقتی که از namespace mkdesignn\googlesearch استفاده کنیم ، این namespace به پوشه src موجود در آن structure اشاره میکند .

بعد از اینکه فایلهای مورد نظر را ایجاد کردیم نوبت به خود فایل search.php میرسد ، این فایل core اصلی package میباشد . که حاوی کد زیر میباشد . و در پوشه src قرار میگیرد .

namespace mkdesignn\googlesearch;

class google
{

    public function find($keyword){

        // get the content from the google website
        $subject = file_get_contents("http://www.google.com/search?q=".urlencode($keyword));

        // get any things that start with h3 tag and end with h3 tag
        $href_pattern = '/<h3 class="r">(.*?)<\/h3>/s';
        preg_match_all($href_pattern, $subject, $matches);

        foreach ($matches[0] as $key => $match) {

            // get any charachter that souranded between the href attribute
            $replacment_pattern = '/href="([^"]+)"/';
            preg_match($replacment_pattern, $match, $found);

            // get the first part of the whole url and break it
            // by using the & charachter
            $found = explode("&", $found[1]);

            // replace the url?q= with nothing
            $found[0] = str_replace("/url?q=", "", $found[0]);

            // decode the url if it was encoded
            $found[0] = urldecode($found[0]);

            // replace the found into the match using replacment_pattern
            $replace_url = preg_replace($replacment_pattern, "href='".$found[0]."'", $match);
            settype($replace_url, "string");

            // replace the new url to the old one
            if( gettype($replace_url) != "boolean" )
                $matches[0][$key] = $replace_url;
            else
                unset($matches[0][$key]);

            if( json_encode($matches[0][$key]) == false )
                unset($matches[0][$key]);
        }

        // return all matches result
        return $matches[0];
    }
}

#استفاده از service provder کلاس

بعد از اینکه فایل search.php ایجاد شد ، نوبت به فایل googleServiceProvider میرسد .

این فایل googleServiceProvider جهت register کردن فایل google.php در container استفاده میشود ، کد مربوط به کلاس googleServiceProvider به شکل زیر میباشد .

namespace mkdesignn\googlesearch;

use Illuminate\Support\ServiceProvider;

class GoogleServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('google', function ($app) {
            return $app->make('mkdesignn\googlesearch\google');
        });

    }
}

#استفاده از facade کلاس

بعد از این مرحله نوبت به کلاس facade میباشد، در صورتی که package شما نیازی به facade کلاس نداشته باشد ، میتوان از آن استفاده نکرد . کد مربوطه به کلاس facade  به شکل زیر میباشد .

namespace mkdesignn\googlesearch;

use Illuminate\Support\Facades\Facade;

class GoogleFacade extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'google';
    }
}

در صورتی که نیاز به اطلاعات بیشتر در مورد facade کلاس داشته باشید میتوانید از این آموزش اطلاعات بیشتری را کسب کنید.

بعد از این کار package خود را در github آپلود کنید و همانطور که قبلا گفته شد در سایت packages تحت ورژن v1.0 آن را معرفی کنید. 

امیدوارم از این آموزش خوشتون اومده باشه .

مشکل ، مورد ، نظر ، ایده هر سوالی که به ذهنتون در مورد این آموزش میرسه لطفاً بیان کنید