Метод tap
Метод tap принимает два параметра: значение и замыкание.
Замыкание получает переданное значение и может выполнять с ним любые
действия, но результат работы замыкания игнорируется. Метод всегда
возвращает исходное значение. Это позволяет вставлять побочные
эффекты, такие как логирование, отладка или изменение объектов по
ссылке, в середину цепочек методов без разрыва цепочки.
Синтаксис
<?php
tap($value, function ($item) {
// побочное действие
});
?>
Пример
Используем метод tap для вывода промежуточного значения
в цепочке методов коллекции:
<?php
namespace AppHttpControllers;
use IlluminateSupportCollection;
class ExampleController extends Controller
{
public function index()
{
$res = collect([1, 2, 3, 4, 5])
->map(function ($item) {
return $item * 2;
})
->tap(function ($item) {
echo $item->count();
})
->filter(function ($item) {
return $item > 5;
});
echo $res;
}
}
?>
Результат выполнения кода:
"5[6, 8, 10]"
Сначала вывелось количество элементов коллекции (5), затем результат фильтрации.
Пример
Используем метод tap для логирования перед сохранением
модели в базу данных:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesLog;
class ArticleController extends Controller
{
public function store()
{
$article = new Article();
$article->title = 'article';
$article->text = 'text';
$res = tap($article, function ($item) {
Log::info('Создана статья: ' . $item->title);
})->save();
echo $res;
}
}
?>
Результат выполнения кода:
"true"
В лог записано сообщение, а метод вернул результат сохранения.
Пример
Используем метод tap для выполнения действий с объектом
до его возврата из метода:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateSupportFacadesHash;
class UserController extends Controller
{
public function createUser()
{
return tap(new User(), function ($item) {
$item->name = 'user';
$item->email = 'user@example.com';
$item->password = Hash::make('password');
$item->save();
});
}
public function index()
{
$res = $this->createUser();
echo $res->name;
}
}
?>
Результат выполнения кода:
"user"
Пример
Используем метод tap для отладки значений в цепочке
методов Eloquent:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = Article::where('id', '>', 1)
->tap(function ($query) {
DB::enableQueryLog();
})
->where('status', 'published')
->tap(function ($query) {
$logs = DB::getQueryLog();
echo count($logs);
})
->get();
echo $res;
}
}
?>
Результат выполнения кода:
"1[{"id":2,"title":"article 2","status":"published"},{"id":3,"title":"article 3","status":"published"}]"