Php 如何覆盖Laravel/Passport中的'issueToken'方法

Php 如何覆盖Laravel/Passport中的'issueToken'方法,php,laravel,laravel-passport,Php,Laravel,Laravel Passport,我试图覆盖\Laravel\Passport\Http\Controllers\AccessTokenController中的issueToken方法,而不添加新路由,即(api/oauth/token)。我已经构建了自己的AccessTokenController来执行我想要的功能,但是当我调用oauth/token时,正在执行父方法,而不是我的实现。。我是不是搞错了什么东西来完成超控 <?php namespace App\Http\Controllers; use ph

我试图覆盖
\Laravel\Passport\Http\Controllers\AccessTokenController
中的
issueToken
方法,而不添加新路由,即(api/oauth/token)。我已经构建了自己的
AccessTokenController
来执行我想要的功能,但是当我调用
oauth/token
时,正在执行父方法,而不是我的实现。。我是不是搞错了什么东西来完成超控

<?php
   namespace App\Http\Controllers;

   use phpseclib\Crypt\RSA;
   use Illuminate\Database\Eloquent\ModelNotFoundException;
   use League\OAuth2\Server\Exception\OAuthServerException;
   use Psr\Http\Message\ServerRequestInterface;
   use \Laravel\Passport\Http\Controllers\AccessTokenController as ATC;

   class AccessTokenController extends ATC {

     public function issueToken(ServerRequestInterface $request){
       try {
         // Fetching username from request
         $username = $request->getParseBody()['username'];
         // Fetching the User
         $user = User::where('email', '=', $username);
         // Genereting token
         $tokenResponse = parent::issueToken($request);
         //convert response to json string
         $content = $tokenResponse->getBody()->__toString();
         $content['email'] = $user['emial'];
         //convert json to array
         $data = json_decode($content, true);
         return $data;

       } catch (OAuthServerException $e) {
         return ['Message' => 'The suer credentials were incorrect!'];
       }catch (\Exception $e) {
         return ['Message' => 'Exception: '.$e];
       }
     }
   }

路线在供应商内部的代码中硬编码


我建议您在应用程序中重新声明路由,将此代码更改为中间件,然后将路由包裹在其周围。

仅在
app/Providers/AuthServiceProvider.php中覆盖路由就足够了

确保添加:
使用照明\Support\Facades\Route在文件的顶部

public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Route::post('/oauth/token', [
        'uses' => '\App\Http\Controllers\AccessTokenController@issueToken',
        'as' => 'passport.token',
        'middleware' => 'throttle',
    ]);
}
php artisan路由的输出:列表--name=passport.token

+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+ | | POST | oauth/token | passport.token | App\Http\Controllers\AccessTokenController@issueToken | throttle | | | POST | oauth/token/refresh | passport.token.refresh | Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth | | | GET|HEAD | oauth/tokens | passport.tokens.index | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth | | | DELETE | oauth/tokens/{token_id} | passport.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth | +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+ +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+ |域|方法| URI |名称|操作|中间件| +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+ || POST | oauth/token | passport.token | App\Http\Controllers\AccessTokenController@issueToken|节流阀| || POST | oauth/token/refresh | passport.token.refresh | Laravel\passport\Http\Controllers\TransientTokenController@refresh| web、auth| || GET | HEAD | oauth/tokens | passport.tokens.index | Laravel\passport\Http\Controllers\AuthorizedAccessTokenController@forUser| web、auth| ||删除| oauth/tokens/{token_id}| passport.tokens.destroy | Laravel\passport\Http\Controllers\AuthorizedAccessTokenController@destroy| web、auth| +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
如何将代码更改为中间件?对不起,我对PHP和laravel还不太熟悉?我假设我会在
web.php
api.php
@medai中的routes目录中重新声明路由,但我仍然使用父方法,而不是我的实现。事实上,如果我设置了错误的路径,即('uses'=>'\App\Http\Controllers\NONE\AccessTokenController@issueToken’,)对我的控制器来说,它没有给我一个错误,所以我认为它甚至没有在那里查看@真奇怪。我在回答之前测试了代码,它对我来说很有用。也许你的路线被缓存了
php artisan route:clear
@juan_Code18另外,我编辑了答案以注意您需要
use Illumb\Support\Facades\routeapp/Providers/AuthServiceProvider.php
@juan_code18中,在您的示例中,当您声明
Route::post
时,您拥有的是
誓言/令牌
而不是
oauth/token
,这就是为什么它可能有效,因为它对我有效。如果我更正了拼写,则不会覆盖该方法。谢谢你的帮助。我可能不得不考虑使用不同的路径@keyboardSmasherFair。我编辑了输入错误并在服务器上运行了代码。您可以看到
php-artisan-route:list
oauth/token
的输出在我的安装中被覆盖。无论如何,祝你好运@juan_Code18从Laravel 8开始,它是
$request->getParsedBody()