前言
相信各位在用 Laravel 開發專案時,總會有需要 Ctrl + 滑鼠左鍵
檢視一個方法的具體詳情時候。
由於 Laravel 的單詞標識機制(或者稱為門面機制),導致 PhpStorm 無法正確跳轉到具體方法,有時總是跳轉到 方法所在類的介面類或抽象類中。
那麼我們應該如何找到這個方法所在正確類(服務)呢?
關鍵還是所跳轉的介面類或抽象類
舉個例子
我們就以 App\Http\Kernel
類中宣告的 web 中介軟體組中的 App\Http\Middleware\EncryptCookies
的例項化為例進行講解。
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
的構造方法中
如下程式碼:
Illuminate\Cookie\Middleware\EncryptCookies
會跳轉到 Illuminate\Contracts\Encryption\Encrypter
介面類
這樣就造成,我們無法檢視 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
類名指向的門面單詞標識找到了單詞標識是
encrypter
-
第二步,到 app.php 配置檔案中,尋找與
encrypter
有關的服務提供者類 -
第三步,進入服務提供者中(Ctrl + 滑鼠左鍵),尋找 register 方法
相關文章
關於 EncryptCookies 路由中介軟體實現作用,歡迎移步到 Laravel 之道有關內容 ---> 傳送門
本作品採用《CC 協議》,轉載必須註明作者和本文連結