Aquí está mi controlador:
<?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');
}
}
Como se ve en la captura de pantalla, la clase existe y está en el lugar correcto:
Mi api.php
ruta:
Route::get('register', 'Api\RegisterController@register');
Cuando llegué a mi register
ruta usando Postman, me dio el siguiente error:
La clase de destino [Api \ RegisterController] no existe.
Actualizar:
Gracias a la respuesta, pude arreglarlo. Decidí usar el nombre de clase completamente calificado para esta ruta, pero hay otras opciones como se describe en la respuesta.
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
Api
carpeta?composer dump-autoload
o en suRegisterController
espacio de nombres faltante.composer dump-autoload
Respuestas:
Estás usando Laravel 8. En una nueva instalación de Laravel 8, no se aplica ningún prefijo de espacio de nombres a tus grupos de rutas en los que se cargan tus rutas.
Debería utilizar el nombre de clase totalmente calificado para sus controladores cuando se refiera a ellos en sus rutas cuando no utilice el prefijo del espacio de nombres.
use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']); // or Route::get('/users', 'App\Http\Controllers\UserController@index');
Si prefiere la forma antigua:
App\Providers\RouteServiceProvider
:public function boot() { ... Route::prefix('api') ->middleware('api') ->namespace('App\Http\Controllers') // <--------- ->group(base_path('routes/api.php')); ... }
Haga esto para cualquier grupo de rutas para el que desee un espacio de nombres declarado.
La
$namespace
propiedad:Aunque se menciona una
$namespace
propiedad que se establecerá en ustedRouteServiceProvider
en las notas de la versión y se comentará en su,RouteServiceProvider
esto no tiene ningún efecto en sus rutas. Actualmente solo sirve para agregar un prefijo de espacio de nombres para generar URL a las acciones. Por lo tanto, puede configurar esta variable, pero por sí sola no agregará estos prefijos de espacio de nombres, aún tendrá que asegurarse de usar esta variable al agregar el espacio de nombres a los grupos de rutas.Esta información ahora está en la Guía de actualización
Documentos de Laravel 8.x - Guía de actualización - Enrutamiento
Con lo que muestra la Guía de actualización, lo importante es que está definiendo un espacio de nombres en sus grupos de rutas. Establecer la
$namespace
variable por sí sola solo ayuda a generar URL para acciones.Nuevamente, y no puedo enfatizar esto lo suficiente, la parte importante es configurar el espacio de nombres para los grupos de rutas, lo que simplemente hacen al hacer referencia a la variable miembro
$namespace
directamente en el ejemplo.Actualizar:
Si ha instalado una copia nueva de Laravel 8 desde la versión 8.0.2
laravel/laravel
, puede descomentar laprotected $namespace
variable miembro en elRouteServiceProvider
para volver a la forma anterior, ya que los grupos de rutas están configurados para usar esta variable miembro para el espacio de nombres de los grupos.// protected $namespace = 'App\\Http\\Controllers';
La única razón para descomentar que agregaría el prefijo del espacio de nombres a los controladores asignados a las rutas es porque los grupos de rutas están configurados para usar esta variable como espacio de nombres:
... ->namespace($this->namespace) ...
fuente
laravel/laravel
desaparecerálaravel/laravel
está ahí para que descomente y use si lo deseaCASO 1
Podemos cambiar en
api.php
y enweb.php
archivos como a continuación ..La actual forma de escritura
syntax
esRoute::get('login', 'LoginController@login');
debería cambiarse a
Route::get('login', [LoginController::class, 'login']);
CASO - 2
app > Providers > RouteServiceProvider.php
protected $namespace = null;
conprotected $namespace = 'App\Http\Controllers';
->namespace($this->namespace)
como se muestra en la imagen.fuente
en laravel-8 por defecto, elimine el prefijo del espacio de nombres para que pueda configurar la forma antigua en laravel-7 como:
en
RouteServiceProvider.php
agregar esta variableprotected $namespace = 'App\Http\Controllers';
y
boot
método de actualizaciónpublic 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')); }); }
fuente
laravel 8 actualizó RouteServiceProvider y afecta la ruta con la sintaxis de cadena.Puede cambiarla como se indicó anteriormente, pero la forma recomendada es usar la sintaxis de acción sin usar la ruta con la sintaxis de cadena:
Route::get('register', 'Api\RegisterController@register');
Debería cambiarse a:
Route::get('register', [RegisterController::class, 'register']);
fuente
En laravel 8, simplemente agrega el espacio de nombres de tu controlador en routes \ web.php
use App\Http\Controllers\InvoiceController; // InvoiceController is controller name Route::get('invoice',[InvoiceController::class, 'index']);
O
vaya a la ruta `app \ Providers \ RouteServiceProvider.php` y elimine los comentarios
protected $namespace = 'App\\Http\\Controllers';
fuente
Si está utilizando laravel 8
solo copia y pega mi código
use App\Http\Controllers\UserController; Route::get('/user', [UserController::class, 'index']);
fuente
En laravel-8 puedes usar así
Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin', 'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function() { Route::resource('/dashboard', 'DashboardController')->only([ 'index' ]); });
Gracias
fuente
Si desea continuar usando el enrutamiento del controlador con prefijo automático original, simplemente puede establecer el valor de la propiedad $ namespace dentro de su RouteServiceProvider y actualizar los registros de ruta dentro del método de arranque para usar la propiedad $ namespace:
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')); }); }
fuente
Para la solución, simplemente descomente la línea 29:
**protected $namespace = 'App\\Http\\Controllers';**
en el archivo ' app \ Providers \ RouteServiceProvider.php '.
solo descomenta la línea 29
fuente
En caso de que prefieras agrupar estas rutas, puedes hacer lo siguiente:
Route::group(['namespace' => 'App\Http\Controllers\Api'], function () { Route::resource('user', 'UserController'); Route::resource('book', 'BookController'); });
fuente
La forma de definir tus rutas en laravel 8 es
use App\Http\Controllers\HomeController; // Using PHP callable syntax... Route::get('/', [HomeController::class, 'index']);
O
// Using string syntax... Route::get('/', 'App\Http\Controllers\HomeController@index');
Una ruta de recursos se convierte
Route::resource('/', HomeController::class);
Esto significa que en laravel 8, no hay un prefijo de declaración de controlador automático por defecto.
Si desea seguir con la forma anterior, debe agregar una propiedad de espacio de nombres en
app\Providers\RouteServiceProvider.php
(Esta propiedad estaba presente en versiones anteriores) y activar en el método de rutas. Siga las instrucciones de esta imagen a continuación:fuente
Simplemente elimine el comentario debajo de la línea de
RouteServiceProvider
(si no existe, agregue)protected $namespace = 'App\\Http\\Controllers';
fuente
En Laravel 8, la forma en que se especifican las rutas ha cambiado:
Route::resource('homes', HomeController::class)->names('home.index');
fuente
Tuve este error
Solución: simplemente verifique el Nombre de su clase, debe ser exactamente el mismo que su nombre de archivo.
fuente