Composer - asılılıqları idarəetmə sistemi

Hazırda PHP proqramlaşdırma dilində monolit freymvörklərə deyil, bir-biri ilə qarşılıqlı əlaqədə olan komponentlərdən ibarət həllərə üstünlük verilir.

PHP komponentlərindən niyə istifadə etməliyik?

İndi bir çox PHP proqramçılar müasir PHP komponentlərindən istifadə edirlər. Lakin əvvəllər bu imkan əlçatmaz idi. Bir sıra köhnə freymvörklərin çatışmazlığı ondan ibarət idi ki, onlar seçim azadlığını məhdudlaşdırırdılar. Belə ki freymvörkdə lazımi funksionallıq olmadıqda, kənar PHP komponentlərinin axtarışı və inteqrasiyası ilə əlaqədar böyük çətinliklər yaşanırdı. Bu halda digər proqramçı tərəfindən yazılmış kodun freymvörkə inteqrasiyası çətin idi, kənar kod və köhnə freymvörklər əksər hallarda ümumi interfeysə malik olmurdular. İndi əminliklə demək olar ki, bu gün biz artıq monolit freymvörklərin əsiri deyilik və onlar tərəfindən qoyulmuş məhdudiyyətlərdən azadıq.

Hazırda çoxsaylı ixtisaslaşmış komponentlər arasında seçim və onlardan istifadə imkanına malikik. nikic/fast-route  kimi marşrutlayıcı (router) komponenti olduğu halda, yeni marşrutlayıcı hazırlamaq lazımdırmı? Yaxud e-poçt göndərmək üçün phpmailer/phpmailer  komponentindən istifadə imkanı əlçatan olduğu halda, analoji funksionallığa malik kitabxana yazmaq üçün vaxt sərf etməyə dəyərmi? Digər proqramçılar bu cür ixtisaslaşmış komponentlərin yazılmasına, təkmilləşdirilməsinə və testdən keçirilməsinə xeyli vaxt sərf edirlər. Ona görə eyni funksionallığa malik komponent hazırlamaq əvəzinə, mövcud komponentlərdən istifadə etmək daha məqsədəuyğundur. Bu halda öz layihəmizlə bağlı digər tapşırıqları icra etməyə daha çox vaxtımız olar.

Komponentlərin axtarışı

Müasir PHP komponentlərini https://packagist.org saytında axtarıb tapa bilərsiniz. Sözügedən saytda PHP komponentlərinin açar sözlər üzrə axtarışı mümkündür.

php komponentləri üçün kataloq

PHP komponentlərinin istifadəsi

https://packagist.org saytındakı PHP komponentlərini əmr sətrindən işə salınan Composer-in köməyilə quraşdırmaq lazımdır. Composer bizə lazım olan PHP komponentini özü yükləyir və onu layihəmizin avtomatik yükləməsinə əlavə edir. Belə ki Composer asılılıqların idarəetməsini təmin edir, quraşdırılan PHP komponentinin asılı olduğu digər komponentləri də özü avtomatik quraşdırır.

Bir sözlə Composer özü asılılıqların idarə edilməsi və avtomatik yükləmə ilə bağlı mürəkkəb problemlərin həlli ilə məşğul olur. Avtomatik yükləmə - çoxlu sayda require(), require_once(), include() və ya include_once() funksiyalarından istifadə etmədən PHP siniflərinin (class) avtomatik yüklənilməsi prosesidir. PHP-nin əvvəlki versiyaları __autoload() funksiyasının köməyilə şəxsi avtomatik yükləyici hazırlamağa imkan verirdi. Bu halda layihəmizdə yeni sinif yaratdıqda avtomatik yükləyici PHP interpretator tərəfindən avtomatik çağrılır. PHP 8.0.0 versiyasında __autoload() funksiyası köhnəlmiş hesab edilərək silinib. Bu məqsədlə PHP SPL kitabxanasına aid olan spl_autoload_register() funksiyasından istifadə etmək tövsiyə edilir. Təəssüf ki, vahid standartın olmaması hər bir layihə üçün unikal avtomatik yükləyicinin hazırlanmasını tələb edirdi. Bu halda digər proqramçılar tərəfindən yazılmış kodun istifadəsi və paylaşılması çətinləşirdi.

PHP Framework Integor Group bu problemin həlli məqsədilə PSR-0 standartını (sonra PSR-4 standartı ilə əvəz olunub) hazırlayıb. PSR-4 standartı layihədə ad fəzaları (namespace) və fayl sistemi qovluqlarını nəzərə almaqla kodun təşkilini elə təklif edir ki, o, vahid standart avtomatik yükləməyə uyğun gəlsin. Composer özü layihəmizdəki bütün PHP komponentləri üçün PSR standartına uyğun avtomatik yükləyici generasiya edir.

Composer-in quraşdırılması

Composer-i onun rəsmi saytından yükləyə bilərsiniz. Əgər OpenServer-dən istifadə edirsinizsə, onda composer artıq sizdə quraşdırılıb. Burda OpenServer-in quraşdırılması və tənzimlənməsi barədə ətraflı oxuya bilərsiniz.

İndi isə domains qovluğunda (D:\OpenServer\domains) myproject qovluğu yaradırıq. Sonuncunun içərisində isə index.php faylı yaradıb ona aşağıdakı kodu əlavə edirik və yadda saxlayırıq:

<?php

error_reporting(-1);

echo 'My project';

Brauzerdə http://myproject/ ünvanına daxil oluruq:

myproject

İndi tapşırıqlar panelində (system tray) yaşıl rəngli bayraq işarəsinin üzərinə mausun düyməsi ilə sıxırıq və açılan menyudan əvvəlcə "Дополнительно", daha sonra "Консоль" seçirik:

əmr sətri

Konsolda cd domains/myproject əmrini yazıb Enter düyməsinə sıxırıq:

layihəmizin yerləşdiyi qovluğa keçirik

Konsolda composer init əmrini yazıb Enter düyməsinə sıxırıq. Sözügedən əmr bizə composer.json konfiqurasiya faylını hazırlamağa kömək edir, bu məqsədlə aşağıdakı suallara cavab vermək lazımdır:

  • Package name (<vendor>/<name>) [emil/myproject] - paketin adı iki hissədən ibarətdir: vendor (hazırlayanın adı) və name (paketin adı). Mən olduğu kimi (emil/myproject) saxlayıb, Enter düyməsinə sıxıram
  • Description []: layihənin təsviri. example package yazıb Enter düyməsinə sıxırıq
  • Author [, n to skip]: layihənin müəllifi. Emil Huseynov <admin@vebkurs.info> formatında yazırıq. Əlbəttə ki siz öz ad və e-poçtunuzu yazırsınız. Sonra Enter düyməsinə sıxıb davam edirik
  • Minimum Stability []: boş saxlayırıq və Enter düyməsinə sıxırıq
  • Package Type (e.g. library, project, metapackage, composer-plugin) []: paketin tipi. project yazıb Enter düyməsinə sıxırıq
  • License []: yazılmış koda tətbiq olunacaq lizensiyanın növü. proprietary yazıb Enter düyməsinə sıxırıq
  • Would you like to define your dependencies (require) interactively [yes]? - PHP komponentlərini interaktiv şəkildə yükləyib-yükləməmək soruşulur. no yazıb Enter düyməsinə sıxırıq
  • Would you like to define your dev dependencies (require-dev) interactively [yes]? - bu dəfə tərtibatçı mühiti üçün PHP komponentlərini interaktiv şəkildə yükləyib-yükləməmək soruşulur. no yazıb Enter düyməsinə sıxırıq
  • Add PSR-4 autoload mapping? Maps namespace "Emil\Myproject" to the entered relative path. [src/, n to skip]: PHP komponentləri üçün PSR 4 standartına uyğun avtomatik yükləyici generasiya etmək soruşulur. no yazıb Enter düyməsinə sıxırıq
  • Do you confirm generation [yes] - konfiqurasiya faylının hazırlanmasını təsdiq etməyimiz tələb olunur. yes yazıb Enter sıxırıq

composer.json faylının generasiya edilməsi

Bundan sonra myproject qovluğuna daxil oluruq. Göründüyü kimi yeni composer.json faylı yaradılıb:

composer.json faylı

composer.json faylının tərkibi aşağıdakı kimidir:

{
    "name": "emil/myproject",
    "description": "example package",
    "type": "project",
    "license": "proprietary",
    "authors": [
        {
            "name": "Emil Huseynov",
            "email": "admin@vebkurs.info"
        }
    ],
    "require": {}
}

JSON - strukturlaşdırılmış məlumatları göstərmək üçün mətn formatıdır.

PHP komponentini layihəmizə quraşdırırıq

Əvvəlcə https://packagist.org saytına daxil oluruq və axtarış xanasına phpmailer yazıb Enter düyməsinə sıxırıq - https://packagist.org/?query=phpmailer. Sonra phpmailer/phpmailer komponentinin səhifəsinə daxil oluruq. Həmin səhifədə PHP komponentinin müəllifi, qısa təsviri, istifadəsi, github səhifəsi və sairə haqda məlumat verilir.

İstənilən PHP komponentini quraşdırmaq üçün require əmrindən istifadə edilir. Məsələn, phpmailer komponentini layihəmizə quraşdırmaq üçün konsolda layihəmizin yerləşdiyi qovluğa (indiki halda myproject) daxil oluruq və aşağıdakı əmri icra edirik:

composer require phpmailer/phpmailer

"phpmailer" komponentinin quraşdırılması

Yuxarıdakı əmrin icrası nəticəsində composer.json faylının tərkibi yenilənir və require bölməsinə aşağıdakı sətir əlavə edilir:

"phpmailer/phpmailer": "^6.7"

Bu, quraşdırdığımız PHP komponentini və onun versiyasının nömrəsini göstərir. Biz sözügedən komponent üçün hər hansı konkret versiyanı göstərmədiyimiz üçün onun ən son versiyası quraşdırılıb.

vendor qovluğu

Composer tərəfindən quraşdırılan bütün PHP komponentlər vendor qovluğunda yerləşir:

vendor qovluğu

Həmin qovluqda, həmçinin autoload.php faylı yerləşir. Quraşdırdığımız PHP komponentindən istifadə etmək üçün autoload.php faylını index.php faylına əlavə edirik. require konstruksiyasından istifadə edirik:

<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

Bu qədər sadə! İndi isə Composer-in köməyilə quraşdırdığımız PHP komponentindən istifadə edə bilərik.

PHPMailer komponentini öz layihəmizdə istifadə edirik

İlk öncə qeyd edim ki, PHP-də mail() funksiyası vasitəsilə də e-poçt göndərmək mümkündür. Sözügedən funksiya Linux-un daxili poçt proqramı sendmail-i işə salır. Lakin mail() funksiyası aşağıdakı çatışmazlıqlara malikdir:

  • mail() funksiyasının işləməsi üçün konfiqurasiya edilmiş lokal server lazımdır
  • mail() funksiyasının köməyilə göndərilən məktuba əlavə başlıqlar (additional_headers) əlavə edilməsi yorucudur, çünki çoxlu simvol ekranlaşdırmaq lazım gəlir
  • mail() funksiyasının köməyilə HTML formatında məktub göndərmək istədikdə "spaqetti" kod alınır

PHPMailer yuxarıda sadalanan çatışmazlıqlara malik deyil və SMTP protokolundan istifadə edir. Sözügedən komponentin köməyilə HTML formatında məktublar hazırlamaq, məktublara fayl bərkitmək çox asandır, həmçinin TLS və SSL protokolları dəstəklənir.

PHP komponentinin səhifəsində ondan istifadə nümunəsi göstərilib. Mən həmin koda bəzi dəyişikliklər edərək onu index.php faylına əlavə edirəm:

<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require __DIR__ . '/vendor/autoload.php';

$mail = new PHPMailer();

//Server tənzimləmələri
$mail->SMTPDebug = SMTP::DEBUG_SERVER;                 // Göndərmə zamanı qeydə alınan səhvləri göstəririk
$mail->isSMTP();                                       // SMTP protokolu ilə göndəririk
$mail->SMTPAuth = true;                                // SMTP autentifikasiyanı aktiv edirik
$mail->Host = 'smtp.example.com';                      // SMTP serverin ünvanını təyin edirik
$mail->Port = 465;                                     // Qoşulma portu
$mail->Username = 'user@example.com';                  // SMTP istifadəçi adı
$mail->Password = 'secret';                            // SMTP şifrə
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;    // TLS şifrələməni aktiv edir

// Göndərənin e-poçt ünvanı və adı
$mail->setFrom('list@example.com', 'List Manager');

// Qəbul edən
$mail->addAddress('admin@vebkurs.info', 'Emil');

// Elektron məktubun məzmunu
$mail->CharSet = 'UTF-8';                               // Kodlaşdırmanı təyin edirik
$mail->isHTML(true);                                    // HTML formatını aktiv edirik
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if ($mail->send()) {
    echo 'Məktub göndərildi';
} else {
    echo 'Məktubun göndərilməsi zamanı səhv qeydə alındı: ' . $mail->ErrorInfo . "\n";
}

Brauzerdə http://myproject/ ünvanına daxil olduqda aşağıdakı səhvlə qarşılaşırıq:

smtp səhv

Tamamilə doğrudur, çünki SMTP serverin ünvanı, qoşulma portu, SMTP istifadəçi adı və şifrəsi düzgün deyil. Mən real istifadəçilərə elektron məktub göndərməzdən əvvəl skriptin funksionallığını yoxlamaq üçün Mailtrap Email Testing kimi elektron poçt test alətindən istifadəni tövsiyə edirəm.

Mailtrap Email Testing xidmətindən istifadə etmək üçün https://mailtrap.io/signin səhifəsində ya yeni hesab yaratmalı, ya da sosial şəbəkə hesabları üzərindən giriş etməliyik. Mən Gmail hesabı ilə Mailtrap Email Testing xidmətinə giriş edirəm. Sonra Email Testing -> Inboxes bölməsini seçib My Inbox qutusuna daxil oluruq:

my inbox qutusuna daxil oluruq

Integrations bölməsindən PHPMailer seçirik və SMTP serverə qoşulmaq üçün lazımi məlumatlar təqdim edilir:

smtp serverə qoşulmaq üçün lazımi  məlumatlar

Bundan sonra index.php faylında PHPMailer komponentinə həmin məlumatları əlavə edirik:

<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require __DIR__ . '/vendor/autoload.php';

$mail = new PHPMailer();

//Server tənzimləmələri
$mail->SMTPDebug = SMTP::DEBUG_OFF;                    // Göndərmə zamanı qeydə alınan səhvləri göstərmirik
$mail->isSMTP();                                       // SMTP protokolu ilə göndəririk
$mail->SMTPAuth = true;                                // SMTP autentifikasiyanı aktiv edirik
$mail->Host = 'sandbox.smtp.mailtrap.io';              // SMTP serverin ünvanını təyin edirik
$mail->Port = 2525;                                    // Qoşulma portu
$mail->Username = 'istifadəçi adı';                    // SMTP istifadəçi adı
$mail->Password = 'şifrə';                             // SMTP şifrə
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;    // TLS şifrələməni aktiv edir

// Göndərənin e-poçt ünvanı və adı
$mail->setFrom('list@example.com', 'List Manager');

// Qəbul edən
$mail->addAddress('admin@vebkurs.info', 'Emil');

// Elektron məktubun məzmunu
$mail->CharSet = 'UTF-8';                               // Kodlaşdırmanı təyin edirik
$mail->isHTML(true);                                    // HTML formatını aktiv edirik
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if ($mail->send()) {
    echo 'Məktub göndərildi';
} else {
    echo 'Məktubun göndərilməsi zamanı səhv qeydə alındı: ' . $mail->ErrorInfo . "\n";
}

Yuxarıdakı kodda "istifadəçi adı" və "şifrə" yerlərinə Mailtrap Email Testing xidməti tərəfindən təqdim edilmiş məlumatları daxil edin. Bundan sonra brauzerdə yenidən http://myproject/ ünvanına daxil oluruq:

məktub göndərildi

"Məktub göndərildi" mesajı kodun düzgün işləməsini bildirir. Mailtrap Email Testing xidmətində Inboxes qutusunu yoxlayırıq. Bəli, məktub poçt qutusuna gəlib:

inboxes qutusunu yoxlayırıq

composer.lock faylı

myproject qovluğunda composer.lock faylı da mövcuddur. Bu fayl çox vacibdir və layihədə istifadə olunan bütün PHP komponentlərin siyahısını özündə saxlayır. Sözügedən faylda, həmçinin komponentlərin versiyaları saxlanılır.

composer.lock faylı

Müəyyən vaxtdan sonra öz layihənizi, məsələn, işlək serverdə yerləşdirmək istədikdə vendor qovluğunu serverə köçürməyə ehtiyac yoxdur. Sadəcə composer.jsoncomposer.lock fayllarını işlək serverə köçürmək və əmr sətrindən saytın yerləşdiyi qovluğa daxil olub composer install əmrini icra etmək lazımdır. Və PHP komponentlər quraşdırılacaq.

Lakin nəzərə alın ki, composer install əmri PHP komponentlərinin composer.lock faylında göstərilmiş versiyasını quraşdırır. PHP komponentlərinin yeni versiyasını quraşdırmaq üçün composer update əmrindən istifadə edin. Bu əmr komponentin yeni versiyasını yoxlayır, əgər varsa, onu quraşdırır. Bu halda, həmçinin composer.lock faylının tərkibi yenilənir.

Composer asılılıqları idarəetmə sisteminin digər əmrlərini burda ətraflı oxuya bilərsiniz.

0

Şərh yazmaq üçün hesabınıza daxil olun.