Я впервые использую фасады и поставщиков услуг 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
в 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'; }
}
Насколько я понимаю, я регистрирую псевдоним, который указывает на класс фасада, который ссылается на привязку, указывающую на класс.
Я зарегистрировал привязку в ServiceProvider, которую зарегистрировал в app.php.
Теперь в моем файле маршрутов я тестирую следующий код:
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()
get_class
в строке 213 Facade.php, чтобы увидеть, какой у вас там объект. - person bernie   schedule 23.09.2015get_class
, я получаю:App\Services\Permissions\Access
. Должен ли я получить другой класс или класс фасада? - person ajon   schedule 23.09.2015$instance
определенно должен быть экземпляромApp\Services\Permissions\Permissions
, поскольку это класс с методомhasPermission
.__callStatic
перехватывает вызовы несуществующих статических методов на фасаде и передает их базовому экземпляру. - person bernie   schedule 23.09.2015