修改资源时无法将ServerBag转换为字符串

时间:2019-04-17 21:12:37

标签: php laravel

我不太了解为什么会发生这种情况,但是它告诉我ServerBag无法转换为字符,我不太了解ServerBag是什么以及为什么会发生此错误。

错误:

enter image description here

... \ vendor \ laravel \ framework \ src \ Illuminate \ Support \ Str.php354

enter image description here

相关代码(功能更新):

   $request->validate([
         'username' => 'required|string|max:50',
         'password' => 'required|string|max:50',
         'port' => 'max:5',
         'server' => 'string|nullable|max:50',
         'hostname' => 'string|nullable|max:100',
         'ipvmware' => 'string|nullable|ipv4',
         'obs' => 'string|nullable|max:500',
    ]);

    $host = Host::find($id);
    $host->username = $request->username;
    $host->password = $request->password;

    if($request->input('port')){
        $host->port = $request->port;
    }
    if($request->input('server')){
        $host->server = $request->server;
    }
    if($request->input('hostname')){
        $host->hostname = $request->hostname;
    }
    if($request->input('ipvmware')){
        $host->ipvmware = $request->ipvmware;
    }
    if($request->input('obs')){
        $host->obs = $request->obs;
    }

    $host->estado = 1;
    $host->save();

如果删除以下几行,该代码将起作用。

   $request->validate([
        'username' => 'required|string|max:50',
        'password' => 'required|string|max:50',
        'port' => 'max:5',
        'server' => 'string|nullable|max:50',
        'hostname' => 'string|nullable|max:100',
        'ipvmware' => 'string|nullable|ipv4',
        'obs' => 'string|nullable|max:500',
    ]);

    $host = Host::find($id);
    $host->username = $request->username;
    $host->password = $request->password;


    $host->estado = 1;
    $host->save();

dd($ request-> all()):

enter image description here

1 个答案:

答案 0 :(得分:1)

问题出在您的“如果”情况下。

解决方案

if ($request->input('port')) // <----
{
    $host->port = $request->port;
}

尝试以下方法:

if ($request->has('port')) // <----
{
    $host->port = $request->port;
}

更新

您应该首先检查请求中是否存在所需的输入。从文档中:

  

确定是否存在输入值

     

您应该使用has方法来确定是否存在值   请求。如果值出现在has方法中,则返回true   请求:

if ($request->has('name')) {
    //
}

然后您应该获得输入。

现在,与方法有关:

$request->has()

进行$request->has(...)时,您正在检查请求是否包含给定的输入项键(或多个键)。该方法就是这样做的:

# trait InteractsWithInput.php

/**
 * Determine if the request contains a given input item key.
 *
 * @param  string|array  $key
 * @return bool
 */
public function has($key)
{
    $keys = is_array($key) ? $key : func_get_args();

    $input = $this->all();

    foreach ($keys as $value) {
        if (! Arr::has($input, $value)) {
            return false;
        }
    }

    return true;
}

如您所见,它只是返回一个布尔值。

$request->input(...)

执行$request->input(...)时,您尝试从请求中获取输入:

# trait InteractsWithInput.php

/**
 * Retrieve an input item from the request.
 *
 * @param  string|null  $key
 * @param  string|array|null  $default
 * @return string|array|null
 */
public function input($key = null, $default = null)
{
    return data_get(
        $this->getInputSource()->all() + $this->query->all(), $key, $default
    );
}

此方法的作用是功能更强大,因为它可以使用点表示法(而不是$request->get()来获取嵌套数据)。检查this article了解更多详细信息。

这将返回stringarraynull

现在这是错误所在的位置(您可以检查是否在错误跟踪中)。似乎此方法试图将给定对象视为字符串,以解决if语句(我真的不知道,因为没有访问权限,请完整了解错误详细信息)。

因此,首先,检查请求是否具有特定属性,然后检索输入以执行所需的操作。