我正在尝试创建一个非常简单的api,只是为了了解如何管理它。
我需要检查是否有一个"api密钥"沿着url传递,我的url应该看起来像:
http://myapi.app/api/users?key=my-api-key
http://myapi.app/api/orders?key=my-api-key
所以我已经创建了一个父类来管理它,以避免在每个控制器中复制所有登录:
<?php
namespace App'Http'Controllers'Api;
use Illuminate'Http'Response as IlluminateResponse;
use Illuminate'Routing'Controller;
use Illuminate'Support'Facades'App;
class ApiController extends Controller {
protected $isValid = true;
public function __construct()
{
$request = App::make('Illuminate'Http'Request');
if( ! $request->input('api_key') )
{
$this->isValid = false;
}
}
/**
* Per default lo status è 200 ovvero risposta corretta
*
* @var int
*/
protected $statusCode = 200;
/**
* @return mixed
*/
public function getStatusCode()
{
return $this->statusCode;
}
/**
* @param mixed $statusCode
* @return $this
*/
public function setStatusCode( $statusCode )
{
$this->statusCode = $statusCode;
return $this;
}
/**
* @param string $message
* @return mixed
*/
public function respondNotFound( $message = 'Risorsa non trovata' )
{
return $this->setStatusCode( IlluminateResponse::HTTP_NOT_FOUND )->respondWithErrors( $message );
}
/**
* @param string $message
* @return mixed
*/
public function respondInternalError( $message = "Errore interno del server" )
{
return $this->setStatusCode( IlluminateResponse::HTTP_INTERNAL_SERVER_ERROR )->respondWithErrors( $message );
}
/**
* @param $data
* @param array $headers
* @return mixed
*/
public function respond( $data, $headers = [ ] )
{
return 'Response::json( $data, $this->getStatusCode(), $headers );
}
/**
* @param $message
* @return mixed
*/
public function respondWithErrors( $message )
{
return $this->respond( [
'error' => [
'message' => $message,
'status_code' => $this->getStatusCode()
]
] );
}
}
这是我的TestController
<?php
namespace App'Http'Controllers'Api;
class TestController extends ApiController {
public function __construct()
{
parent::__construct();
if( ! $this->isValid )
{
return $this->respondWithErrors("no no");
}
}
public function test()
{
return "All ok";
}
}
问题是,如果我使用Postman或通过浏览器访问url,并且我没有设置key
,测试控制器将始终返回All ok
,我错过了什么?
看起来像是isValid变量http://php.net/manual/en/language.oop5.visibility.php的可见性问题
将变量更改为public,或者更好的选择是在父类中为isValid变量添加一个public getter
public function isValid()
{
return $this->isValid;
}
在任何情况下,中间件都可能是实现这一目标的更好选择