setAttribute的问题

//文章模型里的一个方法
public function setContentRawAttribute($contentRaw)
    {
        $this->attributes['content_html'] = (new \Parsedown())->parse($contentRaw);
    }

问题:我更新的时候表单传入的是content_raw,也会走这个方法,但是此时$this->attributes['content_raw']为空,导致content_raw没法更新(但是content_html能更新),注释掉这个方法就能更新content_raw

我目前的解决办法:

public function setContentRawAttribute($contentRaw)
    {
        $this->attributes['content_html'] = (new \Parsedown())->parse($contentRaw);
        $this->attributes['content_raw'] = $contentRaw;
    }

这样老是感觉那里不对,因为我Request里是有content_raw的,根本不需要我再次赋值才对(难道setAttribute对这个做了处理?)。

JellyBool

你试试这样?改一下你的setAttribute方法:

public function setContentHtmlAttribute($content)
    {
        $this->attributes['content_html'] = (new \Parsedown())->parse($content);
    }

不知道满足你的要求不?

Admin

@JellyBool 我是有content_rawcontent_html两个字段,一个存markdown的内容,一个存解析过后的内容,你这个写法,$content就是content_html啊,貌似没意义。。。

JellyBool

那你这样试试吧:

public function setContentHtmlAttribute($value)
{
 $this->attributes['content_html'] = (new \Parsedown())->parse($this->content_raw);
}

多说一句:貌似我跟你理解的setAttribute用法好像有区别,比如你的setContentRawAttribute这个方法,我觉得应该是这样开始的:

public function setContentRawAttribute($value)
    {
        $this->attributes['content_raw'] = (new \Parsedown())->parse($value);
    }

虽然说实际业务逻辑上这样可能有点奇怪,但是个人的理解是setContentRawAttribute的方法体就应该是操作$this->attributes['content_raw']。然后我觉得这一次你使用本评论的最开始的方式就应该满足你的需求了。