Laravel 4自定义类中的别名

时间:2013-10-23 05:45:30

标签: laravel laravel-4

我想在laravel 4“facades”上使用alias类,比如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:sry for my english

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

对于快速修复答案,&#34;抓住底层门面实例&#34;:

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不会使用Facade的场景,你希望你的代码独立于&#34; outsider变化&#34;这是控制IoC的反转

答案 2 :(得分:0)

首先运行,

php artisan dump-autoload

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

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

'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中使用别名。

答案 3 :(得分:0)

您只需要创建一个文件夹,或者在已经为autoload列出的位置放置一个类。例如,我有这个类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:请记住,一旦你把课程放在自动加载上,它就会与其他人在同一范围内,所以你不必将它导入其他人,也不必将其导入其他人!

答案 4 :(得分:0)

您还可以使用反斜杠为类名添加前缀,以使用全局命名空间:\Config::get('facebook')\App::someMethod()无需添加use语句即可运行,无论文件& #39; s命名空间。