这是我第一次使用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()
答案 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
。
击>