Zielklassen-Controller existiert nicht - Laravel 8

79

Hier ist mein Controller:

<?php

namespace App\Http\Controllers\Api;

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

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        dd('aa');
    }
}

Wie im Screenshot zu sehen ist, existiert die Klasse und befindet sich am richtigen Ort:

Geben Sie hier die Bildbeschreibung ein

Meine api.phpRoute:

Route::get('register', 'Api\RegisterController@register');

Als ich meine registerRoute mit Postman traf, gab es den folgenden Fehler:

Die Zielklasse [Api \ RegisterController] existiert nicht.


Aktualisieren:

Dank der Antwort konnte ich das Problem beheben. Ich habe beschlossen, den vollständig qualifizierten Klassennamen für diese Route zu verwenden, aber es gibt andere Optionen, wie in der Antwort beschrieben.

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
Nguyễn Việt Dũng
quelle
Willkommen bei SO .. befindet sich Ihr Controller im ApiOrdner?
Kamlesh Paul
Sie müssen die Klassen neu generieren, da composer dump-autoloadoder in Ihrem RegisterControllerNamespace fehlt.
sta
@KamleshPaul ja
Nguyễn Việt Dũng
dann versuchen Sie escomposer dump-autoload
Kamlesh Paul
tippe ich es einfach in mein Terminal?
Nguyễn Việt Dũng

Antworten:

134

Sie verwenden Laravel 8. In einer Neuinstallation von Laravel 8 wird Ihren Routengruppen, in die Ihre Routen geladen werden, kein Namespace-Präfix zugewiesen.

"In früheren Versionen von Laravel RouteServiceProviderenthielt das eine $namespaceEigenschaft. Der Wert dieser Eigenschaft wurde automatisch den Controller-Routendefinitionen vorangestellt und ruft den actionHelfer / die URL::actionMethode auf. In Laravel 8.x ist diese Eigenschaft nullstandardmäßig. Dies bedeutet, dass kein automatisches Namespace-Präfix vorhanden ist wird von Laravel gemacht. " Laravel 8.x Docs - Versionshinweise

Sie müssten den vollständig qualifizierten Klassennamen für Ihre Controller verwenden, wenn Sie in Ihren Routen auf sie verweisen, wenn Sie das Namespace-Präfix nicht verwenden.

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');

Wenn Sie den alten Weg bevorzugen:

App\Providers\RouteServiceProvider::

public function boot()
{
    ...

    Route::prefix('api')
        ->middleware('api')
        ->namespace('App\Http\Controllers') // <---------
        ->group(base_path('routes/api.php'));

    ...
}

Tun Sie dies für alle Routengruppen, für die Sie einen deklarierten Namespace möchten.

Die $namespaceEigenschaft:

Obwohl in den Versionshinweisen eine $namespaceEigenschaft erwähnt wird, die auf Ihrer festgelegt RouteServiceProviderund in Ihrer kommentiert werden soll, RouteServiceProviderhat dies keine Auswirkungen auf Ihre Routen. Derzeit wird nur ein Namespace-Präfix zum Generieren von URLs zu Aktionen hinzugefügt. Sie können diese Variable also festlegen, aber sie selbst fügt diese Namespace-Präfixe nicht hinzu. Sie müssten dennoch sicherstellen, dass Sie diese Variable verwenden, wenn Sie den Namespace zu den Routengruppen hinzufügen.

Diese Informationen finden Sie jetzt im Upgrade-Handbuch

Laravel 8.x Docs - Upgrade-Handbuch - Routing

Mit dem, was das Upgrade - Handbuch ist das zeigt wichtigen Teil ist , dass Sie einen Namespace auf Ihren Routen Gruppen definieren. Das Festlegen der $namespaceVariablen selbst hilft nur beim Generieren von URLs zu Aktionen.

Auch hier, und ich kann das nicht genug betonen, besteht der wichtige Teil darin, den Namespace für die Routengruppen festzulegen, was sie zufällig tun, indem sie direkt auf die Mitgliedsvariable $namespaceim Beispiel verweisen .

Aktualisieren:

Wenn Sie seit Version 8.0.2 eine neue Kopie von Laravel 8 installiert haben laravel/laravel, können Sie die protected $namespaceMitgliedsvariable aus dem Kommentar entfernen RouteServiceProvider, um zum alten Weg zurückzukehren, da die Routengruppen so eingerichtet sind, dass diese Mitgliedsvariable für den Namespace für die Gruppen verwendet wird.

// protected $namespace = 'App\\Http\\Controllers';

Der einzige unkommentierte Grund, der den den Routen zugewiesenen Controllern das Namespace-Präfix hinzufügen würde, besteht darin, dass die Routengruppen so eingerichtet sind, dass diese Variable als Namespace verwendet wird:

...
->namespace($this->namespace)
...
Lagbox
quelle
Das hat mich wirklich verrückt gemacht. Der Kommentar über der Variablen $ namespace lautet: "Wenn angegeben, wird dieser Namespace automatisch auf Ihre Controller-Routen angewendet." Nun ist es NICHT. Sie müssen -> Namespace ('App \ Http \ Controllers') hinzufügen, wie Sie betont haben. Sie sollten den Kommentar im Quellcode wirklich ändern ...
schock_gone_wild
@shock_gone_wild, dass Kommentar und Eigenschaft vor ungefähr 25 Minuten vom Provider entfernt wurden, so dass in der nächsten Patch-Version laravel/laraveldavon weg sein wird
Lagbox
Warum wurde die Änderung geändert? Zur Leistungsverbesserung?
CodeGuru
die Videoversion dieser Antwort (5 Minuten) youtu.be/MfE1tnMG6fE
Wibisono Indrawan
1
@WesleySmith ab 8.0.2 laravel/laraveldavon ist für Sie da, um zu kommentieren und zu verwenden, wenn Sie möchten
lagbox
12
  • Ja, in Laravel 8 tritt dieser Fehler auf.
  • Nachdem ich viele Lösungen ausprobiert hatte, bekam ich diese perfekte Lösung
  • Folgen Sie einfach den Schritten ...

FALL 1

Wir können in api.phpund in web.phpDateien wie unten ändern .
Die aktuelle Art, wie wir schreiben, syntexist

Route::get('login', 'LoginController@login');

sollte geändert werden zu

Route::get('login', [LoginController::class, 'login']);

FALL - 2

  1. Gehen Sie zuerst zur Datei: app > Providers > RouteServiceProvider.php
  2. In dieser Datei ersetzen Sie die Zeile
    protected $namespace = null;durchprotected $namespace = 'App\Http\Controllers'; Geben Sie hier die Bildbeschreibung ein
  3. Dann Nach dem Hinzufügen der Linie ->namespace($this->namespace)wie im Bild gezeigt ..
    Geben Sie hier die Bildbeschreibung ein
Rohit Tagadiya
quelle
8

Entfernen Sie in Laravel-8 standardmäßig das Namespace-Präfix, damit Sie in Laravel-7 den alten Weg wie folgt festlegen können:

in RouteServiceProvider.phphinzufügen , um dieses variable

protected $namespace = 'App\Http\Controllers';

und Update - bootMethode

public function boot()
{
       $this->configureRateLimiting();

       $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
        });
}
Jignesh Joisar
quelle
3

laravel 8 hat RouteServiceProvider aktualisiert und wirkt sich auf die Route mit der String-Syntax aus. Sie können ihn wie oben ändern. Es wird jedoch empfohlen, die Aktionssyntax zu verwenden, ohne die Route mit der String-Syntax zu verwenden:

Route::get('register', 'Api\RegisterController@register');

Sollte geändert werden zu:

Route::get('register', [RegisterController::class, 'register']);
Mirshod Mirjonov
quelle
2

Wenn Sie Laravel 8 verwenden

Kopieren Sie einfach meinen Code und fügen Sie ihn ein

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
Tijani
quelle
2

In Laravel 8 fügen Sie einfach Ihren Controller-Namespace in route \ web.php hinzu

use App\Http\Controllers\InvoiceController; // InvoiceController is controller name Route::get('invoice',[InvoiceController::class, 'index']);

Oder

Gehen Sie zum Pfad "app \ Providers \ RouteServiceProvider.php" und entfernen Sie Kommentare

protected $namespace = 'App\\Http\\Controllers';

Mobarak Hossen
quelle
1

In Laravel-8 können Sie so verwenden

 Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
 'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function()
{
    Route::resource('/dashboard', 'DashboardController')->only([
        'index'
    ]);
});

Vielen Dank

Hariom Nagar
quelle
1

Wenn Sie weiterhin das ursprüngliche Controller-Routing mit automatischem Präfix verwenden möchten, können Sie einfach den Wert der Eigenschaft $ namespace in Ihrem RouteServiceProvider festlegen und die Routenregistrierungen innerhalb der Startmethode aktualisieren, um die Eigenschaft $ namespace zu verwenden:

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
    });
}
Ivan Fretes
quelle
0

Laravel 8 Aktualisieren Sie die Methode zum Schreiben von Routen

Ref Link https://laravel.com/docs/8.x/upgrade

in laravel 8 musst du like verwenden

use App\Http\Controllers\SayhelloController;
Route::get('/users/{name?}' , [SayhelloController::class,'index']);

oder

Route::get('/users', 'App\Http\Controllers\UserController@index');

Wenn Sie alten Weg verwenden möchten

dann in RouteServiceProvider.php

füge diese Zeile hinzu

 /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers'; // need to add in Laravel 8
    

public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace) // need to add in Laravel 8
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->namespace($this->namespace) // need to add in Laravel 8
            ->group(base_path('routes/web.php'));
    });
}

Dann können Sie gerne verwenden

Route::get('/users/{name?}' , [SayhelloController::class,'index']);

oder

Route::get('/users', 'UserController@index');
Kamlesh Paul
quelle
0

Kommentieren Sie einfach die Zeile unter RouteServiceProvider(Wenn nicht vorhanden, fügen Sie hinzu)

protected $namespace = 'App\\Http\\Controllers';
Jatin Kaklotar
quelle
0

In Laravel 8 hat sich die Art und Weise, wie Routen angegeben werden, geändert:

Route::resource('homes', HomeController::class)->names('home.index');
Ikram Ghalib
quelle
0

Zur Lösung einfach Zeile 29 auskommentieren:

**protected $namespace = 'App\\Http\\Controllers';**

in der Datei ' app \ Providers \ RouteServiceProvider.php '.

nur Kommentar 29 auskommentieren

Bruno Garcia
quelle
0

Ich hatte diesen Fehler

(Illuminate \ Contracts \ Container \ BindingResolutionException Zielklasse [App \ Http \ Controllers \ ControllerFileName] ist nicht vorhanden.

Lösung: Überprüfen Sie einfach Ihren Klassennamen, er sollte genau mit Ihrem Dateinamen übereinstimmen.

Noor Alalem
quelle
0

Wenn Sie die Gruppierung dieser Routen bevorzugen, können Sie Folgendes tun:

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});

Saroj Shrestha
quelle