【问题标题】:Laravel ServiceContainer and Facade (beginner)Laravel ServiceContainer 和 Facade(初学者)
【发布时间】:2015-05-05 03:33:26
【问题描述】:

第一次使用 IOC 和 Facades。我正在尝试制作一个“团队负责人”外观,以便我可以打电话

Teamleader::getCompaniesByCountry(); 

我得到了错误

不应静态调用非静态方法 Notflip\Teamleader\Teamleader::getCompaniesByCountry(),假设 $this 来自不兼容的上下文

这是我的服务提供者

<?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'; }

}

【问题讨论】:

    标签: php laravel inversion-of-control


    【解决方案1】:

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

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

    '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();
    });
    

    【讨论】:

    • 非常感谢!写得很好的答案并解决了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2023-03-27
    • 1970-01-01
    • 2015-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多