如果一个值不在url中,父类应该停止执行


PHP/Laravel - parent class should stop execution if a value is not in url

我正在尝试创建一个非常简单的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;
}

在任何情况下,中间件都可能是实现这一目标的更好选择