我正试图在Laravel 8上创建我的第一个API,并希望创建版本控制,看起来像这个
https://domain/api/v1/users
我的用户控制器看起来像这个
namespace AppHttpControllersApiV1;
use AppModelsUser;
class UserController
{
public function getUser(int $idUser)
{
$user = User::find($idUser);
return new AppHttpResourcesV1User($user);
}
}
在我的config/app.php
中,我有这个
'api_latest' => '1',
在我的中间件(app\Http\middleware\APIVersion.php(中
namespace AppHttpMiddleware;
use Closure;
class APIVersion
{
public function handle($request, Closure $next, $guard)
{
config(['app.api.version' => $guard]);
return $next($request);
}
}
在我的kernal(app/http/kernel.php(中
protected $routeMiddleware = [
// ...
'api_version' => AppHttpMiddlewareAPIversion::class,
];
在我的/app/Providers/RouteServiceProvider.php
中
/** @var string $apiNamespace */
protected $apiNamespace ='AppHttpControllersApi';
protected function mapApiRoutes()
{
Route::group([
'middleware' => ['api', 'api_version:v1'],
'namespace' => "{$this->apiNamespace}V1",
'prefix' => 'api/v1',
], function ($router) {
require base_path('routes/api_v1.php');
});
}
在我的routes/api_v1.php
中,我有这个
Route::middleware('api_version')->get('/user', function (Request $request) {
return $request->user();
});
当我在浏览器https://domain/api/v1/users
中键入此消息时,我收到了一个404错误,如何返回此路由的json错误而不是html页面?
更新
php artisan route:list
给了我这个
+--------+----------+------------------------+----------------------+------------------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action
| Middleware |
+--------+----------+------------------------+----------------------+------------------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure
|
| | GET|HEAD | home | home | AppHttpControllersHomeController@index
| web |
| | | | |
| | GET|HEAD | login | login | AppHttpControllersAuthLoginController@showLoginForm | web |
| | | | |
| guest |
| | POST | login | | AppHttpControllersAuthLoginController@login | web |
| | | | |
| guest |
| | POST | logout | logout | AppHttpControllersAuthLoginController@logout | web |
| | GET|HEAD | password/confirm | password.confirm | AppHttpControllersAuthConfirmPasswordController@showConfirmForm | web |
| | | | |
| auth |
| | POST | password/confirm | | AppHttpControllersAuthConfirmPasswordController@confirm | web |
| | | | |
| auth |
| | POST | password/email | password.email | AppHttpControllersAuthForgotPasswordController@sendResetLinkEmail | web |
| | GET|HEAD | password/reset | password.request | AppHttpControllersAuthForgotPasswordController@showLinkRequestForm | web |
| | POST | password/reset | password.update | AppHttpControllersAuthResetPasswordController@reset | web |
| | GET|HEAD | password/reset/{token} | password.reset | AppHttpControllersAuthResetPasswordController@showResetForm | web |
| | GET|HEAD | register | register | AppHttpControllersAuthRegisterController@showRegistrationForm | web |
| | | | | | guest |
| | POST | register | | AppHttpControllersAuthRegisterController@register | web |
| | | | | | guest |
+--------+----------+------------------------+----------------------+------------------------------------------------------------------------+------------+
好的,不要使用中间件来更改url,只使用路由,用这个来证明。
首先,你必须安装护照或圣地,在我的情况下,我使用了护照。请参阅文档继续安装
在app/Providers/RouteServiceProvider.php 中
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api/v1')
->middleware(['api'])
->namespace($this->namespace)
->group(base_path('routes/api/v1/api.php'));
}
在路由/api/v1/api.php
Route::prefix('/user')->group(function (){
Route::post('/login', [LoginController::class,'login']);
});
应用程序内/Http/Controller/Auth/LogiController
查看客户端的IP如下$request->ip();
public function login(Request $request)
{
$loginData = $request->validate([
'email' => 'email|required',
'password' => 'required'
]);
if (!auth()->attempt($loginData)) {
return response()->json(['message'=>'Datos invalidos de usuarios','success'=>false], 404);
}
$accessToken = auth()->user()->createToken('authToken')->accessToken;
return response()->json( ['success'=>true,'message'=>'Acceso consedido',
'user' => auth()->user(),
"token_type" => "Bearer",
"access_token" => $accessToken,
],200);
}
应用程序内/Http/Controller/UserController
<?php
namespace AppHttpControllersApiV1;
use AppHttpControllersController;
use AppModelsUser;
class UserController extends Controller
{
public function getUser()
{
$users = User::get();
return response()->json(['data'=> $users]);
}
}
在路由/api/v1/api.php
如果你看的话。我使用了中间件,所以只有经过身份验证的用户才能看到内容。
<?php
use AppHttpControllersApiV1UserController;
use AppHttpControllersAuthLoginController;
Route::prefix('/user')->group(function (){
Route::post('/login', [LoginController::class,'login']);
Route::get('/users',[UserController::class,'getUser'])->middleware('auth:api', 'client');
});
我希望这些信息对你有所帮助。
λ php artisan route:list
+--------+----------+-------------------+------+----------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------+------+----------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | POST | api/v1/user/login | | AppHttpControllersAuthLoginController@login | api |
| | GET|HEAD | api/v1/user/users | | AppHttpControllersApiV1UserController@getUser | api |
| | | | | | auth:api |
| | | | | | client |
+--------+----------+-------------------+------+----------------------------------------------------+------------+