通用Laravel功能应该在控制器之外的哪个位置?

时间:2018-03-13 09:30:55

标签: php laravel laravel-5.5

通常在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()的内容。

2 个答案:

答案 0 :(得分:0)

函数groupstats()未定义为静态,因此无法通过AwsAutoscale::groupstats()调用它。

您需要将groupstats()的函数定义更改为public static function groupStats()或通过$AwsAutoscale->groupstats()调用函数,其中$AwsAutoscale需要是类的实例!< / p>

答案 1 :(得分:-1)

如我所见,您尝试静态调用non-static functionAwsAutoscale::groupStats()) 函数helloworld被声明为静态,因此以这种方式调用它没有问题,那么你有3个解决方案:首先将groupStats定义为静态函数然后它工作,第二个解决方案来实例化你的类$awsAutoscale = \App::make(AwsAutoscale::class)然后是$ awsAutoscale-&gt; groupStats(),或者将AwsAutoscale作为辅助类的最后一个解决方案,然后你可以创建groupstats()。