Composer - asılılıqları idarəetmə sistemi
- PHP komponentlərindən niyə istifadə etməliyik?
- Komponentlərin axtarışı
- PHP komponentlərinin istifadəsi
- Composer-in quraşdırılması
- PHP komponentini layihəmizə quraşdırırıq
- vendor qovluğu
- PHPMailer komponentini öz layihəmizdə istifadə edirik
- composer.lock faylı
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ə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:
İ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:
Konsolda cd domains/myproject
əmrini yazıb Enter düyməsinə sıxırıq:
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
Bundan sonra myproject qovluğuna daxil oluruq. Göründüyü kimi yeni composer.json faylı yaradılıb:
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
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:
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ırmail()
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əlirmail()
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:
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:
Integrations bölməsindən PHPMailer seçirik və SMTP serverə qoşulmaq üçün lazımi məlumatlar təqdim edilir:
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" 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:
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.
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.json və composer.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.
Şərh yazmaq üçün hesabınıza daxil olun.