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:
Meine api.php
Route:
Route::get('register', 'Api\RegisterController@register');
Als ich meine register
Route 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');
Api
Ordner?composer dump-autoload
oder in IhremRegisterController
Namespace fehlt.composer dump-autoload
Antworten:
Sie verwenden Laravel 8. In einer Neuinstallation von Laravel 8 wird Ihren Routengruppen, in die Ihre Routen geladen werden, kein Namespace-Präfix zugewiesen.
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
$namespace
Eigenschaft:Obwohl in den Versionshinweisen eine
$namespace
Eigenschaft erwähnt wird, die auf Ihrer festgelegtRouteServiceProvider
und in Ihrer kommentiert werden soll,RouteServiceProvider
hat 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
$namespace
Variablen 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
$namespace
im Beispiel verweisen .Aktualisieren:
Wenn Sie seit Version 8.0.2 eine neue Kopie von Laravel 8 installiert haben
laravel/laravel
, können Sie dieprotected $namespace
Mitgliedsvariable aus dem Kommentar entfernenRouteServiceProvider
, 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) ...
quelle
laravel/laravel
davon weg sein wirdlaravel/laravel
davon ist für Sie da, um zu kommentieren und zu verwenden, wenn Sie möchtenFALL 1
Wir können in
api.php
und inweb.php
Dateien wie unten ändern .Die aktuelle Art, wie wir schreiben,
syntex
istRoute::get('login', 'LoginController@login');
sollte geändert werden zu
Route::get('login', [LoginController::class, 'login']);
FALL - 2
app > Providers > RouteServiceProvider.php
protected $namespace = null;
durchprotected $namespace = 'App\Http\Controllers';
->namespace($this->namespace)
wie im Bild gezeigt ..quelle
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.php
hinzufügen , um dieses variableprotected $namespace = 'App\Http\Controllers';
und Update -
boot
Methodepublic 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')); }); }
quelle
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']);
quelle
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']);
quelle
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';
quelle
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
quelle
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')); }); }
quelle
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');
quelle
Kommentieren Sie einfach die Zeile unter
RouteServiceProvider
(Wenn nicht vorhanden, fügen Sie hinzu)protected $namespace = 'App\\Http\\Controllers';
quelle
In Laravel 8 hat sich die Art und Weise, wie Routen angegeben werden, geändert:
Route::resource('homes', HomeController::class)->names('home.index');
quelle
Zur Lösung einfach Zeile 29 auskommentieren:
**protected $namespace = 'App\\Http\\Controllers';**
in der Datei ' app \ Providers \ RouteServiceProvider.php '.
nur Kommentar 29 auskommentieren
quelle
Ich hatte diesen Fehler
Lösung: Überprüfen Sie einfach Ihren Klassennamen, er sollte genau mit Ihrem Dateinamen übereinstimmen.
quelle
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'); });
quelle