1

这是我第一次使用 Laravel 的 Facades 和 Service Providers(我在 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'];
    }
}

我的权限类如下所示:

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

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

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

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

'App\Providers\AccessServiceProvider',

我创建了这个Facade类:

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

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

据我了解,我注册了一个别名,该别名指向一个 Facade 类,该类引用指向一个类的绑定。

我在 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()
4

3 回答 3

1

我发现的唯一问题是:

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

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

在:providers_app.php

App\Providers\AccessServiceProvider::class,

在:aliases_app.php

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

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

于 2015-09-23T20:01:42.290 回答
1

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

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

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

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

于 2015-09-23T20:47:07.423 回答
0

这可能是问题吗?

从 ( ) 更改app.php

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

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

你得到的错误

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

表明 php 试图调用类而不是实现该方法 hasPermission的类。AccessPermissions

于 2015-09-23T18:27:51.907 回答