我想在aliases
等laravel中创建Auth
,以便我可以在视图中使用它,就像
Auth::user()
。
例如,我想从我的设置表中返回数据,并希望像
一样使用它 Setting::method()->value
。在视图中和use Setting
在控制器中。
我应该为此Facades
或Service Providers
创建什么?给我一些程序。
我尝试使用Service Providers
,但我很困惑如何在那里调用数据库。
答案 0 :(得分:3)
使用Laravel 5.4,这将是一个很长的答案。
app/Services
文件夹:namespace App\Services;
use Illuminate\Database\DatabaseManager;
class Setting
{
protected $db;
public function __construct(DatabaseManager $db)
{
$this->db = $db;
}
public function method()
{
return;
}
}
如您所见,我将数据库注入该具体类中。这是Laravel IoC的神奇之处。它会自动解决你的具体类中的任何依赖。
app/Facades
文件夹:namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Setting extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'setting';
}
}
请注意setting
返回的getFacadeAccessor
字符串。您需要稍后将此服务名称注册到Container(IoC)。这个外观背后的魔力是,它会自动调用(代理)任何静态方法到具体类的实例方法,在这种情况下你可以调用:
Service::method()
将服务注册到容器。在AppServiceProvider
命名空间App \ Providers;
使用App \ Services \ Setting; 使用Illuminate \ Support \ ServiceProvider;
类AppServiceProvider扩展了ServiceProvider { // ...
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// ...
$this->app->singleton(Setting::class);
$this->app->alias(Setting::class, 'setting');
}
}
在此服务提供商中,我声明Setting
服务是单件服务。这意味着,您可以在其他地方使用Setting
服务而无需重新初始化类,换句话说,您在文件中使用相同的实例。最后,我告诉容器Setting
服务有另一个别名,名称setting
,因此Container可以找出App/Facade/Setting
后面的混凝土类。
config/app.php
中注册您的外观别名,找到aliases
部分并添加以下行:'aliases' => [
// ...
'Setting' => App\Facades\Setting::class,
],
在此之后,你可以像这样打电话给你的门面:
use Setting;
Setting::method();
希望这有帮助。