Laravel 之道特别篇 5: 教你如何寻找 Laravel 服务中的方法
前言
相信各位在用 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 协议》,转载必须注明作者和本文链接
这样还是有些麻烦啊,另外有没有好的代码运行追踪的工具,可以查看源码运行,难道只有Xdebug吗?