野狗 API 應用的一個問題?!也許不算是,希望大神指教!叩謝~

reshared發表於2018-03-20

先報版本吧。
1、
/**
* The Laravel framework version.
*
* @var string
*/
const VERSION = '5.6.8';·
2、
"dingo/api": "2.0.0-alpha1"
其他的也是按偉大的社群API教程裡面部署的。

需求:介面不強制Authorization, 但是判斷是否有此引數,來對資料進行操作。也就是,判斷是否登陸,登陸有一套流程,不登陸也可以,走另一套流程;

實現:直接api的時候沒有加中介軟體,給的是遊客路由:
$api->get('trends', 'TrendController@index');
沒有中介軟體。
這樣保證沒登陸不會報錯。

那麼問題來了:
在Controller 方法裡,呼叫
$this->auth()->check(true)
判斷是否登陸,BUT~ 報錯了:
"message": "Type error: Argument 1 passed to Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException::__construct() must be of the type string, null given, called in /home/vagrant/Code/dm-api-dingo/vendor/dingo/api/src/Auth/Auth.php on line 113",
……
就是這樣的錯,我去檢視了下原始檔,發現在
dingo/api/Auth/Auth.php
有這麼一個方法:
protected function throwUnauthorizedException(array $exceptionStack)
{
$exception = array_shift($exceptionStack);

if ($exception === null) {
$exception = new UnauthorizedHttpException(null, 'Failed to authenticate because of bad credentials or an invalid authorization header.');
}

throw $exception;
}

方法 new 了 Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException這個類,並傳入了null的引數。

我不知道這個意味著什麼,但是我去看這個類的構建函式發現:
public function __construct(string $challenge, string $message = null, \Exception $previous = null, ?int $code = 0, array $headers = array())
{
$headers['WWW-Authenticate'] = $challenge;

parent::__construct(401, $message, $previous, $headers, $code);
}

人家寫了要sting嘛,我如果強制把null 換成 '' 就一切正常了……

所以,求教下,這個是dingo的BUG麼?
還是我哪裡沒看到?
還是升級了我沒看到,我看了github 上的 dingo/api版本 跟現在是一樣的啊~
是該咋搞呢?除了重寫,還有別的方法麼?
或者有什麼別的方法實現俺的需求呢?

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章