2016-10-28 4 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(); 
    }); 
} 

есть ли что-то еще мне нужно сделать, чтобы сделать это так, каждый фасад вызов «Custom» возвращает новый экземпляр класса ?

+1

Это не то, как работают фасады Ларавеля. Фасады представляют собой синтаксический сахар, который позволяет вам получать доступ к общедоступным методам одного экземпляра посредством статического доступа. Рассмотрите возможность использования метода общедоступного фабрики в базовом классе (или, еще лучше, фактического класса Factory), или используйте Dependency Injection для достижения того, что вы ищете. – 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