Laravel 门面和服务提供商

Laravel Facade and Service Provider

这是我第一次使用 Laravel 的 Facades 和服务提供商(我在 Laravel 5)。

我有这个ServiceProvider:

<?php namespace App\Providers;
...
class AccessServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->alias('access', 'App\Services\Permissions\Permissions');
        $this->app->bindShared('access', function() {
            return new Permissions();
        });
        return new App\Services\Permissions\Permissions();
    }

    public function provides(){
        return ['App\Services\Permissions\Permissions'];
    }
}

我的权限 class 看起来像这样:

<?php namespace App\Services\Permissions;
class Permissions{
    private $permissions;
    public function __construct(){
        $this->permissions =  [
            "AssignQuotes" => new CanAssignQuotesPermission()
        ];
    }

    public function hasPermission($permission, $user){
        return $this->permissions[$permission]->canDo($user->role_id);
    }
}

我在 app.php 中将此添加到我的 aliases 中:

'Access' => 'App\Services\Permissions\Access'

我在 app.php 中将此添加到我的 providers 中:

'App\Providers\AccessServiceProvider',

我创建了这个 Facade class:

<?php namespace App\Services\Permissions;
use Illuminate\Support\Facades\Facade;

class Access extends Facade {
    protected static function getFacadeAccessor() { return 'access'; }
}

根据我的理解,我注册了一个别名,它指向一个 Facade class,它引用了一个指向 class.

的绑定

我在 app.php 中注册的 ServiceProvider 中注册了绑定。

现在在我的路由文件中,我正在使用以下代码进行测试:

Route::get('test', function(){
    $user = User::find(1);
    $access = Access::hasPermission("AssignQuotes", $user);
    return "test";
}

但是我收到这个错误:

FatalErrorException in Facade.php line 213:
Call to undefined method App\Services\Permissions\Access::hasPermission()

这可能是问题所在吗?

从 (app.php) 更改:

'Access' => 'App\Services\Permissions\Access'

'Access' => 'App\Services\Permissions\Permissions'

你得到的错误

Call to undefined method App\Services\Permissions\Access::hasPermission()

显示 php 正在尝试在 Access class 上调用 hasPermission 而不是在 Permissions class 上调用 hasPermission方法。

我发现的唯一问题是:

从您的服务提供商处删除不必要的代码:

<?php namespace App\Providers;
...
class AccessServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->bind('access', 'App\Services\Permissions');
        // OR bindShared() if you need to share a single instance across the app
        $this->app->bindShared('access', function() {
            return new \App\Services\Permissions();
        });
    }

    // No need for a provides() method
}

app.phpproviders 中:

App\Providers\AccessServiceProvider::class,

app.phpaliases 中:

'Access'      => App\Services\Permissions\Access::class,

也许里面的东西会解决它。

我的 serviceProvider class 有一些问题。应该是这样的:

public function register() {
    $this->app->bind('access', function($app) {
        return new Permissions();
    });
}

我按照@bernie 删除了额外的代码,包括 providers 函数。我还将 $app 参数添加到绑定中。

完整的问题是服务提供者没有被引导(可能是因为 composer 没有找到它)。如果服务提供者没有被引导,那么绑定就不会发生,外观就不起作用。