在Laravel 4中,如何创建模型实例并使其全局可用?甚至在观点中。我正在寻找类似于使用Auth :: User-> name获取User实例的方式(我的意思是语法,不存储在会话中)但在这种情况下它将是ModelName :: DefaultEntity-&gt ;属性
更详细一点......
我正在编写一个包含多个网站的应用程序 - 有点像CMS。所以我有一个网站模型。每个网站模型都具有URL属性,以便当用户访问URL时,应用程序可以从数据库中检索网站模型并对网站进行适当的标记,例如标题,标志,主题等......
我希望当前的网站模型随处可用,而无需在每个控制器/方法中创建新的网站实例。所以在我的布局和视图中,我可以这样说:
{{ Website::Website()->name }}
或
{{ CurrentWebsite::name }}
我通过在网站模型中创建静态方法实现了第一个方法:
public static function current()
{
return Website::find(1); // just to test it for now
}
但是,每当我说:
时,它将不得不进行数据库查询{{ Website::current()->name }}
另外,感觉不对。
有人可以帮忙吗?
亲切的问候,
罗宾
答案 0 :(得分:2)
您可能正在寻找'共享容器绑定'。请参阅docs here。
<?php
App::singleton('foo', function()
{
return Website::whereCode('whoop')->first();
});
App::make('foo'); // every where you need it
答案 1 :(得分:0)
创建普通类。喜欢当前网站或网站或其他。
class Website {
public function a() {
//your code
}
}
创建外观(WebsiteFacade.php)
use Illuminate\Support\Facades\Facade;
class WebsiteFacade extends Facade {
protected static function getFacadeAccessor() { return 'website'; }
}
创建服务提供商
use Illuminate\Support\ServiceProvider;
class WebsiteServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('website', function()
{
return new Website();
});
}
}
4.转到config / app.php并添加以下内容:
'providers' => array(
'WebsiteServiceProvider'
)
和
'aliases' => array(
'WebsiteFacade'
)
5.Refrech自动装载机。现在您可以在任何地方访问网站类:
Website::a();
答案 2 :(得分:0)
你已经拥有的是好的,但如果你只想阻止每次执行查询,你可以缓存它:
public static function current()
{
return Website::remember(10)->find(1); // just to test it for now
}
为routes.php添加一个监听器:
DB::listen(function($sql, $bindings, $time) { var_dump($sql); var_dump($bindings); });
执行它:
{{ Website::current()->name }}
将在第一次执行时显示查询,但在第二次执行时不显示,因为它已缓存。