Недавно я открыл для себя Rector и был совершенно потрясен его мощью и эффективностью. Обещания просты: вы устанавливаете и запускаете пакет, и получаете мгновенные автоматические обновления и рефакторинг.
Черт, это смело, подумал я, когда запускал его в одном из своих проектов. Еще читая инструкции на первой странице getrector.org, я решил погрузиться в проект и за ночь провести рефакторинг всего проекта, насколько это возможно.
Я запускаю проект Laravel 8 в среде PHP 7.4, и я начал с простой конфигурации, которая позволяет улучшить качество кода:
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/app'
]);
$rectorConfig->importNames();
$rectorConfig->sets([
LevelSetList::UP_TO_PHP_74,
SetList::CODE_QUALITY,
]);
};
Не волнуйтесь, если вы не понимаете код выше, я тоже не понимал его полчаса назад 😂.
Запустив vendor/bin/rector --dry-run
, я сразу увидел эти маленькие улучшения, которые я все равно никогда не собирался делать сам.
Автоматический импорт имен классов
/**
- *
- * @return IlluminateBroadcastingChannel|array
- */
+ *
+ * @return Channel|array
+ */
public function broadcastOn()
Это изменение происходит из конфигурации $rectorConfig->importNames();
, и оно спасает жизнь. Большинство стандартов кодирования предпочитают короткие имена классов, поэтому автоматический импорт классов во всем проекте — это большая победа.
Замена строкового имени класса на константу класса
public function user() {
- return $this->belongsTo('AppUser');
+ return $this->belongsTo(User::class);
}
Это фантастика для старых проектов Laravel, поскольку большинство из них до сих пор используют строковую версию. Это отличное обновление, поскольку IDE гораздо лучше поддерживают версию User::class
.
Функции стрелок из PHP 7.4
$schedule->command('dummy-command')
->daily()
- ->when(function () {
- return CarbonCarbon::now()->endOfWeek()->isToday();
- });
+ ->when(fn() => Carbon::now()->endOfWeek()->isToday());
Я даже не знал, что стрелочные функции появились в PHP 7.4, и я мог бы использовать их без обновления языка. Теперь я могу использовать их мощь с помощью одной команды rector.
Встраивание бесполезных переменных
- $phone = str_replace(' ', '', $phone);
- return $phone;
+ return str_replace(' ', '', $phone);
Это еще один низко висящий плод. Переменная $phone
здесь ничего не добавляет к качеству кода, поэтому ее можно смело удалить.
Объедините оператор присваивания
- $this->order_count = $this->order_count + 1;
+ $this->order_count += 1;
Это тоже очень просто. На мой взгляд, короткая версия всегда лучше.
Упростите операторы возврата if
.
- if ($user->company_id == $this->id) {
- return true;
- }
-
- return false;
+ return $user->company_id == $this->id;
Я думаю, что вы почти всегда хотите сделать это, это красивая однострочная фраза, которая проста для глаз и помогает быстрее понять логику.
Однако, если это испортит форматирование в одном из ваших файлов, где существующий способ имеет больше смысла, вы можете проигнорировать это правило, добавив комментарий, подобный этому:
/** @noRector RectorCodeQualityRectorIf_SimplifyIfReturnBoolRector */
.
Выброс ошибки при операциях с JSON
public function setImageUrlsAttribute($value)
{
- $this->attributes['image_urls'] = json_encode($value);
+ $this->attributes['image_urls'] = json_encode($value, JSON_THROW_ON_ERROR);
}
Этот дополнительный параметр позволяет сделать так, чтобы при неправильном кодировании или декодировании JSON не возвращался null
, а выбрасывалось исключение. Мне нравится этот вариант, но я пока не совсем уверен, что готов к такой оптимизации в своем коде. Так как это приводит к исключению, я немного утомлен и сохраню это на потом.
Мы можем игнорировать некоторые правила, используя эту конфигурацию.
Преобразовывать компактные
использования в массивы
$user= auth()->user();
$credits= $user->credits()->latest()->get();
- return view('user.credits', compact('user', 'credits'));
+ return view('user.credits', ['user' => $user, 'credits' => $credits]);
Сегодня я узнал, что существует мнение об использовании функции compact()
, которое гласит, что она не идеальна и, возможно, является антипаттерном. Не уверен, как я к этому отношусь, но я продолжаю этот рефакторинг и плыву по течению. Нет ничего плохого в старых добрых массивах, верно?
И много других мелких обновлений на самом деле. Не стоит забывать, что это происходит только из правил CODE_QUALITY
, которые я импортировал одной строкой выше. Есть еще 30+ категорий, которые мне не терпится использовать и посмотреть, что они предлагают.
На данный момент я просто запускаю vendor/bin/rector
, все тесты все еще проходят, коммит, push и развертывание. Теперь в продакшене все хорошо 😁.