Laravel ServiceContainer 和 Facade(初学者)

Laravel ServiceContainer and Facade (beginner)

第一次使用 IOC 和 Facades。我正在尝试制作一个 "teamleader" 门面以便我可以调用

Teamleader::getCompaniesByCountry(); 

我遇到了错误

Non-static method Notflip\Teamleader\Teamleader::getCompaniesByCountry() should not be called statically, assuming $this from incompatible context

这是我的 ServiceProvider

<?php namespace Notflip\Teamleader;

use Illuminate\Support\ServiceProvider;

class TeamleaderServiceProvider extends ServiceProvider {


    public function register()
    {
        $this->app['teamleader'] = $this->app->bind('teamleader', function($app){
            return new Teamleader();
        });
    }

    public function boot()
    {
        //
    }
}

这是我的外观

<?php namespace Notflip\Teamleader\Facades;

use Illuminate\Support\Facades\Facade;

class Teamleader extends Facade {

    protected static function getFacadeAccessor() { return 'teamleader'; }

}

您需要调用外观上的方法,而不是实际的 class。所以如果你的 class 是 Notflip\Teamleader\Teamleader 而你的门面是 Notflip\Teamleader\Facades\Teamleader 那么你基本上需要调用 Notflip\Teamleader\Facades\Teamleader::getCompaniesByCountry().

显然你不想那样做。因此,您在 config/app.php 文件中添加了一个别名。在 'Aliases' 数组下,您可以添加:

'TeamLeader' => 'Notflip\Teamleader\Facades\Teamleader'

那么你可以打电话给\Teamleader::getCompaniesByCountry()

此外,您可能需要将您的服务提供商更改为:

$this->app->bind('teamleader', function($app){
    return new Teamleader();
});

而不是这个:

$this->app['teamleader'] = $this->app->bind('teamleader', function($app){
    return new Teamleader();
});