Новый трейт Tappable в Laravel

Трейт Tappable в Laravel

Как вы, возможно, знаете, во фреймворке 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