我想在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
答案 0 :(得分:3)
您可以使用use Config;
代替更详细的use Illuminate\Support\Facades\Config;
,自动加载器应该正确处理它。
答案 1 :(得分: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不会使用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命名空间。