【问题标题】:Laravel Facade and Service ProviderLaravel 外观和服务提供者
【发布时间】:2015-12-21 02:51:45
【问题描述】:

这是我第一次使用 Laravel 的 Facades 和 Service Providers(我在 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'

我在 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()

【问题讨论】:

  • Laravel 5。很抱歉没有包括在内。我已经编辑了我的帖子
  • 尝试在 Facade.php 的第 213 行中使用 get_class 来查看那里有什么样的对象。
  • 当我使用get_class 时,我得到:App\Services\Permissions\Access。我应该得到其他类还是外观类?
  • $instance 绝对应该是@​​987654337@ 的一个实例,因为这是带有hasPermission 方法的类。 __callStatic 拦截对 Facade 上不存在的静态方法的调用并将其传输到底层实例。
  • @bernie 你是对的......当我调用 get_class 现在它正在工作时,它会返回 Permissions 类。

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


【解决方案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
}

providersapp.php 中:

App\Providers\AccessServiceProvider::class,

aliasesapp.php 中:

'Access'      => App\Services\Permissions\Access::class,

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

【讨论】:

  • 当我使用 ::class 时出现 500 错误我有 php 5.4,我认为这是在 5.5 中出现的。我切换到只使用绑定。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    这可能是问题吗?

    从 (app.php) 更改:

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

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

    你得到的错误

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

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

    【讨论】:

    • 当我改变它时,我得到Non-static method ...hasPermission() should not be called statically。我认为app.php中的别名应该指向Facade类,那么Facade类应该创建一个实例并调用Permissions类的方法。我就是这么理解的,但我显然没有完全理解。
    • 对不起,我觉得一切都很好...我看不出问题所在。我在 Laravel 4.2 上,但从未添加过我自己的 Facade。我会留下这个答案,以免其他人提出建议。
    猜你喜欢
    • 2013-08-25
    • 2017-01-11
    • 2019-05-29
    • 1970-01-01
    • 2015-05-12
    • 2016-12-21
    • 2015-10-24
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多