`

Facade 包装类 -- 解决视图里面长长的命名空间调用问题

阅读更多
有时候模版里面定义需要写很长的全路径类名,此处提供一个 简易的别名调用代码来规避此问题,缺点就是IDE 代码提示功能就没有了

<?php
/**
 * Facade 包装类
 *
 * 优点:
 * 		使用简单的方式来省掉视图里面长长的命名空间调用,诸如 YII 的模版
 * 缺点:
 * 		这么写在 IDE 中会失去代码自动提示的功能,对于 sublime 狗而言貌似不是缺点
 *
 * 使用方法:
 * 		ZGFacade::{方法名}( {facade名称}, 参数1, 参数2,...参数n )
 * 
 * <code>
 * // 初始化
 * ZGFacade::setZGFacade('form', 'Aert_Form');
 * ZGFacade::setZGFacade('esClient', '\Elasticsearch\Client');
 * 
 * // 使用demo
 * $form = ZGFacade::newInstance('form', 'frm2', 'delete');
 * dump($form);
 * 
 * echo ZGFacade::server('form', 'REQUEST_METHOD');
 * echo ZGFacade::get('form', 'a');
 * 
 * 	$dsn      = Config::get('esken.dsn');
 * 	$esClient = ZGFacade::newInstance('esClient', $dsn);
 * 	dump($esClient);
 * </code>
 * @author vb2005xu@qq.com
 */
final class ZGFacade
{
	private static $map = [
		'form'	=> 'Aert_Form'
	];

	public static function setZGFacade($alias, $class)
	{
		self::$map[ $alias ] = $class;
	}

	private static function __facade__($facade, $method, $arguments=[])
	{
		if ( is_object($facade) )
		{
			// 调用 对象方法
			return call_user_func_array( [$facade, $method], $arguments );
		}
		else if (is_string($facade))
		{
			if ( empty(self::$map[$facade]) )
			{
				throw new Exception("未定义 'facade': {$facade} ");
			}
			// 调用 静态方法
			if ( 'newInstance' == $method )
	    	{
	    		$class = new ReflectionClass( self::$map[$facade] );
	    		return $class->newInstanceArgs( $arguments );
	    	}
			$class = self::$map[$facade];
			return call_user_func_array( [$class, $method], $arguments );
		}

		throw new Exception("无效 'facade' 调用!");
	}

	public function __call($method, $arguments) 
    {
    	$facade = array_shift($arguments);
    	return self::__facade__($facade, $method, $arguments);
    }

    public static function __callStatic($method, $arguments) 
    {
    	$facade = array_shift($arguments);    	
    	return self::__facade__($facade, $method, $arguments);
    }

}

 

1
8
分享到:
评论

相关推荐

    Laravel开发-laravel-ns-api

    此外,可能还有一个门面(Facade)类,它提供了一个简化的静态调用接口,使得代码更加简洁易读。 在控制器或其他业务逻辑层,我们可以通过依赖注入来使用NS API服务。例如,如果有一个`NsApiClient`类,我们可以在...

    Laravel开发-mindbody-laravel

    当API调用失败时,它可以抛出异常或返回错误信息,帮助开发者调试和解决问题。 总之,"Laravel开发-mindbody-laravel"项目为Laravel开发者提供了一个高效且易于使用的工具,以便他们在Laravel应用中无缝集成...

    Laravel开发-php71-laravel-dompdf

    【描述】提到的"Laravel的dompdf包装"是指laravel-dompdf是Laravel的一个服务提供者和facade,它将开源的dompdf库封装起来,以便于在Laravel应用中更方便、直观地使用。通过这个包装,开发者可以利用Laravel的便利性...

    Laravel开发-laravel-stat-search-analytics

    对于`laravel-stat-search-analytics`,可能存在一个门面类,如`SearchAnalytics`,使得在代码中调用API功能变得更加简洁。 3. **模型(Models)**:Laravel模型通常与数据库表关联,用于处理数据操作。在这个项目...

    Laravel开发-daisycon

    这个 `Laravel开发-daisycon` 项目就是针对这种情况的一个解决方案,它为 Laravel 提供了一个方便的包装器,使得与 Daisycon 的 API 交互变得简单高效。 **Laravel 框架基础** Laravel 是一款基于 PHP 的开源 Web ...

    Laravel开发-laravel-pdf

    `laravel-pdf`提供了`PDF` Facade,可以便捷地调用其方法生成PDF。以下是一个简单的例子: ```php use Spatie\PDFGenerator\Facades\Pdf; // 假设我们有HTML字符串 $html = '&lt;h1&gt;Hello, World!&lt;/h1&gt;'; // 使用...

    strut+ibatis+spring环境搭建

    Spring 的 ORM 包会根据配置文件自动创建DAO对象,然后通过事务代理包装成Facade对象,提供给业务层使用。Facade对象通常作为一个服务接口的实现,对外提供无事务处理的业务方法。 8. **配置文件位置**: Spring ...

    Laravel开发-orsapi

    开发者可以通过注入服务或者使用门面(Facade)来调用ORS API的方法,例如获取路线、计算距离或时间等。服务类通常会封装HTTP请求,处理如认证、参数构造等细节,使得开发者能更专注于业务逻辑。 例如,为了获取一...

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

    J2EE核心模式

    控制器(Controller)接收用户输入并调用模型和视图完成用户的需求。 2. **Facade (外观)**:外观模式为子系统中的一组接口提供一个一致的界面,这种模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。...

    设计模式.docx

    该模式通过创建一个新的适配器类来包装原有类,实现接口间的转换。 #### 桥接模式(Bridge Pattern) 桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。这种模式适用于当一个类的行为和属性都需要...

Global site tag (gtag.js) - Google Analytics