如何将 Laravel 项目转换为 laravel api?

Posted

技术标签:

【中文标题】如何将 Laravel 项目转换为 laravel api?【英文标题】:How to convert a Laravel project, to a laravel api? 【发布时间】:2019-05-29 05:46:33 【问题描述】:

我有一个完全完成的项目,使用 Laravel 后端和 React 前端。 react 应用程序包含在 Laravel 代码中,只有在登录和一些选择后才能使用,这些都是在 laravel 中通过其视图完成的。我想将 react 应用程序作为一个独立的应用程序,并将 laravel 代码变成一个 api,通过服务器提供。一个 url,这样 react 应用程序将通过向 laravel api 发出请求来工作。

所以我的第一个问题是:有没有一种方法可以在我的 laravel 代码中实现 API 来模仿我已经存在的登录实现?

由于我的问题非常广泛,因此我不确定要为这个问题提供什么代码。代码遵循 MVC 设计模式,请随意索取部分代码。

作为一个稍微偏离主题的问题(如果您只是想帮助 laravel 的东西,请不要阅读此内容):我想将 laravel 后端和 react 前端应用程序解耦的原因是包装 react使用 laravel 后端的电子应用程序使其成为离线应用程序。这是一个合理的方法吗?

编辑:我发现问题的症结在于如何执行登录“API 样式”与 laravel 提供的登录表单。所以我认为我需要使用 laravel Passport 实现登录,检索具有与通过 laravel 登录表单登录的用户匹配的凭据的用户。但是我很难看清 laravel 登录表单中的逻辑,所以我可以帮忙看看如何做到这一点。

下面是我的登录控制器的代码,以及相关的中间件。同样,告诉您是否需要更多代码。

登录控制器(来自 App/http/controllers/auth):

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller 

/*
|---------------------------------------------------------------------
| Login Controller
|------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()

    $this->middleware('guest')->except('logout');


中间件(来自 App/http/Kernel.php):

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware   \AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

Edit-2:

这是我的 web.php 路由的代码:

<?php

/*
|---------------------------------------------------------------
| Web Routes
|----------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Auth::routes();

Route::get('/', 'HomeController@index')->name('home');

Route::get('/home', 'HomeController@index')->name('home');

Route::get('/setlocale/locale', function (Request $request, $locale) 
  if (in_array($locale, \Config::get('app.locales'))) 
    session()->put('locale', $locale);
  
  return redirect()->back();
);

Route::get('/profile', 'UserController@show')->name('profile');
Route::patch('/profile', 'UserController@update')->name('users.update');

Route::get('/scan', 'HomeController@index')->name('scan.index');
Route::get('/scan/new', 'ScanController@new')->name('scan.new');
Route::get('/scan/id', 'ScanController@show')->name('scan.show');
Route::post('/scan', 'ScanController@create')->name('scan.create');
Route::patch('/scan/id', 'ScanController@update')->name('scan.update');
Route::delete('/scan/id', 'ScanController@destroy')->name('scan.destroy');

// save SCAN JSON
Route::post('/scan/id/save', 'ScanController@save')->name('scan.save');

编辑 3:

首先,当我创建访问令牌时,/oauth/personal-access-tokens 中存储的内容如下所示:

0:
client:
created_at: "2019-01-04 13:00:48"
id: 3
name: "SCAN Personal Access Client"
password_client: false
personal_access_client: true
redirect: "http://localhost"
revoked: false
updated_at: "2019-01-04 13:00:48"
user_id: null
__proto__: Object
client_id: 3
created_at: "2019-01-15 13:52:22"
expires_at: "2020-01-15 13:52:22"
id: "0321b2d622bd7267273225a64cf6f1723cc74b86076831432fb5af4885051c6776bb8ea77c0d7407"
name: "MyApp"
revoked: false
scopes: []
updated_at: "2019-01-15 13:52:22"
user_id: 1
__proto__: Object

见第一个客户端,在 13:00:48 制作,uder_id 为空。有问题吗?

其次,这是我尝试使用 axios 发出请求的方法,使用函数 login 获取访问令牌(我确实获得了访问令牌),并且我的 API 在 localhost:4321 上运行

login = async () => 
return axios.post('http://localhost:4321/api/login', 
  grant_type: 'password',
  client_id: 5,
  client_secret: 'd3zuZL6KbBI4DOq4Z7NQkP1ezrAj5GMjgo39',
  email: 'my mail, used to login',
  password: 'my password',
  scope: '',
)

async componentDidMount() 
const accessTokenData = await this.login();

var config = 
  headers: 
    Authorization: "bearer " + accessToken
  ,
  grant_type: 'password',
  client_id: 'PassGrantClient',
  client_secret: 'd3zuZL6KbBI4zsDOq4Z7NQkP1ezrAj5GMjgo39',
  scope: '',
;

axios.post(
  'http://localhost:4321/api/getInterview',
  ,
  config
).then((response) => 
  console.log(response)
)

getInterview 路由指向函数的地方

public function getInterview()

    $user = Auth::user();
    return response()->json($user);

返回 401。如您所见,我不知道在哪里放什么 :)。如果您需要更多代码,请随时询问:)。

【问题讨论】:

【参考方案1】:

您需要将您的 Routes/web 转换为 Routes/api

然后您可以在 laravel passport API 或 jwt API 之间进行选择以在您的应用中使用

(如果您选择 jwt,您需要在控制器中创建一个文件夹并将其命名为 API 并在您的 Routes/api 中添加 API\ 例子 : Route:post::('/example' , 'API\yourcontroller@yourfunction'); )

对于与 api 的连接反应,您需要将请求发送给您

www.yourdomain.com/api/你的 api 溃败

希望这对你有用

编辑:

这比您想象的要容易得多,当您使用 API 时,您将不需要“登录控制器(来自 App/http/controllers/auth)”(在将 laravel 护照添加到您的项目后,您可以找到如何在文档documentaion ) 来创建一个用于身份验证的控制器

示例 登录控制器:

 public function login()
    if(Auth::attempt(['email' => request('email'), 'password' => request('password')]))
        $user = Auth::user();

        $success['token'] =  $user->createToken('MyApp')-> accessToken;
        return response()->json(['success' => $success],200);
    
    else
        return response()->json(['error'=>'Unauthorised'], 401);
    

注册你可以使用

public function register(Request $request)
    $validator = Validator::make($request->all(), [
        'name' => 'required',
        'email' => 'required|email',
        'password' => 'required',
        'c_password' => 'required|same:password',
    ]);
    if ($validator->fails()) 
        return response()->json(['error'=>$validator->errors()], 401);
    
    $input = $request->all();
    $input['password'] = bcrypt($input['password']);
    $user = User::create($input);
    $success['token'] =  $user->createToken('MyApp')-> accessToken;
    $success['name'] =  $user->name;
    return response()->json(['success'=>$success], $this-> successStatus);

如果你想获取用户数据,你需要知道你使用护照 api 登录时会为你提供 accsses_token 而不是用户数据,那么你将需要

像这样在你的 api 中创建路由

Route::group(['middleware' => 'auth:api'], function()
Route::post('details', 'API\LoginController@details');

和你的控制器添加功能

public function details()

    $user = Auth::user();
    return response()->json(['success' => $user], 200);
 

然后发送accsses_token到root获取用户数据

编辑 2:

如果您只想在成功登录后使路由工作,那么您需要使用中间件 'auth:api. 示例:

Route::group(['middleware' => 'auth:api'], function()
        Route::post('test', 'API\testController@test');
                Route::get('test2', 'API\testController@test2');
                Route::post('test3', 'API\testController@test3');

【讨论】:

感谢您的回复,这似乎是要走的路。早上大部分时间都在浏览我的代码,我发现我不知道 laravel 如何验证用户登录。它似乎是通过 loginController 完成的,但我无法弄清楚到底发生了什么。我将在 OP 中发布代码。 我想先说非常感谢您的回复,我现在已经走得更远了。 首先我想说非常感谢您的回复,我现在已经走得更远了。话虽如此,我仍然不确定该怎么做。我已经安装了护照,并根据文档在代码中添加了一些东西,但仍然有点迷失如何让我的旧路由“一起玩”API 路由。在编辑 2 之后,我已经用我的网络路由更新了 OP。这些路由只有在成功登录后才能访问。如何使用 API 路由来模拟呢?再说一次,如果我要求太多,请不要回复,您已经帮了我很大的忙! 一如既往的感谢:)。您是忘记了所以保存了您的编辑,还是您还没有完成? 没问题,如果你在 laravel 中需要同样的想法,你可以随时问我很乐意帮助你??【参考方案2】:

我认为迁移到具有相同架构和逻辑的 Laravel 5 及更高版本会有所帮助,他们现在有一个名为 api.php 的新路由文件,而且所有响应都将转换为 JSON 对象以供前端使用。

如果你不想迁移到 Laravel,只需将所有响应转换为 JSON 对象

【讨论】:

以上是关于如何将 Laravel 项目转换为 laravel api?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中将 HTML 转换为 PDF? [关闭]

PHP - Laravel - 将 Docx 转换为 PDF

如何将查询php转换为laravel框架

如何将 Laravel 集合数组转换为 json

将 SQL 转换为 Laravel 5.1

如何将二维数组转换为集合 laravel?