【问题标题】:Executing function before every controller request在每个控制器请求之前执行函数
【发布时间】:2019-09-14 09:12:05
【问题描述】:

我正在使用带有 php-openstack-sdk 的令牌身份验证调用云 API。

$openstack = new OpenStack\OpenStack([
    'authUrl' => '{authUrl}',
    'region' => '{region}',
    'user' => [
        'id' => '{userId}',
        'password' => '{password}'
    ],
    'scope' => ['project' => ['id' => '{projectId}']]
]);

但是,每个 API 调用都要求我进行身份验证(如上面的代码所示)。而不是在每个控制器功能中重复相同的身份验证代码,我该如何做一次并能够在我的控制器功能中调用$openstack?即,在我的控制器中,我可以直接使用 $openstack。

public function listServers() 
{
    $openstack->computeV2()->listServers();
}

【问题讨论】:

  • 您需要在一个控制器的每个方法之前或所有控制器的每个方法之前调用auth代码吗?将该代码放入__construct()。如果每个控制器都需要它,请使用父级__construct()。我假设您的控制器扩展了基础Controller
  • 未定义变量 $openstack pastebin.com/rbwCXikF
  • 你应该试试中间件

标签: laravel http-token-authentication laravel-controller


【解决方案1】:

如果您希望所有控制器都可以访问该逻辑,请在 Controller.php__construct() 中写入逻辑。如果没有,请在您需要的控制器中写入__construct()

控制器.php

class Controller extends BaseController
{
    protected $openstack;

    public function __construct()
    {
        $this->openstack = new OpenStack\OpenStack([
            ...
        ]);
    }
}

NetworkController.php

class NetworkController extends Controller
{
    public function getNetworkDetails() {
        $network = $this->openstack->networking();
    }
}

【讨论】:

    【解决方案2】:

    您可以将显示的代码放在控制器的__construct 函数中,并将其作为受保护的变量提供给类。

    【讨论】:

    • 您需要将其作为类的受保护变量提供,然后您可以将其用作$this->openstack
    【解决方案3】:

    我认为最好的方法是使用laravel middlewares

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 2011-07-22
      • 2013-08-16
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多