我遇到的问题似乎暗示我不了解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()
时会发生这种情况?如果我发表评论,那就完美了。
答案 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);
}
}
}