PHPLint, CodeSniffer, Psalm

Проверка корректности кода с PHPLint. Валидация и корректировка стиля кода с CodeSniffer. Подключение статических анализаторов.

  • 00:00:37 Проверка ошибок в PHP-файлах
  • 00:02:32 PHP в режиме линтера
  • 00:03:15 Массовая проверка файлов
  • 00:04:25 Ускорение проверки
  • 00:04:54 Использование PHPLint
  • 00:08:40 Унификация Code Style
  • 00:11:20 Подключение PHP-CodeSniffer
  • 00:15:20 Синтаксические анализаторы кода
  • 00:17:00 Обзор PHPStan, Psalm, Phan
  • 00:17:59 Установка Psalm
  • 00:21:04 Разбор ошибок
  • 00:24:47 Добавление типов
  • 00:27:32 Какой анализатор выбрать
  • 00:29:30 Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (46)
Arunas
2020-01-07 19:36

Спасибо :)

Ответить
Arunas
2020-01-07 19:51

команда make init не заработала, ошибка: Generating autoload files ocramius/package-versions: Generating version class... ocramius/package-versions: ...done generating version class docker run --rm -v /api:/app -w /app alpine chmod 777 var chmod: var: No such file or directory Makefile:26: recipe for target 'api-permissions' failed make: *** [api-permissions] Error 1

Ответить
Arunas
2020-01-08 17:31

На Линукс Ubuntu 18.04 всё ок, видимо, какие то не поладки в видовс, с вагрантом...

Ответить
Ruslan
2020-01-23 14:35

Еще однин мученик на винде :) Скажите как вы организовали свою работу, особенно где у вас установлен PhpStorm? как прокинули портя в Винду?

Ответить
Arunas
2020-01-23 16:14

Никаких мучений не испытываю. C Виндовс 10 про (там PhpStorm): Vagrant UP...-> VM (Ubuntu 16 голый - там инсталируем docker-compose и др.) -> вид 192.168.56.101:8081, 192.168.56.101:8080. В PhpStorme VM достигаем через ssh (C:\Users\arsku\projects\lPggCH\puphpet\files\dot\ssh\id_rsa)... и т.д.

Ответить
Ruslan
2020-01-23 16:41

я так понимаю докер вы не используете, поэтому и мучений нет :)

Ответить
Arunas
2020-01-23 17:57

Docker у меня не в Винде, а в VM (которую запускаю с Vagrant), Vagrant позволяет работать с тем-же каталогами и от Виндовса (там PhpStorm и вид в Crome через 192.168.56.101) и от Линукса (там же Docker и др). Дайте емайл - скину скрин-шот (извините за ошибки...)

Ответить
Ruslan
2020-01-23 18:44

Vagrant and VirtualBox моя рабочая среда :) , в смысле для работы. tvjelgava@gmail.com И Vgrantfile скиньте, хочу посмотреть какие порты пробрасываете.

Сильно тормозит такой набор?

Ответить
Arunas
2020-01-23 19:13

Пока не тормозит. с Vagrantfile не заморачиваюсь. Скинул.

Ответить
Arunas
2020-01-23 16:34

Интересно, как Вы без Виндовс задействуете работу с кассовими апаратами и др. бизнес приборими (им надо ActiveX), ведь в магазинах, офисах стоит ВИНДОВС :)

Ответить
Ruslan
2020-01-23 16:47

Я вас цельком поддерживаю MS Word никто не отменял. Просто я давно присматриваеюсь к Докеру и не видел в нем особой пользы, но сейчас всё проясняется и мне бы хотелось его использовать. Думал вы тоже с этим бьётесь и можно было обменятся опытом.

Ответить
Arunas
2020-01-07 19:54

после make up, команды: make lint и make analyze прошли успешно.

Ответить
Александр
2020-01-08 18:22

У меня у одного видео при просмотре подвисает?

Ответить
Юлия Елисеева
2020-01-09 07:30

У меня всё нормально воспроизводится. Может, у вас скорость интернет-соединения низкая?

Ответить
Александр
2020-01-09 07:44

Сейчас все хорошо даже на 2х скорости. Но вчера вечером даже на нормальной скорости были подвисания.

Ответить
Александр
2020-01-14 13:34

Что вы думаете по поводу анализатора phan ? от творца php, пишут что он единственный настоящий статический анализатор - так как строит синтаксическое дерево при анализе. Но он сложноват в настройке.

Ответить
Ruslan
2020-01-23 18:52

У меня под Виндой линтер ругается : End of line character is invalid; expected "\n" but found "\r\n"

Если делать деплой git-ом, то это заменятся автоматически, должен ли я это сообщение добавить в игнор, или всё таки нужно фиксить?

Ответить
Дмитрий Елисеев
2020-01-24 08:42

Настройте в редакторе использование "\n" для файлов.

Ответить
Sergei
2020-02-12 16:54

Дмитрий, позвольте получить от вас комментарий, что за phpspec, что за зверь такой, почему мы его не используем и чем он отличается от mockery? Спасибо.

Ответить
Дмитрий Елисеев
2020-02-14 07:18

Mockery - это независимая библиотека для создания моков и стабов вместо createMock и createStab.

PHPSpec как Behavior Driven тестовый фреймворк позволяет записывать юнит-тесты через описание поведения кода более человекочитаемым языком.

BDD подход мы будем использовать для написания приёмочных тестов.

Ответить
Андрей
2020-08-24 09:15

Дмитрий, у меня после добавления "squizlabs/php_codesniffer" или "overtrue/phplint" в composer.json и запуска make api-composer-install не происходит установки этих библиотек через Composer.

Composer выводит сообщение:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.
Nothing to install or update.

При запуске composer install и при наличии файла composer.lock не проверяются изменения в файле composer.json. Приходится запускать вручную composer update.

Что вы можете посоветовать в данном случае?

Ответить
Дмитрий Елисеев
2020-08-24 17:21

Да, в lock-файле сохраняется хэш зависимостей из файла composer.json. И при ручном изменении это ломается. Так что добавляйте зависимости в файл не вручную, а через require:

composer require --dev overtrue/phplint

Иначе если правите вручную, то придётся запускать composer update, чтобы хэш персчитался. Но это обновит все пакеты.

Ответить
Yaroslav
2021-08-04 14:50

Добрый день, Дмитрий! Спасибо за отличное руководство!

Недавно стал использовать Убунту для разработки и постоянно сталкиваюсь с ошибками которых не было на Виндовс. Самые частые из них - ошибки доступа к файлам. Приходится переназначать владельца, группу, права. И в связи с этим вопрос:

api-permissions:

docker run --rm -v ${PWD}/api:/app -w /app alpine chmod 777 var

Многие пишут, что выдавать 777 не очень хорошо.

Для api использовал Laravel, там есть директория storage. Для неё пришлось продублировать chmod 777 с флагом -R. Иначе не работало.

Это нормально или есть другие варианты?

Ответить
Дмитрий Елисеев
2021-08-16 17:32

Для локальной разработки ставить 777 нормально, так как php-fpm и php-cli работают от разных пользователей и иначе не смогут записывать в общую примонтированную через volumes папку c var.

А в продакшеновских Dockerfile уже можно ставить конкретные chown и chmod для пользователя www-data в php-fpm и при желании для app в php-cli, если там создаём пользователя вроде app как в будущем 59-ом эпизоде.

Ответить
slo_nik
2021-08-16 18:31

Добрый вечер, Дмитрий.

Запустил проверку проекта psalm-ом.

Возникла проблема, не пойму как решить.

Проект на Symfony, по Вашему примеру https://github.com/ElisDN/demo-project-manager

Psalm выдаёт ошибки для src/Security/UserProvider и src/Security/UserChecker

> ERROR: ParamNameMismatch - src/Security/UserProvider.php:54:47 - Argument 1 of App\Security\UserProvider::refreshUser has wrong name $identity, expecting $user as defined by Symfony\Component\Security\Core\User\UserProviderInterface::refreshUser (see https://psalm.dev/230)
public function refreshUser(UserInterface $identity): UserInterface

> ERROR: ParamNameMismatch - src/Security/UserChecker.php:34:49 - Argument 1 of App\Security\UserChecker::checkPostAuth has wrong name $identity, expecting $user as defined by Symfony\Component\Security\Core\User\UserCheckerInterface::checkPostAuth (see https://psalm.dev/230)
public function checkPostAuth(UserInterface $identity): void

Посмотрел в документации, там есть такая рекомендация.

https://psalm.dev/docs/running_psalm/issues/ParamNameMismatch/#config-allownamedargumentcallsfalse

В конфигурации psalm пробовал добавлять данные параметры - не помогло.

Как победить эти ошибки

Ответить
Дмитрий Елисеев
2021-08-16 19:05

Прочитать текст ошибки:

Argument 1 of UserProvider::refreshUser has wrong name $identity, expecting $user as defined by UserProviderInterface::refreshUser

и переименовать параметр так, как он назван в методе интерфейса.

Ответить
slo_nik
2021-08-16 19:07

Это понятно, как самый простой вариант.

Но можно ли как-то решить по-другому?

Ответить
Дмитрий Елисеев
2021-08-16 19:08

Просто переименовать $identity в $user, чтобы стало правильно.

Зачем делать по-другому?

Ответить
slo_nik
2021-08-16 19:11

В данном случае интересно, почему рекомендации из документации не сработали?

В чём может быть причина?

Вы же не зря в примере переименовывали параметр? Как я понимаю для удобства чтения кода и понимания, что именно находится в переменной.

Ответить
Дмитрий Елисеев
2021-08-16 19:23

В данном случае интересно, почему рекомендации из документации не сработали?

Может из-за приписки о классе A.

Вы же не зря в примере переименовывали параметр?

Назвал для однообразия, чтобы всё у меня называлось identity.

А сейчас скорее назову $user по имени UserInterface, чтобы было технически корректно.

Ответить
slo_nik
2021-08-16 19:29

Значит при использовании Psalm лучше избегать именования ради однообразия?

Ответить
Дмитрий Елисеев
2021-08-17 07:28

Значит, что при наследовании классов и реализации интерфейсов надо всегда придерживаться оригинальных сигнатур методов, чтобы не было неожиданностей в будущем. А Psalm лишь помогает сразу находить такие несовпадения.

Ответить
slo_nik
2021-08-17 14:06

Я уже это понял.

Но, поставил "чистый" Symfony ради эксперимента. Запустил Psalm - те же ошибки)))

В проекте поставил уровень ошибок psalm 4.

Для fetcher-ов получаю такую ошибку.

Too many arguments for method Doctrine\DBAL\Query\QueryBuilder::select

В самих fetcher-ах в select() передаю несколько аргументов, на это и ругается.

Если передать эти аргументы массивом, то psalm доволен.

Но в самом QueryBuilder для select() в комментарии предупреждение

USING AN ARRAY ARGUMENT IS DEPRECATED. Pass each value as an individual argument.

Поискал в документации к psalm как можно решить данную проблему, но пока не нашёл.

Как можно отключить реагирование psalm на такие "ошибки"?

Ответить
Дмитрий Елисеев
2021-08-17 16:14

Можно подавить эту ошибку TooManyArguments конкретно для этого метода select.

Ответить
slo_nik
2021-08-17 16:57

Благодарю.

В общем конфигурационном файле я подавил ошибку, но подумал, что если где-то я передам действительно большее число аргументов, то это будет плохо, поэтому интересовался как точечно подавить ошибку. Буду разбираться с этим.

Ещё вот такая ошибка возникает, никак не пойму, что именно psalm не нравится.

MissingDocblockType - src/DataFixtures/Location/City/CityFixtures.php:29:9 - Misplaced variable

Ошибка возникает в файлах fixtures.

Вот пример

public function load(ObjectManager $manager)
{
    /**
     * @var $firstCompany Company
     * @var $secondCompany Company
     */
    $firstCompany = $this->getReference(CompanyFixtures::FIRST_COMPANY);
    $secondCompany = $this->getReference(CompanyFixtures::SECOND_COMPANY);

    /*.....*/
}

В этом случае тоже можно подавить ошибку, или можно как-то дать понять psalm, что именно в docblock описано?

Ответить
Дмитрий Елисеев
2021-08-17 18:02

поэтому интересовался как точечно подавить ошибку

Там как раз указано, как подавить только для одного метода через referencedMethod.

Ошибка возникает в файлах fixtures.

Ставьте тип перед переменной, а не после:

/**
 * @var Company $firstCompany
 * @var Company $secondCompany
 */
Ответить
slo_nik
2021-08-17 18:04

Да, я уже понял и поменял местами тип.

Там как раз указано, как подавить только для одного метода через referencedProperty

Как раз так и сделал.

Благодарю ещё раз.

Ответить
Михаил
2021-10-23 17:19

Создается такое ощущение, что, например, тот же psalm обнаружит все баги, которые проверяет линтер. Есть пример, когда псалм ошибку не обнаружит, а линтер ругнется?

Ответить
Дмитрий Елисеев
2021-10-24 08:16

Да, Psalm тоже ругнётся, если в файле будет ошибка синтаксиса.

Просто удобно то, что быстрый PHPLint находит ошибки за несколько секунд. А Psalm приходится ждать целые минуты. Но если это не критично, то отдельный линтер можно не устанавливать.

Ответить
gfdgdf
2022-03-30 16:56

Чем больше я узнаю, тем больше понимаю, что я ничего не знаю. Большое спасибо за уроки.

Ответить
Илья
2022-05-01 07:09

Как починить при втором композере?

Problem 1

- ocramius/package-versions is locked to version 1.5.1 and an update of this package was not requested.
- ocramius/package-versions 1.5.1 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.3.0] but it does not match the constraint.

Problem 2

- ocramius/package-versions 1.5.1 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.3.0] but it does not match the constraint.
- vimeo/psalm 3.8.0 requires ocramius/package-versions ^1.2 -> satisfiable by ocramius/package-versions[1.5.1].
- vimeo/psalm is locked to version 3.8.0 and an update of this package was not requested.
Ответить
Илья
2022-05-01 07:12

Сделал вот так:

"require-dev": {

    ...
    "ocramius/package-versions": "^1.2",
    "vimeo/psalm": "^3.8"
},
Ответить
Илья
2022-05-01 07:35

"vimeo/psalm": "^4.22"

и composer install помогли в итоге

Ответить
ОлАн
2024-09-18 14:25

Всем - доброго времени! Дмитрий и Юля - персонально! )
Не получается разобраться с ошибкой

Nothing to install or update
Generating autoload files
docker run --rm -v /api:/app -w /app alpine chmod 777 var
chmod: var: No such file or directory
make: *** [Makefile:26: api-permissions] Ошибка 1

В Makefile за комментировала api-permissions прошла вперед (на 10-12 роликов) в надежде что как-то ошибка сама-собой ) "отпадет" - нет, не получилось. Начала все сначала, хотела закрыть гештальт, еще раз дошла до этого момента, но увы, чуда не случилось, опять те же "грабли".

Что посоветуете?

Работаю в Ubuntu 20.04

Ответить
Дмитрий Елисеев
2024-11-23 09:51
chmod: var: No such file or directory

В проекте не нашлась папка var. Создайте её с файлом .gitignore.

Ответить
ОлАн
2024-12-25 23:52

Дмитрий! Доброго времени!

И файл и каталог конечно же есть.

Перешла на Ubuntu 24.04

Дежавю: "Такого файла или каталога нет"

  make init
  shell: /usr/bin/bash -e {0}
  env:
    REGISTRY_HOST: ghcr.io
    IMAGE_TAG: master-25
    REGISTRY_ADDRESS: ghcr.io/***/newregtema
    DOCKER_CONFIG: /home/runner/work/_temp/docker_login_1735167820690

docker-compose down -v --remove-orphans

make: docker-compose: No such file or directory
make: *** [Makefile:17: docker-down-clear] Error 127
Error: Process completed with exit code 2.

Локально с make init - все хорошо, сайт запускается , а работать с Github Action - не получается.

Уж не знаю что и думать, может быть дело в "железе" - ноут новый, был под windows, второй системой поставила Ubuntu (была проба и 22.04 и 24.04)

Уже хочется: рвать и метать

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Yandex
MailRu
GitHub
Google