通常在Laravel应用程序中,我将函数放在控制器中。
但是如果我有AWS API调用之类的通用功能,我需要从多个控制器访问,我该怎么办?我有一个提供商,但无法访问它?
以前我使用过类似的东西:
$servers = new ServerController();
$stats = $servers->groupStats();
但这不适用于其他人添加到项目中的服务提供者/构造函数:
应用程序/提供者/ AutoScalingClientProvider.php:
<?php
namespace App\Providers;
use Aws\AutoScaling\AutoScalingClient;
use Illuminate\Support\ServiceProvider;
class AutoScalingClientProvider extends ServiceProvider
{
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind(AutoScalingClient::class, function () {
return new AutoScalingClient([
'AutoScalingGroupName' => config('aws.auto_scaling_client.name'),
'region' => config('aws.auto_scaling_client.region'),
'version' => config('aws.auto_scaling_client.version')
]);
});
}
}
应用程序/助手/ AwsAutoscale.php:
<?php namespace App\Helpers;
use Aws\AutoScaling\AutoScalingClient;
class AwsAutoscale {
private $awsClient;
public function __construct(AutoScalingClient $awsClient)
{
$this->awsClient = $awsClient;
}
/**
* Returns an excerpt from a given string (between 0 and passed limit variable).
*
* @param $string
* @param int $limit
* @param string $suffix
* @return string
*/
public static function helloworld()
{
return 'helloworld';
}
/**
* Gets the stats for our auto scaling worker group.
*
* @return \Illuminate\Support\Collection The group stats.
*/
public function groupStats()
{
$result = $this->awsClient->describeAutoScalingGroups();
return collect([
'desired' => $result['AutoScalingGroups'][0]['DesiredCapacity'],
'min' => $result['AutoScalingGroups'][0]['MinSize'],
'max' => $result['AutoScalingGroups'][0]['MaxSize'],
'current' => count($result['AutoScalingGroups'][0]['Instances'])
]);
}
}
我可以从任何地方调用helloworld()并且可以正常工作,但调用groupstats()会出错:
不应静态调用非静态方法App \ Helpers \ AwsAutoscale :: groupStats()
我意识到这种结构是错误的。我该如何设置这类东西?我只是希望能够从任何控制器调用类似AwsAutoscale :: groupstats()的内容。
答案 0 :(得分:0)
函数groupstats()未定义为静态,因此无法通过AwsAutoscale::groupstats()
调用它。
您需要将groupstats()
的函数定义更改为public static function groupStats()
或通过$AwsAutoscale->groupstats()
调用函数,其中$AwsAutoscale
需要是类的实例!< / p>
答案 1 :(得分:-1)
如我所见,您尝试静态调用non-static function
(AwsAutoscale::groupStats()
)
函数helloworld
被声明为静态,因此以这种方式调用它没有问题,那么你有3个解决方案:首先将groupStats
定义为静态函数然后它工作,第二个解决方案来实例化你的类$awsAutoscale = \App::make(AwsAutoscale::class)
然后是$ awsAutoscale-&gt; groupStats(),或者将AwsAutoscale作为辅助类的最后一个解决方案,然后你可以创建groupstats()。