__invoke()
метод позволяет превратить объект в функцию, которую мы можем передавать/получать/резовлить через псевдо-тип callable.public function add(callable $pipe) {
//..
}
...
$pipeline = (new Pipeline)
->add(fn() => true)
->add(fn(bool $enabled) =>'Maks enabled')
->add(new MaksHandler()) // тут класс с методом __invoke и работает как анонимка
;
SomeClass::someStaticMethodInsteadInvoke()
SomeClass::someStaticMethodInsteadInvoke()
я просто пытаюсь понять, могу ли я где-то применить Invoke в своих проектах, и главное: нужно ли мне это?))
Но я все равно не понял :)
А почему мы просто не можем вызвать
SomeClass::someStaticMethodInsteadInvoke()
в чем именно преимущество Invoke перед обычными методами?
// я просто пытаюсь понять, могу ли я где-то применить Invoke в своих проектах, и главное: нужно ли мне это?))
Если вы используете ООП, то invoke вам не нужен, оперируйте объектами, а не функциями, и не мутантами вида "объект как функция".
class Validator {
public function validate($data)
}
$validator->validate($obj)
class Validator {
public function __invoke($data)
}
$validator($obj)
$maksHandle($newHandle($innerHandle()))
— потрясная гибкость /**
* Retrieve the authenticated user for the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function __invoke(Request $request)
{
if ($user = $this->auth->guard(config('sanctum.guard', 'web'))->user()) {
return $this->supportsTokens($user)
? $user->withAccessToken(new TransientToken)
: $user;
}
if ($token = $request->bearerToken()) {
$model = Sanctum::$personalAccessTokenModel;
$accessToken = $model::findToken($token);
if (! $accessToken ||
($this->expiration &&
$accessToken->created_at->lte(now()->subMinutes($this->expiration)))) {
return;
}
return $this->supportsTokens($accessToken->tokenable) ? $accessToken->tokenable->withAccessToken(
tap($accessToken->forceFill(['last_used_at' => now()]))->save()
) : null;
}
}
return $accessToken->tokenable->withAccessToken(
tap($accessToken->forceFill(['last_used_at' => now()]))->save()
)
а вот так лаконично
class Validator {
public function __invoke($data)
}
$validator($obj)
function validate($data)
validate($obj)
вы ошибаетесь, если представить процесс объектом, то как раз его функциональное представление — наиболее лаконичное и целостное представление
от ООП стиля к процедурному
class MyInvoke
{
protected $state = 1;
public function __invoke($arg)
{
$this->state++;
return $arg + $this->state;
}
}
Route::get('/', function () {
$arr = [1, 2, 3, 4, 5];
return var_dump(array_map(new MyInvoke(), $arr));
});
в любом случае в invoke и ответственность закрывается одна
в случае паттернов появляется гибкость, да одни плюсы, минусов просто нет... не понимаю вас
function method(ActionInterface $action) {
return $action->methodLikeInvoke();
}
Interface ActionInterface
{
public function methodLikeInvoke() : bool
}
Class Action implements ActionInterface
{
public function methodLikeInvoke() { ... }
}
зачем функциональное маскировать под ООП, сделали бы обычными функциями, было бы очевиднее.
Правильно, что не поняли, т.к. вам никто и не ответил.
Совершенно верно, можно просто указать метод, там где тип callable, и разницы нет никакой.
А можно как, выше написал Лентюй, просто вызвать метод класса, а его необходимость описать в интерфейсе без всяких callable вовсе.
Если вы используете ООП, то invoke вам не нужен, оперируйте объектами, а не функциями, и не мутантами вида "объект как функция".