Как вы, возможно, знаете, во фреймворке 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
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.