Laravel中如何将配置常量用作函数参数的默认值
问题原因
你遇到的报错是PHP本身的语法限制:函数参数的默认值必须是编译阶段就能确定的常量表达式,不允许使用运行时才会执行的函数调用(包括Laravel的config()助手函数),所以直接把config('app.user_images_dir')写在参数默认值位置就会抛出Constant expression contains invalid operations错误。
解决方案
方案1:参数默认值设为null,函数内部赋值(兼容性最好,全PHP版本支持)
将需要动态获取配置的参数默认值设为null,在函数逻辑最开头判断如果参数为null,就调用config()赋值,写法如下:
function make_avatar($character, $storepath = null, $extension = 'png') { // 未传$storepath参数时取配置值 if (is_null($storepath)) { $storepath = config('app.user_images_dir'); } $fontPath = config('app.fonts_dir') . 'arial.ttf'; $image_name = time() . '.' . $extension; $path = $storepath . $image_name; $image = imagecreate(200, 200); $red = rand(0, 255); $green = rand(0, 255); $blue = rand(0, 255); imagecolorallocate($image, $red, $green, $blue); $textcolor = imagecolorallocate($image, 255,255,255); imagettftext($image, 100, 0, 55, 150, $textcolor, $fontPath, $character); imagepng($image, $path); imagedestroy($image); return $image_name; }
这种写法和原常量用法效果完全一致:传了$storepath参数就用传入的值,没传就用配置里的默认值。
方案2:直接定义全局常量(迁移项目最省心,旧代码几乎不用改)
如果你不想修改大量原有函数的参数逻辑,可以直接在Laravel中注册全局常量,和旧项目用法完全一致:
- 在
bootstrap目录下新建constants.php文件,写入你的常量定义:
<?php define('USER_IMAGES_DIR', config('app.user_images_dir')); define("POST_IMAGES_DIR", config('app.post_images_dir')); define("FONTS_DIR", config('app.fonts_dir'));
- 引入常量文件,二选一即可:
- 方式1:打开
bootstrap/app.php,在文件最开头加入引入代码
require __DIR__.'/constants.php';- 方式2:在
composer.json的autoload节点下添加文件路径,之后执行composer dump-autoload生效
"autoload": { "files": [ "bootstrap/constants.php" ] } - 方式1:打开
配置完成后你原来的函数写法完全不用改,直接用常量当参数默认值即可,和旧项目使用体验完全一致。
内容的提问来源于stack exchange,提问作者Prakhar Gyawali
相关产品推荐
相关产品推荐

