在Laravel中使用runkit扩展重写dd方法

背景

一次疏忽,忘记删除用于调试的dd代码,导致生产回滚。后发现可以使用runkit扩展,重写方法来避免上面的问题。
调试代码:

<?php
namespace App\Http\Controllers;

class IndexController extends Controller
{
    public function index()
    {
        $a = 'abc';
        //调试代码
        dd($a);
        return 'test';
    }
}

环境

php 版本:7.2.6
Laravel 版本:7.30.6

解决方案

首先安装runkit扩展,这部分可自行百度。
然后修改app/Providers/AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $env = config('app.env');
        //beta和生产环境起效
        if (in_array($env, ['beta','production'])) {
            runkit7_function_redefine('dd', function (...$args) {
                app('log')->info('使用了dd函数', $args);
                //todo 发送邮件或其他动作
            });
        }
    }
}

最后访问IndexController@index,就只返回test,且记录日志中。

替换或删除php内置函数

如果想替换比如var_dump等php内置方法,则需要在php.ini中增加配置

runkit.internal_override=1

总结

开发中需要注意调试代码是否在上线时已被删除或注释,加上用runkit进行兜底,就可以避免一些发版问题了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

不是很建议在生产环境中使用。

对于这个问题,可以考虑在 git hooks 里面,用正则匹配一下 \bdd\( 可以在一定程度上避免了

1年前 评论
milksoul (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!