alestro
@alestro

Как правильно реализовать фасад?

Суть в следующем: хочу спрятать создание объекта и вызов его функций за фасадом.
Превратить это:
$session=new Session();
$session->get('key');
в это:
Session::get('key');
На данный момент имею следующее:
namespace facades;
abstract class Facade{
	protected static $instance=[];
	public static function __callStatic($method, $args){
		$instance = static::instance();
		return call_user_func_array([$instance,$method],$args);
	}
	protected static function instance(){
		$accessor=static::accessor();
		if( !static::$instance[$accessor] instanceof $accessor ){
			static::$instance[$accessor]=new $accessor;
		}
		 return static::$instance[$accessor];
	}
	abstract protected static function accessor():string;
}

В моем случае все потомки реализуя метод accessor возвращают название класса для которого будет использован фасад.
Все работает, но возник такой вопрос. Если объекту требуется передать параметры в конструктор моя схема крашится. Ибо в данном случае подобная возможность не реализована. Так вот. Каким способом лучше всего порождать объекты в моем случае? Переложить это в потомка или в отдельный класс?
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
хочу спрятать создание объекта и вызов его функций за фасадом.


Это не фасад, это service locator, глобальный доступ к зависимостям. Не делайте так, используйте IoC, например PHP-DI. Даже в laravel потихоньку от этой сатаны отказываются.

Фасад - это когда мы берем несколько интерфейсов, и строим над ними один попроще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽