Laravel门面和服务提供商

时间:2015-09-23 17:06:26

标签: laravel-5 service-provider laravel-facade

这是我第一次使用Laravel的外墙和服务提供商(我在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'];
    }
}

My 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中的app.php

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

我将其添加到app.php中的providers

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

3 个答案:

答案 0 :(得分: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
}
<{1}} providers中的

app.php
<{1}} App\Providers\AccessServiceProvider::class, 中的

aliases

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

这可能是问题吗?

<击> 从(app.php)更改:

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

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

你得到的错误

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

表明php正在尝试在hasPermission类上调用Access,而不是在实现该方法的Permissions类上调用Application