Laravel应用程序架构问题。在Controller&amp ;;之间调用模型视图?

时间:2014-10-17 22:31:44

标签: php laravel eloquent file-get-contents

我遇到的问题似乎暗示我不了解Laravel中的架构是如何正常工作的。我是Laravel的新手,但我以为我知道这一点。当客户端请求页面时,将调用Controller,该Controller从Model中提取数据并将其传递给视图。如果前面的语句是正确的,那么为什么会出现这个问题:

在我的JourneyController

public function journey($id) {

    // Find the journey and the images that are part of the journey from the db
    $journey = Journey::find($id);
    $imagesInJourney = Journey::find($id)->images->keyBy('id');

    // Perform some manipulation on the article. THE ERROR OCCURS HERE. 
    $journey->article = str_replace('[[ ' . $image . ' ]]', $html, $journey->article);

    return View::make('journey', array(
        'journey' => $journey,
        'title' => $journey->name,
        'bodyClass' => 'article'
    ));
}

调用此控制器,并从我的Journey模型中提取数据(如下)。特别是,我有一个属性,我称之为article,我在发送给我的控制器之前正在操作:

class Journey extends Eloquent {

    protected $table = 'journeys';
    protected $primaryKey = 'id';
    public $timestamps = false;

    // Database relationship
    public function images() {
        return $this->hasMany('Image');
    }

    // THIS IS THE PROBLEMATIC METHOD
    public function getArticleAttribute($value) {
        return file_get_contents($value);
    }

}

正如您所看到的,我正在编辑article字段,该字段只是文件的链接,并使用PHP file_get_contents()将其替换为实际文件内容功能。所以我的理解是,当它返回到上面的控制器时,$journey->article将包含文章本身,而不是的网址

然而,出于某种原因,我在我的控制器中使用图像替换部分文章文本的声明导致了问题:

 $journey->article = str_replace('[[ ' . $image . ' ]]', $html, $journey->article);

在我journey.blade.php的视图中,我尝试输出$journey->article,期望它是添加了图片的文章文字,但我收到错误:

ErrorException (E_UNKNOWN) file_get_contents(*entire article content here*): failed to open stream:     Invalid argument (View: app/views/journey.blade.php)

为什么在我尝试拨打str_replace()时会发生这种情况?如果我发表评论,那就完美了。

1 个答案:

答案 0 :(得分:2)

因为每当你第一次获得/ echo这个属性时你的getArticleAttribute方法被调用没有问题(这是str_replace函数执行的地方)但是当你再次尝试获取article属性时(这就是你的位置)在视图页面中回显)您已经更改了属性的值,因此您的函数会尝试再次执行file_get_contents。

解决方案是在旅程类中有一个标志,并在执行file_get_contents时将其设置为true,并为其他调用返回属性本身。

像;

class Journey extends Eloquent {

    protected $table = 'journeys';
    protected $primaryKey = 'id';
    public $timestamps = false;
    private $article_updated = false;

    // Database relationship
    public function images() {
        return $this->hasMany('Image');
    }

    // THIS IS THE PROBLEMATIC METHOD
    public function getArticleAttribute($value) {
        if($this->article_updated){
            return $value;
        }
        else {
            $this->article_updated = true;
            return file_get_contents($value);
        }

    }

}