1. In PHP 7.4, an error occurs: header() expects at least 1 parameter, 0 given. As shown in Figure 1.

{
"errors": [
{
"debugMessage": "header() expects at least 1 parameter, 0 given",
"message": "Internal server error",
"extensions": {
"category": "internal"
},
"locations": [
{
"line": 5,
"column": 7
}
],
"path": [
"onlineStoreSession",
"versionedOnlineStore",
"theme"
],
"trace": [
{
"file": "E:\\wwwroot\\object\\Modules\\OnlineStoreThemeGraphQl\\Resolver\\OnlineStoreThemeResolver.php",
"line": 96,
"function": "header()"
},
{
"call": "Modules\\OnlineStoreThemeGraphQl\\Resolver\\OnlineStoreThemeResolver::Modules\\OnlineStoreThemeGraphQl\\Resolver\\{closure}(array(4), 'name')"
}
]
}
],
"data": {
"onlineStoreSession": {
"versionedOnlineStore": {
"theme": null
}
}
}
}
2. Review the specific code implementation.
$fields = array_keys($resolveInfo->getFieldSelection());
return array_reduce($fields, function($carry, $field) use($fieldResolvers){
if (isset($fieldResolvers[$field])) {
$carry[$field] = is_callable($fieldResolvers[$field])? $fieldResolvers[$field](): $fieldResolvers[$field];
}
return $carry;
}, []);
3. Print $fields, the result is as follows.
$fields = array_keys($resolveInfo->getFieldSelection());
print_r($fields);
exit;
Array
(
[0] => id
[1] => editable
[2] => createdAt
[3] => editedAt
[4] => name
[5] => role
[6] => previewable
[7] => url
[8] => themeStoreThemeId
[9] => metadata
[10] => presets
[11] => themeSettingsCategories
)
4. Add a condition: when $field equals name, print $fieldResolvers[$field] and is_callable($fieldResolvers[$field]).
$fields = array_keys($resolveInfo->getFieldSelection());
return array_reduce($fields, function($carry, $field) use($fieldResolvers){
if (isset($fieldResolvers[$field])) {
if ($field == 'name') {
var_dump($fieldResolvers[$field]);
var_dump(is_callable($fieldResolvers[$field]));
exit;
}
$carry[$field] = is_callable($fieldResolvers[$field])? $fieldResolvers[$field](): $fieldResolvers[$field];
}
return $carry;
}, []);
string(6) "Header"
bool(true)
5. is_callable — verifies whether a value can be called as a function from the current scope. is_callable(‘Header’) returns true, which triggers the native header() function — Send a raw HTTP header — and since its parameters are required, an error is thrown. instanceof is used to determine whether a PHP variable is an instantiated object of a certain class. Closure is the class used to represent anonymous functions. After changing the check to $fieldResolvers[$field] instanceof \Closure, the error no longer occurs.
$fields = array_keys($resolveInfo->getFieldSelection());
return array_reduce($fields, function($carry, $field) use($fieldResolvers){
if (isset($fieldResolvers[$field])) {
$carry[$field] = ($fieldResolvers[$field] instanceof \Closure) ? $fieldResolvers[$field](): $fieldResolvers[$field];
}
return $carry;
}, []);
