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.php
的 providers
中:
App\Providers\AccessServiceProvider::class,
在 app.php
的 aliases
中:
'Access' => App\Services\Permissions\Access::class,
也许里面的东西会解决它。
我的 serviceProvider class 有一些问题。应该是这样的:
public function register() {
$this->app->bind('access', function($app) {
return new Permissions();
});
}
我按照@bernie 删除了额外的代码,包括 providers
函数。我还将 $app 参数添加到绑定中。
完整的问题是服务提供者没有被引导(可能是因为 composer 没有找到它)。如果服务提供者没有被引导,那么绑定就不会发生,外观就不起作用。
这是我第一次使用 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.php
的 providers
中:
App\Providers\AccessServiceProvider::class,
在 app.php
的 aliases
中:
'Access' => App\Services\Permissions\Access::class,
也许里面的东西会解决它。
我的 serviceProvider class 有一些问题。应该是这样的:
public function register() {
$this->app->bind('access', function($app) {
return new Permissions();
});
}
我按照@bernie 删除了额外的代码,包括 providers
函数。我还将 $app 参数添加到绑定中。
完整的问题是服务提供者没有被引导(可能是因为 composer 没有找到它)。如果服务提供者没有被引导,那么绑定就不会发生,外观就不起作用。