Laravel 之道特別篇 5: 教你如何尋找 Laravel 服務中的方法

yuanshang發表於2019-01-27

前言

相信各位在用 Laravel 開發專案時,總會有需要 Ctrl + 滑鼠左鍵 檢視一個方法的具體詳情時候。

由於 Laravel 的單詞標識機制(或者稱為門面機制),導致 PhpStorm 無法正確跳轉到具體方法,有時總是跳轉到 方法所在類的介面類或抽象類中。

那麼我們應該如何找到這個方法所在正確類(服務)呢?

關鍵還是所跳轉的介面類或抽象類

舉個例子

我們就以 App\Http\Kernel 類中宣告的 web 中介軟體組中的 App\Http\Middleware\EncryptCookies 的例項化為例進行講解。

file

App\Http\Middleware\EncryptCookies

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

我們跳轉到父類 Illuminate\Cookie\Middleware\EncryptCookies 的構造方法中

file

如下程式碼:

Illuminate\Cookie\Middleware\EncryptCookies

file

會跳轉到 Illuminate\Contracts\Encryption\Encrypter 介面類

file

這樣就造成,我們無法檢視 decrypt 方法真正內容。為什麼會跳轉到這個介面類呢?

原因還是在建構函式上

<?php

namespace Illuminate\Cookie\Middleware;

// ... 省略若干程式碼
use Illuminate\Contracts\Encryption\Encrypter as EncrypterContract;

// ... 省略若干程式碼

public function __construct(EncrypterContract $encrypter)
{
    $this->encrypter = $encrypter;
}

// ... 省略若干程式碼

protected function decryptCookie($name, $cookie)
{
    return is_array($cookie)
                    ? $this->decryptArray($cookie)
                    : $this->encrypter->decrypt($cookie, static::serialized($name));
}

看到沒 decrypt 方法是 encrypter 屬性上呼叫的,而 encrypter 屬性從構造方法上被賦值,且賦的值必須是 Illuminate\Contracts\Encryption\Encrypter 例項或者是它的實現類的例項。由於不是透過實現類進行型別約束的,那它的實現類到底是誰?

尋找 Illuminate\Contracts\Encryption\Encrypter 介面的實現類

如何尋找呢?

  • 第一步,我們到 Laravel 服務容器 Application 中尋找 Illuminate\Contracts\Encryption\Encrypter 類名指向的門面單詞標識

    file

    file

    找到了單詞標識是 encrypter

  • 第二步,到 app.php 配置檔案中,尋找與 encrypter 有關的服務提供者類

    file

  • 第三步,進入服務提供者中(Ctrl + 滑鼠左鍵),尋找 register 方法

    file

    file

相關文章

關於 EncryptCookies 路由中介軟體實現作用,歡迎移步到 Laravel 之道有關內容 ---> 傳送門

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我們是一群被時空壓迫的孩子。 ---- 愛因斯坦

相關文章