# PHP-ის ლინტერი

დეველოპმენტის პროცესში გააზრებულად თუ გაუაზრებლად დეველოპერები აყალიბებენ კოდის წერის სტანდარტებს.

კოდის წერის სტანდარტი არის სტილი, რომელსაც ავრცელებ მთელს შენს codebase-ზე იმისათვის, რომ მოირგო საკუთარ თავზე, ჩამოაყალიბო დისციპლინა, გაალამაზო კოდი.

## რა საჭიროა კოდის წერის სტილის ჩამოყალიბება? <a href="#d3dc" id="d3dc"></a>

ამისათვის საფუძვლიანი მიზეზები არსებოს. ერთ-ერთი და უმთავრესი მიზეზი არის დისციპლინა. კოდში თუ გაქვს დისციპლინა დაცული და გაქვს შემუშავებული წერის სტილი, ამ შემთხვევაში კოდში გარკვევა და შემდგომი ნაწილების მიმატება გაცილებით მარტივდება. ამასთანავე გუნდში კოდის წერის სტილის არსებობა, რომელსაც თითოეული გუნდის წევრი დაიცავს — არანორმალურად მნიშვნელოვანია. ასეთი მიდგომა ამარტივებს გუნდურ მუშაობას და ახალშემატებული დეველოპერიც მარტივად ერკვევა კოდში. ასევე, როდესაც ეს სტანდარტი შემუშავებულია და დამკვიდრებული კოდში არც იმაზე გაღიზიანდები “მე, რომ სფეისები მიყვარს ფუნქციის არგუმენტების გარშემო ეს ტიპი ერთმანეთზე მიწებებულად რატო წერს, თვალები არ სტკივა?!”

…

მაგრამ კოდის სტანდარტების შენარჩუნება სუფთა ხელებით საკმაოდ დიდ ძალისხმევას და დროს მოითხოვს, ამიტომაც თითქმის ყოველ ენაში არსებობს linter-ის ცნება და შესაბამისი ხელსაწყო.

## რა არის ლინტერი? <a href="#a10a" id="a10a"></a>

ლინტერი არის ჩვეულებრივი ხელსაწყო, რომელიც გეხმარება კონკრეტული კოდის სტილის დანერგვაში და ასევე ხარვეზების პოვნაში.

უმეტესწილად ლინტერები გამოიყენებიან IDE-სთან ერთად და კონკრეტულ მოვლენაზე(event)-ზე ხდება ლინტერის ამუშავება და კონკრეტული კოდის ნაწილის შესწორება.

ამასთანავე ლინტერი შეიგძლია გაუშვა command line-დან, რომ გადაუაროს მთელს შენ პროექტს და შეასწოროს ყველა ხარვეზი.

## PHP-ის ლინტერი აქვს? <a href="#id-9851" id="id-9851"></a>

მოკლე პასუხი — კი.

ვრცელი პასუხი — ლარაველი დღესდღეობით ყველაზე პოპულალური ფრეიმვორქია PHP-ის სამყაროში. თითონ ლარაველი კი მრავლად იყენებს ასევე პოპულალური ფრეიმვორქის, Symfony-ის კომპონენტებს.

Symfony-ს შემქმნელმა Fabien Potencier-მა, გამოიჩინა რა კეთილგონიერება და შექმნა PHP-ის ლინტერი — [CS Fixer](https://cs.symfony.com/)\
მადლობა ფაბიენს 🙌

## როგორ შეიძლება დავაყენოთ CS Fixer ჩვენს ლარაველის პროექტში? <a href="#b7ec" id="b7ec"></a>

CS Fixer-ის დაყენების რამოდენიმე გზა არსებობს:

* გლობალურად დაყენება composer-ის საშუალებით
* გლობალურად დაყენება composer-ის გარეშე
* პროექტის ჭრილში, composer-ით დაინსტალირბა

ამ მაგალითში ჩვენ განვიხილოთ, როგორ უნდა გავმართოთ CS Fixer ჩვენი პროექტის ჭრილში და ასევე დავუკავშიროთ VSCode-სა და PHPStorm-ს.

> სხვა IDE-ებთან დაკავშირებაც მსგავსი პროცესია

ჩვენი ლარაველის პროექტის root ფოლდერში, ტერმინალში გავუშვათ ბრძანება, რომელიც დააინსტალირებს CS Fixer-ის composer-ის ბიბლიოთეკას:

```shell
composer require friendsofphp/php-cs-fixer --dev
```

თუ იყენებთ PHPStorm-ს მაშინ საჭიროა სპეციფიური ვერსია დააინსტალიროთ რადგან ამ მომენტისათვის(2022 - ნოემბერი) PHPStorm ახალ CS Fixer-ის ვერსიასთან არ არის თანხვედრაში:

```shell
composer require friendsofphp/php-cs-fixer:v3.10.0 --dev
```

შემდგომ, თუ ვნახავთ ჩვენს პროექტში */vendor/bin* -ში არსებულ executable ფაილებს, დავინახავთ, რომ აქედან ერთ-ერთი არის *php-cs-fixer*.

ჩვენი პროექტის root ფოლდერში თუ გავუშვებთ, ბრძანებას:

```
./vendor/bin/php-cs-fixer
```

დავინახავთ, რომ CSFixer -ი წარმათებით დაინსტალირდა და დაგვიწერს მის შესახებ ინფორმაციას.

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2F44no4tp0ocGOnGRhPdzs%2Fimage.png?alt=media&#x26;token=32471fae-6915-4b06-a77d-4777e18bf7ff" alt=""><figcaption></figcaption></figure>

დავრწმუნდით, რომ *php cs fixer* მუშაობს 🙏

{% hint style="warning" %}
ჩვენი ლარაველის პროექტი საწყის ეტაპზე არის დაუფორმატებელი. შესაბამისად როდესაც რაიმე კოდს დავწერთ და დავაფორმატებთ ფაილს, ჩვენს მიერ დაწერილი კოდის გარდა კიდევ ბევრი რამ ფორმატდება.\
\
რის გამოც გიტის კომიტებში ზოგჯერ ჭირს იმის გარჩევა თუ რა გავაკეთეთ, და ისედაც მუშაობის დროს არ არის კომფორტული. შესაბამისად საჭიროა php-cs-fixer ის გამართვისთანავე ბარემ დავაფორმატოთ ჩვენი მთელი პროექტი. \
\
ამის გასაკეთებლად სულ რამოდენიმე მარტივი step-ის განხორციელებაა საჭირო.
{% endhint %}

ჩვენს composer.json ფაილში scripts-ში ჩავამატოთ კიდევ ერთი სკრიპტი:

```
    "scripts": {
        // ... other scripts

        "format-all": [
            "./vendor/bin/php-cs-fixer fix ./ --using-cache=no"
        ]
    },
```

&#x20;ხოლო ამ სკრიპტის დამატების შემდგომ გავუშვათ ბრძანება

```
composer format-all
```

{% hint style="info" %}
ასევე შეგიძლიათ სკრიპტის დამატების გარეშე გავუშვათ პირდაპირ\
./vendor/bin/php-cs-fixer fix ./ --using-cache=no \
სკრიპტად დამატებას ის უპირატესობა აქვს რომ უფრო მარტივი, კომფორტულიადა მარტივად დასამახსოვრებელია.<br>
{% endhint %}

> თუ თქვენ PHPStorm-ზე აპირებთ გამართვას გადადით მომდევნო თავზე

## CS Fixer-ი VSCode-ში <a href="#id-4890" id="id-4890"></a>

გადავინაცვლოთ VSCode-ში.

პირველ რიგში დაგვჭირდება, რომ CS Fixer-ისთვის შესაბამისი ექსთენშენი დავაყენოთ VSCode-ში:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2F9YGXxlPNSgk3g6TdQxRp%2Fimage.png?alt=media&#x26;token=e363a102-9870-4177-b0d7-690bad366c2c" alt=""><figcaption></figcaption></figure>

> ყურადღება მიაქციეთ, რომ ეს ექსთენშენი junstyle-ის ავტორობით იყოს

შემდგომ ჩვენს პროექტში უნდა შევქმნათ .vscode-ის ფოლდერი, შიგნით კი *settings.json* ფაილი სადაც კონფიგურაციებს გავწერთ:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2Fsjv5odvSZ1zMKJjwN3rB%2Fimage.png?alt=media&#x26;token=ee621afa-ed8f-42ac-90e6-0591e850f193" alt=""><figcaption></figcaption></figure>

VSCode-ს კონფიგურაციაში უნდა ვუთხრათ სამი რაღაც:\
\* ყოველ დასეივებაზე გაუშვას php-ის formatter-ი\
\* ვუთხრათ php-cs-fixer -ის მისამართი(/vendor/bin/php-cs-fixer)\
\* ვუთხრათ საიდან წაიკითხოს php-cs-fixer-ის კონფიგურაციის ფაილი

შესაბამისად JSON-ის კონფიგურაცია შემდეგ სახეს მიიღებს:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FNJMNzh5yzhocpKEBec8E%2Fimage.png?alt=media&#x26;token=d13fec60-0ac9-42bf-89eb-f3cc3a7a6083" alt=""><figcaption></figcaption></figure>

```json
{
    "[php]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "junstyle.php-cs-fixer"
    },
    "php-cs-fixer.executablePath": "${workspaceFolder}/vendor/bin/php-cs-fixer",
    "php-cs-fixer.config": ".php-cs-fixer.php"
}
```

ერთადერთი რაც დაგვრჩა არის ის, რომ შევქმნათ root ფოლდერში .php-cs-fixer.php ფაილი და შიგნით ჩავწეროთ ჩვენი კონფიგურაცია:\
[PHP CS Fixer Config File](https://github.com/RedberryProducts/configs/blob/php-cs-fixer/.php-cs-fixer.php)

## CS Fixer-ი PHPStorm-ში <a href="#aa33" id="aa33"></a>

გახსენით თქვენთვის სასურველი პროექტი PHPStorm-ში.

და შევიდეთ PHPStorm-ის პარამეტრებში:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2F3wvKfNLbpF0IuZ1sD1MO%2Fimage.png?alt=media&#x26;token=5755ad19-459f-4adc-bc3b-8cc97d86a506" alt=""><figcaption></figcaption></figure>

შემდგომ ვნახოთ PHP-ის Quality Tools და მანდ ვიპოვით PHP CS Fixer-ის სექციას:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FXp2P1mrQIWgRmUlBHg5u%2Fimage.png?alt=media&#x26;token=2f2bd0ec-1f65-44c8-b10b-528089242159" alt=""><figcaption></figcaption></figure>

დავაჭიროთ სამწერტილიან ღილაკს და მანდ უნდა მივუთითოთ ჩვენი CS Fixer-ის Binary File-ის მისამართი, რომელიც vendor/bin ფოლდერშია განთავსებული:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FTtDbjO8uiS3ZA88mtdSN%2Fimage.png?alt=media&#x26;token=e9c5ace5-89af-4754-b316-762ddc9924bc" alt=""><figcaption></figcaption></figure>

დავაჭიროთ ღილაკს validate და დავრწმუნდეთ, რომ ყველაფერი კარგად მუშაობს.

შემდეგ გადავიდეთ CS Fixer Inspection-ში და გავუწეროთ რამოდენიმე პარამეტრი:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2F4sRGOGrgZ0tru2S6kGyi%2Fimage.png?alt=media&#x26;token=11778fd7-635c-4577-8558-1660ae511304" alt=""><figcaption></figcaption></figure>

Inspection-ში უნდა მოვნიშნოთ PHP CS Fixer Validation, Severity(სიმკაცრე) უნდა დავაყენოთ error-ზე და Ruleset-ში ავირჩიოთ custom, რაც იმას ნიშნავს, რომ გვინდა PHP CS Fixer-ს ჩვენი შექმნილი წესების ფაილი მივცეთ A.K.A. ის ფაილი, რომელიც ეტყვის CS Fixer-ს როგორ გვინდა, რომ ჩვენი კოდი იყოს დაფორმატებული.

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2F2bQnPF5B7ZJfRHDrpgiC%2Fimage.png?alt=media&#x26;token=e617844f-89c0-4913-8bfb-e84981cc2ed5" alt=""><figcaption></figcaption></figure>

სანამ PHPStorm-ს ვეტყვით ზუსტად რომელი კონფიგურაციის ფაილით იხელმძღვანელოს, მანამდე ჩვენს Root ფოლდერში უნდა შევქმნათ .php-cs-fixer.php ფაილი და გადმოვაკოპიროთ ამ ფაილში შემდეგი კონფიგურაცია:\
[PHP CS Fixer Config File](https://github.com/RedberryProducts/configs/blob/php-cs-fixer/.php-cs-fixer.php)

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FrXqVy8YLR629JQpFHVyi%2Fimage.png?alt=media&#x26;token=3f5c3842-460d-4fe5-a5bd-87d500657763" alt=""><figcaption></figcaption></figure>

ახლა შევიდეთ ისევ Inspections-ში და მივუთითოთ PHPStorm-ს ჩვენს მიერ შექმნილი კონფიგურაციის ფაილი:

<figure><img src="https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FK2GjPGOCKMPuG25Fv1xD%2Fimage.png?alt=media&#x26;token=6e6fa7e5-6654-47f8-8630-c7dca27bc7ff" alt=""><figcaption></figcaption></figure>

ახლა შევინახოთ ჩვენი კონფიგურაცია და PHPStorm-მა უკვე უნდა აღიქვას ჩვენი კოდი და ის კონფიგურაცია, რითიც გვინდა, რომ ჩვენს კოდში ჩამოვაყალიბოთ დისციპლინა.

მაგრამ ეს საკმარისი არაა, იმისათვის რომ დეველოპმენტი სასიამოვნო იყოს. უკეთესი იქნება, რომ PHP CS Fixer-მა ჩვენი კოდი თავად გამოასწოროს ხოლმე.

ამისათვის საჭიროა File Watcher-ის დამატება.

შევიდეთ ისევ PHPStorm-ის პარამეტრებში და ვიპოვოთ File Watchers განყოფილება:

![](https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FXr7UzqR54dLyQVqucM8f%2Fimage.png?alt=media\&token=b3c74414-aaf1-4e18-ada6-c749d355d489)

ავირჩიოთ Template-ში Custom და გავწეროთ ახალი ვოჩერის კონფიგურაცია.

**Name**: PHP CS Fixer\
**File Type**: PHP\
**Program**: \[Your Project Path]/vendor/bin/php-cs-fixer\
**Arguments**: fix --config=$ProjectFileDir$/.php-cs-fixer.php --cache-file=$ProjectFileDir$/.php-cs-fixer.cache $FileDir$/$FileName$

ასევე Advanced Options-ში ზედა ორი ჩექბოქსი გამოვრთოთ

![](https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FMWY9WsHKetR3OwcKdGaL%2Fimage.png?alt=media\&token=4fae192f-e418-42e9-8fac-ee132cf9278c)

OK-ს დავაჭიროთ და ჩვენი ვოჩერი დაემატება.

ახლა კი, ნებისმიერ PHP ფაილში Ctrl + S ის აკრეფისას ჩვენი ფაილი დაფორმატდება PHP CS Fixer-ის მეშვეობით.

პირველად დასევებისას Alert-ს ამოგვიგდებს, რომ დავაეფრუვოთ ვოჩერის გაშვება:

![](https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FizQ0iSZqkH8lC0ZqiuyL%2Fimage.png?alt=media\&token=64334d24-8972-418a-a3c2-2cf8566471d1)

დააჭირეთ Trust project and run-ს და ყველაფერი მოგვარდება.

მორჩაა 😉<br>

![](https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2Fdf8PdM5g0gC1SIgvcnEk%2F1.gif?alt=media\&token=75a01ea2-bc2b-4c74-afd5-796e709c2dcf)
