PHP 全局使用 Laravel 辅助函数 dd (补充:docker 环境下全局使用)
上次发布过一篇文章,在其他框架中使用 dump () & dd () 函数,但是那样的方式存在一个弊端。即 @JokerLinly 在PHP 全局使用 Laravel 辅助函数 dd所描述的,如果不是 Laravel 项目,那么每个项目想要用上该函数,都要进行配置。会生成团队中并不允许只有你自己使用的调试代码及其所需要的组件依赖。
当看到 PHP 全局使用 Laravel 辅助函数 dd 时,瞬间看到了希望,但立刻又心灰意冷了。因为环境问题。我使用的开发环境是 win + docker ,这也导致,我在 win 上全局安装 symfony/var-dumper ,docker 内部无法直接读取。所以需要做一些改变。
注:我使用的环境是 Win 10 + laradock
开始折腾
全局安装
在 Win 执行 composer global require symfony/var-dumper
配置 php.ini
-
在 宿主机(你的windows)找到目录
laradock\php-fpm 我的是在 C:\Users\xxx\Code\laradock\php-fpm -
添加一个 配置文件 var-dump.ini,内容如下:
auto_prepend_file = /var/www/.composer/vendor/autoload.php
-
修改你当前 php-fpm 使用的 Dockerfile,我的是 Dockerfile-71,你修改对应的即可
将如下内容添加在CMD ["php-fpm"]
该行之前。大概在文件结尾处(底部)ADD ./var-dump.ini /usr/local/etc/php/conf.d
-
修改 laradock\docker-compose.yml 为 php-fpm 容器 添加一行目录映射关系
添加的内容为- /C/Users/baby/AppData/Roaming/Composer:/var/www/.composer
修改后内容大概如下:
version: '2' services: ... php-fpm: volumes: ... - /C/Users/baby/AppData/Roaming/Composer:/var/www/.composer ...
-
关于 php.ini 所需要的东西我们已经修改完成,接下来回到 laradock 目录,重新构建 php-fpm 容器。
docker-compose build php-fpm
-
构建完成后,重启 php-fpm 容器,让它使用新构建的 php-fpm 容器,并读取 docker-compose.yml 的改变。
更新 composer: composer global update
此时,我们的项目已经可以使用 dump 了。但是还不能使用 dd,我们再来做些修改。
准备 dd()
在目录 C:\Users\baby\AppData\Roaming\Composer 中添加名为 laravel_helper.php 的文件
内容如下
<?php
# install symfony/var-dump to your project
# composer require symfony/var-dumper
// use namespace
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper as SymfonyHtmlDumper;
/**
* Class HtmlDumper
*/
class HtmlDumper extends SymfonyHtmlDumper
{
/**
* Colour definitions for output.
*
* @var array
*/
protected $styles = [
'default' => 'background-color:#fff; color:#222; line-height:1.2em; font-weight:normal; font:12px Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:100000',
'num' => 'color:#a71d5d',
'const' => 'color:#795da3',
'str' => 'color:#df5000',
'cchr' => 'color:#222',
'note' => 'color:#a71d5d',
'ref' => 'color:#a0a0a0',
'public' => 'color:#795da3',
'protected' => 'color:#795da3',
'private' => 'color:#795da3',
'meta' => 'color:#b729d9',
'key' => 'color:#df5000',
'index' => 'color:#a71d5d',
];
}
/**
* Class Dumper
*/
class Dumper
{
/**
* Dump a value with elegance.
*
* @param mixed $value
* @return void
*/
public function dump($value)
{
if (class_exists(CliDumper::class)) {
$dumper = 'cli' === PHP_SAPI ? new CliDumper : new HtmlDumper;
$dumper->dump((new VarCloner)->cloneVar($value));
} else {
var_dump($value);
}
}
}
if (! function_exists('dd')) {
/**
* Dump the passed variables and end the script.
*
* @param mixed
* @return void
*/
function dd(...$args)
{
foreach ($args as $x) {
(new Dumper)->dump($x);
}
die(1);
}
}
if (! function_exists('dda')) {
/**
* Dump the passed array variables and end the script.
*
* @param mixed
* @return void
*/
function dda(...$args)
{
foreach ($args as $x) {
(new Dumper)->dump($x->toArray());
}
die(1);
}
}
更改全局 composer.json
编辑 C:\Users\baby\AppData\Roaming\Composer\composer.json 文件,
我们添加如下内容:
,
"autoload": {
"files": [
"laravel_helper.php"
]
}
修改完成后文件内容大概长这样
{
....
"require": {
.....
"symfony/var-dumper": "^3.3"
},
"autoload": {
"files": [
"laravel_helper.php"
]
}
}
最后更新一下,就可以将 dd 用起来了 :composer global dump-autoload
Leo 大神的提醒:
symfony/var-dumper 这个扩展包只有一个依赖,但是如果哪天这个 polyfill-mbstring 升级到了2+,然后你的项目里依赖了 2+ 的 polyfill,而 var-dumper 没有跟上,可能就会造成问题。这种时候,记得把全局的更新一下就好了。
@JokerLinly 有点小抱歉除了关于 docker 修改的部分在此文中,我把 PHP 全局使用 Laravel 辅助函数 dd 的内容大半给摘过来了。因为怕读者在文章之间跳来跳去不知道是个什么鬼(不知道自己执行到哪一步,接下来要执行哪一步)。
与文无关小记录:
本地使用 docker 环境,项目之间互相访问需要在 php-fpm 容器中配置 extra_host 字段。将互访的域名配置在这。例如:
我本地有 2 个项目,一个项目的是 bdwm.app,另一个项目是 example.app ,然后 bdwm 需要请求 example ,获取用户信息。那么需要做如下配置:
php-fpm:
extra_hosts:
- "example.app:172.20.0.1"
反之,example.app 需要请求 bdwm.app ,获取评论信息,也是在此添加对应的配置:
php-fpm:
extra_hosts:
- "example.app:172.20.0.1"
- "bdwm.app:172.20.0.1"
172.20.0.1 的来历
进入 workspace 容器,输入 ip addr
,如果没有改命令,那么输入 ifconfig ,查看响应内容即可。
你会看到如下信息
所以容器内部通信的网关是 172.20.0.1,你的可能和我不一样,只要对应即可。
切记:修改后需要执行 docker-compose up -d php-fpm
,让 php-fpm 容器重新读取 docker-compose.yml 的改变。
然后你的项目中,他们就可以互相请求访问了。
本作品采用《CC 协议》,转载必须注明作者和本文链接