Es wird immer eine invokable Methode erwartet - laravel?
Moin, wie schafft man es, dass nicht immer eine invokalbe Methode verlangt wird, obwohl ich diese nicht nutzen will?
UnexpectedValueException
Invalid route action: [App\Http\Controllers\LoginController].
at vendor\laravel\framework\src\Illuminate\Routing\RouteAction.php:92
88▕ */
89▕ protected static function makeInvokable($action)
90▕ {
91▕ if (! method_exists($action, '__invoke')) {
➜ 92▕ throw new UnexpectedValueException("Invalid route action: [{$action}].");
93▕ }
94▕
95▕ return $action.'@__invoke';
96▕ }
i `App\Http\Controllers\LoginController` is not invokable: The controller class `App\Http\Controllers\LoginController` is not invokable. Did you forget to add the `__invoke` method or is the controller's method missing in your routes file?
1 vendor\laravel\framework\src\Illuminate\Routing\RouteAction.php:47
Illuminate\Routing\RouteAction::makeInvokable("App\Http\Controllers\LoginController")
2 vendor\laravel\framework\src\Illuminate\Routing\Route.php:191
Illuminate\Routing\RouteAction::parse("login", ["App\Http\Controllers\LoginController", "App\Http\Controllers\LoginController"])
Hier ist mein heruntergebrochener Code:
Web.php
use App\Http\Controllers\HomeController;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\RegisterController;
use Illuminate\Support\Facades\Route;
Route::get('/', HomeController::class, 'home')->name('home');
Route::get('/login', LoginController::class, 'login')->name('login');
Route::get('/register', RegisterController::class, 'register')->name('register');
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
public function login(){
return view('home');
}
}
Die andern sehen identisch aus
2 Antworten
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
Die __invoke-Methode wird immer dann aufgerufen, sobald versucht wird, ein Objekt so aufzurufen, als sei es eine Funktion.
Beispiel:
class Example {
}
$example = new Example;
$example(123); // invoke
Beim Routing gibst du nun explizit die LoginController-Klasse als Controller Action (Callable) an, statt die login-Funktion. Berücksichtige hierbei, dass die Route::get-Methode nur zwei Argumente erwartet. Dein drittes Argument dürfte nicht berücksichtigt werden.
Übergib als zweites Argument entweder ein Array:
Route::get('/login', [LoginController::class, 'login'])->name('login');
oder verwende die @-Syntax:
Route::get('/login', 'LoginController@login')->name('login');
Single-Action-Controller (mit __invoke) zu nutzen, ist im Übrigen auch nicht verkehrt, da deine Controller dadurch leichtgewichtig bleiben und klar funktional aufgeteilt sind.
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
Der Fehler könnte durch vieles ausgelöst worden sein.
Versuche:
Binde in deinen LoginController folgendes ein:
use Illuminate\View\View;
Und, schreibe folgende function um :
public function login():View{
return view('home');
}
![](https://images.gutefrage.net/media/default/user/15_nmmslarge.png?v=1551279448000)