invoke single class

Есть вот такой контроллер:

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @return Response
     */
    public function __invoke(Request $request): Response
    {
        return response(auth()->user());
    }
}

И это буквально все, что в нем есть. Объясните, зачем так сделано, чем это лучше отдельной функции с вызовом того же юзера? Для чего invoke вообще нужен вообще? Как он используется?


Ответы (1 шт):

Автор решения: Romka

__invoke используется для вызова класса как функции. Это нужно для упрощения вызова, когда в классе всего лишь один метод который можно вызывать.

...чем это лучше отдельной функции с вызовом того же юзера?

Это ничем не лучше, это всего лишь позволяет в роутере не указывать конкретный метод

Route::get('user', 'AuthController');

__invoke используется для классов в которых есть только один публичный метод, чтобы упростить обращение к нему.

Так же классы, которые реализуют __invoke могут быть использованы как callback.

Например:

class Formatter {
    public function __invoke(int $param)
    {
        return (string)$param;
    }
}

array_map(new Formatter, [1, 2, 3]);

В случае обычного класса, пришлось бы указывать метод так:

array_map([new Formatter(), 'format'], [1, 2, 3]);
→ Ссылка