Laravel 没有依赖注入的门面类型错误
Laravel facade type error without dependency injection
我正在尝试从我的应用程序中的任何位置访问功能。但是我收到以下错误:
Type error: Argument 1 passed to
App\Helpers\AwsAutoscale::__construct() must be an instance of
Aws\AutoScaling\AutoScalingClient, none given, called in
/home/vagrant/Site/app/Providers/AwsAutoscaleProvider.php on line 31
我的代码是:
App/Helpers/AwsAutoscale.php
<?php
namespace App\Helpers;
use Aws\AutoScaling\AutoScalingClient;
class AwsAutoscale
{
private $awsClient;
public function __construct(AutoScalingClient $awsClient)
{
$this->awsClient = $awsClient;
}
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'])
]);
}
}
App/Providers/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')
]);
});
}
}
App/Providers/AwsAutoScaleProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AwsAutoscaleProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
$this->app->bind('autoscale', function()
{
return new \App\Helpers\AwsAutoscale;
});
}
}
config/app.php:
'providers' => [
...
App\Providers\AwsAutoscaleProvider::class
...
'aliases' => [
...
'autoscale'=> App\Facades\AutoscaleFacade::class,
...
控制器中的代码:
return autoscale::groupStats();
调用它会导致错误:
Type error: Argument 1 passed to
App\Helpers\AwsAutoscale::__construct() must be an instance of
Aws\AutoScaling\AutoScalingClient, none given, called in
/home/vagrant/Site/app/Providers/AwsAutoscaleProvider.php on line 31
假设您在 App/Helpers/AwsAutoscale.php
:
中保存了这个 AwsAutoscale
助手
<?php
namespace App\Helpers;
use Aws\AutoScaling\AutoScalingClient;
class AwsAutoscale
{
private $awsClient;
public function __construct(AutoScalingClient $awsClient)
{
$this->awsClient = $awsClient;
}
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']),
]);
}
}
并且您希望可以通过 Facade. The first step is to register it within the service provider 访问此 AwsAutoscale
class 实例。让我们将其放在 App/Providers/AutoScalingClientProvider.php
文件中:
<?php
namespace App\Providers;
use App\Helpers\AwsAutoscale;
use Aws\AutoScaling\AutoScalingClient;
use Illuminate\Support\ServiceProvider;
class AutoScalingClientProvider extends ServiceProvider
{
public function register()
{
// Bind the AutoScalingClient.
$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')
]);
});
// Bind the AwsAutoscale helper.
$this->app->singleton('autoscale', function ($app) {
// You need to manually inject the dependency, which is the AutoScalingClient instance
return new AwsAutoscale($app->make(AutoScalingClient::class));
});
}
}
您可以删除 App/Providers/AwsAutoScaleProvider.php
文件,因为我们已经将 AwsAutoscale
绑定到 AutoScalingClientProvider.php
。
如果您想通过外观访问 AwsAutoscale
,您需要为此创建一个外观 class。假设我们把它放在 App\Facades\AutoscaleFacade.php
:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class AutoscaleFacade extends Facade
{
protected static function getFacadeAccessor()
{
// Return the key we use on service provider to bind AwsAutoclass instance
return 'autoscale';
}
}
接下来,我们需要在 config\app.php
上注册服务提供者和门面 class:
<?php
return [
...
'providers' => [
...
App\Providers\AutoScalingClientProvider::class,
],
'aliases' => [
...
'Autoscale' => App\Facades\AutoscaleFacade::class,
],
];
现在您可以像这样使用注册的别名轻松访问 AwsAutoscale
实例:
Route::get('/foo', function () {
// Access it with the Autoscale facade class not AwsAutoscale
dd(\Autoscale::groupStats());
});
希望这能给你一些想法。
我正在尝试从我的应用程序中的任何位置访问功能。但是我收到以下错误:
Type error: Argument 1 passed to App\Helpers\AwsAutoscale::__construct() must be an instance of Aws\AutoScaling\AutoScalingClient, none given, called in /home/vagrant/Site/app/Providers/AwsAutoscaleProvider.php on line 31
我的代码是:
App/Helpers/AwsAutoscale.php
<?php
namespace App\Helpers;
use Aws\AutoScaling\AutoScalingClient;
class AwsAutoscale
{
private $awsClient;
public function __construct(AutoScalingClient $awsClient)
{
$this->awsClient = $awsClient;
}
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'])
]);
}
}
App/Providers/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')
]);
});
}
}
App/Providers/AwsAutoScaleProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AwsAutoscaleProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
$this->app->bind('autoscale', function()
{
return new \App\Helpers\AwsAutoscale;
});
}
}
config/app.php:
'providers' => [
...
App\Providers\AwsAutoscaleProvider::class
...
'aliases' => [
...
'autoscale'=> App\Facades\AutoscaleFacade::class,
...
控制器中的代码:
return autoscale::groupStats();
调用它会导致错误:
Type error: Argument 1 passed to App\Helpers\AwsAutoscale::__construct() must be an instance of Aws\AutoScaling\AutoScalingClient, none given, called in /home/vagrant/Site/app/Providers/AwsAutoscaleProvider.php on line 31
假设您在 App/Helpers/AwsAutoscale.php
:
AwsAutoscale
助手
<?php
namespace App\Helpers;
use Aws\AutoScaling\AutoScalingClient;
class AwsAutoscale
{
private $awsClient;
public function __construct(AutoScalingClient $awsClient)
{
$this->awsClient = $awsClient;
}
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']),
]);
}
}
并且您希望可以通过 Facade. The first step is to register it within the service provider 访问此 AwsAutoscale
class 实例。让我们将其放在 App/Providers/AutoScalingClientProvider.php
文件中:
<?php
namespace App\Providers;
use App\Helpers\AwsAutoscale;
use Aws\AutoScaling\AutoScalingClient;
use Illuminate\Support\ServiceProvider;
class AutoScalingClientProvider extends ServiceProvider
{
public function register()
{
// Bind the AutoScalingClient.
$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')
]);
});
// Bind the AwsAutoscale helper.
$this->app->singleton('autoscale', function ($app) {
// You need to manually inject the dependency, which is the AutoScalingClient instance
return new AwsAutoscale($app->make(AutoScalingClient::class));
});
}
}
您可以删除 App/Providers/AwsAutoScaleProvider.php
文件,因为我们已经将 AwsAutoscale
绑定到 AutoScalingClientProvider.php
。
如果您想通过外观访问 AwsAutoscale
,您需要为此创建一个外观 class。假设我们把它放在 App\Facades\AutoscaleFacade.php
:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class AutoscaleFacade extends Facade
{
protected static function getFacadeAccessor()
{
// Return the key we use on service provider to bind AwsAutoclass instance
return 'autoscale';
}
}
接下来,我们需要在 config\app.php
上注册服务提供者和门面 class:
<?php
return [
...
'providers' => [
...
App\Providers\AutoScalingClientProvider::class,
],
'aliases' => [
...
'Autoscale' => App\Facades\AutoscaleFacade::class,
],
];
现在您可以像这样使用注册的别名轻松访问 AwsAutoscale
实例:
Route::get('/foo', function () {
// Access it with the Autoscale facade class not AwsAutoscale
dd(\Autoscale::groupStats());
});
希望这能给你一些想法。