2016-10-28 33 views
1

工作在我的第一laravel包,运行与我的门面是如何工作的麻烦,目前我使用看起来是这样的:Laravel自定义外观新实例

{!! Custom::showValue() !}} //returns "default" 

{!! Custom::setValue('test')->showValue() !}} //returns "test" 

{!! Custom::showValue() !}} //returns "test" 

我希望最后一个元素去是一个新的类实例,因为我已经设置了我的服务提供商时所使用的绑定,而不是单例:

public function register() 
    { 
     $this->registerCustom(); 
    } 

public function registerCustom(){ 
    $this->app->bind('custom',function() { 
     return new Custom(); 
    }); 
} 

有没有别的东西,我需要做的,做起来很每一门面调用“自定义”返回一个新的类实例?

+1

这不是Laravel的Facades的工作方式。 Facades是语法糖,允许您通过静态访问访问单个实例的公共方法。考虑在基础类(或者更好的是一个实际的Factory类)上暴露一个公共工厂方法,或者使用依赖注入来实现你正在寻找的东西。 – maiorano84

回答

2

作为@ maiorano84提到你不能用Facades开箱即可。

要回答你的问题,让你的Custom门面返回一个新实例,您可以添加下面的方法吧:

/** 
* Resolve a new instance for the facade 
* 
* @return mixed 
*/ 
public static function refresh() 
{ 
    static::clearResolvedInstance(static::getFacadeAccessor()); 

    return static::getFacadeRoot(); 
} 

然后,你可以拨打:

Custom::refresh()->showValue(); 

(很明显,你如果你想要的话可​​以拨打refresh别的东西)

一个替代方案是使用全局的app()函数与Laravel一起解决一个新实例,即

app('custom')->showValue(); 

希望这有助于!

+0

感谢罗斯,因为我的课是处理URL的,所以我最终做了同样的事情,总是以url()方法开始,只是创建一个新的$ class = new static;然后从中跑步。尽管getFacadeRoot看起来更好 – kilrizzy