当前位置: 首页 > 知识库问答 >
问题:

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

牧献
2023-03-14

我有一个完全完成的项目,由Laravel后端和反应前端组成。反应应用程序包装在Laravel代码中,只有在登录和一些选择后才可用,这些都是在laravel中完成的,并带有它的视图。我想把反应应用程序做成一个独立的应用程序,并把laravel代码做成一个api,从服务器通过。一个url,这样反应应用程序将通过向laravel api发出请求来工作。

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

由于我的问题相当广泛,我不确定该为这个问题提供什么代码。代码遵循MVC设计模式,因此请随时询问代码的某些部分。

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

编辑:我发现问题的症结是如何执行登录“API样式”而不是Laravel提供的登录表单。所以我认为我需要使用 laravel 护照实现登录,检索具有与通过 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,
];

第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发出请求,使用函数登录来获取访问令牌(我确实获得了访问令牌),并且我的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。正如你所看到的,我不知道该把什么放在哪里:)。如果您需要更多代码,请随时询问:)。

共有2个答案

龚承嗣
2023-03-14

我认为使用相同的模式和逻辑迁移到Laravel 5及以上版本会很有帮助,他们现在有了一个名为api的新路由文件。php,此外,所有响应都将转换为JSON对象供前端使用。

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

欧阳昊阳
2023-03-14

您需要将您的路线/网络转换为路线/API

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

(如果您选择jwt,则需要在控制器中创建一个文件夹并将其命名为API并在Routes/api示例中添加API\:路由:发布::('/示例','API\yourcontroller@yourfunction');)

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

www.yourdomain。com/api/your-api路由

这是所有希望这将为你工作

编辑:

这比你想象的要容易得多,当你使用API的时候,你不需要“登录控制器(来自App/http/controllers/auth)”你需要(在你的项目中添加了laravel passport之后,你可以在文档中找到如何创建你的一个控制器来进行认证

示例登录控制器:

 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);
}

如果您想获取用户数据,那么需要使用passportapi登录,该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发送到根以获取用户数据

编辑 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');

}

 类似资料:
  • 问题内容: 有人可以告诉我如何将我的Java程序代码导入Eclipse吗?因为我有点想导入它。我通常使用Java博士,但是我想开始使用Eclipse,因为我觉得它更专业并且我喜欢它的“感觉”?那么有人可以向我解释如何去做吗? 如果您需要任何东西,请问:D 问题答案: 为了将您的代码导入Eclipse: 确保所有代码都在一个文件夹(例如/ project)下 在Eclipse中,使用File-> N

  • 我试图使用Eclipse的从maven开始。但如果我尝试将现有项目更改为Maven项目(),结果是: null 问题可能出在哪里? 更新(生成的pom.xml):

  • 我有一个用Java编写的gradle项目,想把整个事情变成一个scala项目(仍然是gradle)。要做到这一点,需要采取哪些步骤? 我开始在scala中定义main方法,似乎Intellij不知道我要做什么。 到目前为止我所做的: > 在build.gradle中应用插件:“scala”--> 在build.gradle中编译'org.scala-lang:scala-library:2.10.

  • 问题内容: 我已经使用eclipse中的 m2e插件* 将 Java Web项目 转换为 Maven项目 。现在,我需要将其转换回Java Web项目。现在,如何将其更改回Java Web项目。 * 问题答案: 请尝试以下操作: 在Maven项目上打开上下文菜单 选择“ Maven”->“禁用Maven自然” 希望能有所帮助。

  • 所以发生的事情是,我从这个项目的一开始就开始研究智能IDEA。由于提交要求,我不得不将项目转换为Eclipse兼容形式。所以我把它转换成了日食计划。在那之后,我注意到我不能像以前那样真正地做这个项目。这是我在将我的项目转换为Eclipse兼容后看到的。我想撤消它。但我不知道该怎么做。

  • 我在Eclipse IDE中编写了JavaFx项目,它工作正常。 一旦我把它转换成Maven项目,我的FMXL文件就停止打开了。但是,如果我创建新的FXML文件并将它们放在相同的文件夹中,一切都会正常工作。 有没有办法在不重新创建所有FXML文件的情况下运行我的Maven项目? 我已经尝试过在代码中更改FXML文件的路径,将FXML移到src/main/resources包,或者简单地将代码从旧的