Как вы, возможно, знаете, во фреймворке Laravel есть удобный метод tap, который позволяет вам вызывать замыкание с заданным значением и затем возвращать значение. Звучит непонятно? Наверное потому, что вы пока не видели это! Давайте взглянем на пример:
// without tap:
function getServer($id) {
$server = ServerModel::findOrFail($id);
Log::debug('Server was found', $server->toArray());
return $server;
}
// with tap:
function getServer($id) {
return tap(ServerModel::findOrFail($id), function ($server) {
Log::debug('Server was found', $server->toArray());
});
}
Недавно мы использовали трейт Tappable в одном из наших проектов, чтобы избежать глобального хелпер-метода tap. Это позволило нам вызывать tap прямо в экземпляре. Вышеприведенный пример можно переписать так:
function getServer($id) {
return ServerModel::findOrFail($id)->tap(function ($server) {
Log::debug('Server was found', $server->toArray());
});
}
Может показаться, что разница незначительна, но мы думаем, что стало более читабельно и станет еще лучше при увеличении логики, например, когда вы используете скоупы Eloquent.
// ДО
tap(ServerModel::active()->paid()->withTrashed()->findOrFail($id), function ($server) {
Log::debug('Server was found', $server->toArray());
});
// ПОСЛЕ
ServerModel::active()
->paid()
->withTrashed()
->findOrFail($id)
->tap(function ($server) {
Log::debug('Server was found', $server->toArray());
});
Мы делали Pull Request на этот трейт в репозиторий illuminate/support. Отличная новость — он был принят и теперь доступен в Laravel 5.8.17!
Автор: Proton.media
Перевод: Demiurge Ash