0

我试图为我的 Gravatar 库设置一个外观。

问题

我遇到的问题如下,ServiceProvider 没有注册。所以“gravatar”不在 IoC 中。

我添加\Log::info('initialized');到我的 ServiceProvider 但没有记录任何内容。

错误

Call to undefined method Facade\Gravatar::getUrl()

代码

http://paste.laravel.com/AgO

4

1 回答 1

2

所以,一个门面需要(潜在的)三个类:

  1. 具有您将使用的方法的类,在这种情况下Gravatar::getUrl()
  2. Facade 类告诉 Laravel 在哪里可以找到第 1 点中的类
  3. ServiceProvider,它通过 $app 容器创建带有方法的类。

有关更多信息,请参见在 Laravel 中创建外观。

在您的情况下,我没有看到第 1 点的代码。

班上

图书馆/Gravatar/Avatar.php

<?php namespace Gravatar;

class Avatar {

    public function getUrl() { ...  }

}

立面

图书馆/Gravatar/Facade.php

<?php namespace Gravatar;

use Illuminate\Support\Facades\Facade as BaseFacade;

class Facade extends BaseFacade {

    protected static function getFacadeAccessor() {
    return 'gravatar';
}

}

服务提供者

图书馆/Gravatar/GravatarServiceProvider.php

<?php namespace Gravatar;

use Illuminate\Support\ServiceProvider

class GravatarServiceProvider extends ServiceProvider {

    public function register() {
    Log::info('initialized');
    $this->app['gravatar'] = $this->app->share(function () {
        return new Avatar();
    });
}

}

绑在一起app/config/app.php

<?php
'providers' => array(
...
'Gravatar\GravatarServiceProvider'
),
'aliases' => array(
...
'Gravatar'        => 'Gravatar\Facade'
),

笔记

请注意,我使用的命名空间采用以下目录结构:

Libraries
    Gravatar
        Avatar.php
        GravatarServiceProvider.php
        Facade.php

在这样的自动加载中composer.json

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/tests/TestCase.php"
    ],
    "psr-0": {
        "Gravatar": "app/Library" // Or wherever your Library directory is
    }
},

如果您对命名空间以及它如何与自动加载一起使用感到困惑,请阅读PSR-0

希望有帮助!

于 2013-07-09T15:06:38.227 回答