laravel 基础教程 —— 假面

作者: Dearmadman | 来源:发表于2016-05-18 23:24 被阅读332次

    假面(Facades)

    简介

    假面提供了一种类似‘静态’接口的方式来从服务容器中提取可用类的方法。laravel 自身附带了许多的假面,你可能在还不知道它的时候就已经使用过它了。laravel 的假面服务就好像是一个从服务容器中取出底层类的代理(你带上我的面具,你就可以使用我的方法了),它提供了一种简洁语法的同时保持了比传统静态方法更高的可测试性和灵活性。

    使用假面

    在 laravel 中,假面是一种能够访问服务容器中对象的类。而使这项工作能够运行的就是 Facade 类。laravel 中的假面或者任何你所自定义的假面都必须要继承 Illuminate\Support\Facades\Facade 类。

    一个假面类仅仅只需要去实现一个单一的 getFacadeAccessor 方法就可以了。而 getFacadeAccessor 方法的任务就是定义需要从服务容器中返回什么对象。Facade 基类使用了 __callStatic() 魔术方法让假面来延迟访问容器中相应的对象。

    在下面的例子中,使用了 laravel 缓存系统的一个方法调用。如果只是匆匆的看一眼,你很可能会觉得这是在调用缓存类的静态方法 get:

    <?php
    
    namespace App\Http\Controllers;
    
    use Cache;
    use App\Http\Controllers\Controller;
    
    class UserController extends Controller
    {
      /**
       * Show the profile for the given user.
       *
       * @param int $id
       * @return Response
       */
       public function showProfile($id)
       {
         $user = Cache::get('user' . $id);
    
         return view('profile', ['user' => $user]);
       }
    }
    

    你应该注意到我们在文件的顶部引入的是 Cache 假面。这个假面服务相当于访问 Illuminate\Contracts\Cache\Factory 接口底层实现的代理。所有使用假面调用的方法都会在 laravel 缓存服务的底层实现进行传递调用。

    如果我们看一下 Illuminate\Support\Facades\Cache 类,你会发现这里并没有静态方法 get:

    class Cache extends Facade
    {
      /**
       * Get the registered name of the component.
       *
       * @return string
       */
       protected static function getFacadeAccessor() 
       {
         return 'cache';
       }
    }
    

    事实上,Cache 假面继承自基类 Facade 并且定义了 getFacadeAccessor() 方法。这个方法的主要任务就是从服务容器中返回所绑定名称的对象。当用户调用任何 Cache 假面的静态方法时,laravel 从服务容器中返回绑定了 cache 为名称的对象,并且使用这个对象调用所请求的方法。

    假面类参考

    在下面的表格中你会找到所有的假面及其所对应的底层实现类。这是一个可以迅速挖掘给定假面 API 的有用工具。在服务容器中所给的绑定键也包括在其中。

    Facade Class Service Container Binding
    App Illuminate\Foundation\Application app
    Artisan Illuminate\Contracts\Console\Kernel artisan
    Auth Illuminate\Auth\AuthManager auth
    Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
    Bus Illuminate\Contracts\Bus\Dispatcher
    Cache Illuminathe\Cache\Repository cache
    Config Illuminate\Config\Repository config
    Cookie Illuminate\Cookie\CookieJar cookie
    Crypt Illuminate\Encryption\Encrypter encrypter
    DB Illuminate\Database\DatabaseManager db
    DB (Instance) Illuminate\Database\Connection
    Event Illuminate\Events\Dispatcher events
    File Illuminate\Filesystem\Filesystem files
    Gate Illuminate\Contracts\Auth\Access\Gate
    Hash Illuminate\Contracts\Hashing\Hasher hash
    Lang Illuminate\Translation\Translator translator
    Log Illuminate\Log\Writer log
    Mail Illuminate\Mail\Mailer mailer
    Password Illuminate\Auth\Passwords\PasswordBroker auth.password
    Queue Illuminate\Queue\QueueManager queue
    Queue (Instance) Illuminate\Contracts\Queue\Queue queue
    Queue (Base Class) Illuminate\Queue\Queue
    Redirect Illuminate\Routing\Redirector redirect
    Redis Illuminate\Redis\Database redis
    Request Illuminate\Http\Request request
    Response Illuminate\Contracts\Routing\ResponseFactory
    Route Illuminate\Routing\Router router
    Schema Illuminate\Database\Schema\Blueprint
    Session Illuminate\Session\SessionManager session
    Session (Instance) Illuminate\Session\Store
    Storage Illuminate\Contracts\Filesystem\Factory filesystem
    URL Illuminate\Routing\UrlGenerator url
    Validator Illuminate\Validation\Factory validator
    Validator (Instance) Illuminate\Validation\Validator
    View Illuminate\View\Factory view
    View (Instance) Illuminate\View\View

    相关文章

      网友评论

      • Aloes:假面、服务容器、服务提供者等这些还在摸索中,没有理解透彻啊

      本文标题:laravel 基础教程 —— 假面

      本文链接:https://www.haomeiwen.com/subject/afnwrttx.html