1

我想在 laravel 4“门面”上使用别名类,例如 App::method、Config::method。

那么问题是我创建了一个自定义类,我必须导入命名空间,比如

<?php

namespace Face\SocialHandlers;

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {

    public function registrar($perfil) {
        Config::get('facebook');
    }

}

有没有办法在框架的控制器或路由文件中使用这些类?

喜欢

<?php

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {

    public function registrar($perfil) {
        Config::get('facebook');
    }

}

氰酸

ps:对不起我的英语

4

5 回答 5

2

您可以使用use Config;而不是更详细use Illuminate\Support\Facades\Config;的,并且自动加载器应该正确处理它。

于 2013-10-23T18:54:09.723 回答
2

就像提示一样,您不应该在代码中硬编码依赖项"ConfigInterface"您可以创建一个来获取所需的公共依赖项,而不是使用外观。然后创建一个"LaravelConfig class" (或 Laravel4Config.php)并实现这些方法。

对于快速修复答案,“捕获底层外观实例”:

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {
    protected $config;
    protected $app;

    public function __construct()
    {
        $this->config = \Illuminate\Support\Facades\Config::getFacadeRoot();
        $this->app = \Illuminate\Support\Facades\App::getFacadeRoot();
    }

    public function registrar($perfil) {
        $this->config->get('facebook');
    }

}

对于真正的答案,可能很乏味,但从长远来看是好的,而不是使用外观使用界面。

interface SocialConfigInterface
{
    public function getConfigurationByKey($key)
}

然后

class Laravel4Config implements SocialConfigInterface
{
    protected $config;

    public function __construct()
    {
        $this->config = \Illuminate\Support\Facades\Config::getFacadeRoot(); //<-- hard coded, but as expected since it's a class to be used with Laravel 4
    }

    public function getConfigurationByKey($key)
    {
        return $this->config->get($key);
    }
}

和你的代码

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {
    protected $config;

    public function __construct(SocialConfigInterface $config)
    {
        $this->config = $config;
    }

    public function registrar($perfil) {
        $this->config->get('facebook');
    }

}

这样,如果您想在框架之间进行更改,您只需要创建一个SocialConfigInterface实现,或者想象 Laravel 5 不会使用 Facades 的场景,您希望您的代码独立于“外部更改”,这是控制 IoC 的反转

于 2014-06-13T03:15:37.350 回答
0

第一次运行,

php artisan dump-autoload

这会将您的类命名空间添加到vendor/composer/autoload_classmap.php. 现在在这个类映射数组中找到您的类的条目,并从那里获取正确的命名空间。

例如,你会得到类似的东西,

'Illuminate\\Support\\Facades\\App' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/App.php',

对于这个特定条目,您有一个别名app/config/app.php

'App'             => 'Illuminate\Support\Facades\App',

同样,找到您的条目并在app/config/app.php.

于 2013-10-23T06:12:31.903 回答
0

你只需要创建一个文件夹,或者在任何已经列出自动加载的地方放置一个类。例如,我有这个类PDFMaker,它使用 DomPDF Laravel 实现。我创建了一个名为的文件夹libraries并将其路径(在app文件夹下)autoload:classmap放在composer.json

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/libraries",
        "app/models",
        "app/helpers",
        "app/database/migrations"
    ]

commands对工匠命令做了同样的事情!当您这样做时,您只需为该文件夹下的任何类声明一个新对象,或者如果该类已定义静态方法,则以静态方式调用它。类似的东西Class::method

希望对你有帮助,祝你有个愉快的一天!:D

编辑:之后,不要忘记dump-autoload将新类放在自动加载范围内。

编辑 2:请记住,一旦您将类置于自动加载状态,它将与其他类在同一范围内,因此您不必将其导入到其他类,也不必将其他类导入它!

于 2013-10-23T13:43:53.390 回答
0

您还可以在类名前加上反斜杠,以使用全局命名空间:\Config::get('facebook')并且\App::someMethod()无需添加use语句即可工作,无论文件的命名空间如何。

于 2014-03-18T22:24:44.690 回答