1

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

私のアクセス許可クラスは次のようになります。

<?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 に答える
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 に答える