<?php
App::make('some_service')->methodName();前面已经提过,Laravel 使用 facade 类的好处是让开发者使用服务时更加便捷。使用 facade 类之后,下面的代码就能达到相同的效果:// ...
someService::methodName();
// ...在 Laravel 中,所有服务都包含一个 facade 类。这些 facade 类继承自 Illuminate/Support 包中的 Facade 基类。它们只需实现 getFacadeAccessor 方法即可,后者会返回容器内的服务名。<?php
// ...
/**
* Handle dynamic, static calls to the object.
*
* @param string $method
* @param array $args
* @return mixed
*/
public static function __callStatic($method, $args)
{
$instance = static::getFacadeRoot();
switch (count($args)) {
case 0:
return $instance->$method();
case 1:
return $instance->$method($args[0]);
case 2:
return $instance->$method($args[0], $args[1]);
case 3:
return $instance->$method($args[0], $args[1], $args[2]);
case 4:
return $instance->$method($args[0], $args[1], $args[2], $args[3]);
default:
return call_user_func_array([$instance, $method], $args);
}
}在上面的方法中,getFacadeRoot() 会从容器获取服务。<?php namespace App\Facades;
use Illuminate\Support\Facades\Facade as BaseFacade;
class SomeServiceFacade extends BaseFacade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'some.service'; }
}别名use App\Facades\SomeServiceFacade
SomeServiceFacade:SomeMethod();然而,在需要某个特定的 facade 类时,我们必须在每个脚本文件都写一遍上面的代码。Laravel 在处理 facade 别名时有其独特的方法——别名载入器(alias loader)。// ..
'aliases' => [
// ...
'FancyName' => 'App\Facades\SomeServiceFacade',
],现在,让我们看看 Laravel 如何使用该数组给 facade 类取别名。在引导阶段,Laravel 会使用来自 Illuminate\Foundation 包的 AliasLoader 服务。AliasLoader 以该别名数组为参数,遍历其所有元素,使用 PHP 的 spl_autoload_register 创建一个 __autoload 函数队列。各个 __autoload 函数会用 PHP 的 class_alias 函数为各个 facade 类创建别名。<?php
// FancyName is resolved to App\Facades\SomeServiceFacade according to the aliases array
FancyName::someMethod()在幕后,FancyName 会对应至 App\Facades\SomeServiceFacade。<?php
$app['some.service']->someMethod()有了 facade 类,我们可以为 Silex 服务提供一个类似静态的接口。此外,我们也可以使用 AliasLoader 服务为这些 facades 创建有意义的别名。因此,我们可以重组上面的代码:<?php
SomeService::someMethod();必备条件<?php
namespace App\Facades
use Illuminate\Support\Facades\Facade;
class SomeServiceFacade extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'some.service'; }
}请注意,此类位于 app\facades 命名空间下。<?php
Illumiante\Support\Facade::setFacadeApplication($app);这会给继承自 facade 基类的所有 facades 设定容器。<?php
return [
'FancyName' => 'App\Facades\SomeService',
];FancyName 是我们给 App\Facades\SomeService 建立的别名。<?php
// ...
$aliases = require __DIR__ . '/../../config/aliases.php';
App\Facades\AliasLoader::getInstance($aliases)->register();现在,大功告成了!我们可以这样使用该服务:<?php
FancyName::methodName();进行包装ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。