我正在尝试将How to get the id of youtube videos in laravel中的代码片段添加到我的控制器中。
错误:
间接修改重载属性App\Gallery::$link无效
GalleryController:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Gallery;
class GalleryController extends Controller
{
//
public function galleryAll()
{
$gallery = Gallery::orderBy('date', 'desc')
->get()
->map(function ($gallery) {
$gallery->link = parse_str( parse_url( $gallery->link, PHP_URL_QUERY ), $gallery->link );
return view('gallery', ['gallery' => $gallery]);
});
}
}
我不确定如何将其保存到$gallery-link。我计划在视图中做一个@foreach,我希望所有的$gallery-link都被修改为只包含youtube视频代码。
更新:
控制器
class GalleryController extends Controller
{
//
public function galleryAll()
{
return Gallery::orderBy('date', 'desc')
->get()
->map(function ($gallery) {
return view('gallery', ['gallery' => $gallery]);
});
}
}
{},{}
使用
$gallery = Gallery::orderBy('date', 'desc')
给了我一张空白页。
发布于 2018-06-19 21:47:57
返回视图应该是控制器方法的最后一部分。
map()
基本上获取集合,循环遍历它,并允许您编辑循环的每次迭代(集合中的每个项),在本例中,它将是Gallery
模型的一个实例。因此,您在代码中实际要做的是将每个Gallery
实例替换为Illuminate\View\View
的一个实例,然后返回该实例的集合。
至于“间接修改重载属性”错误,请看一下:Indirect Modification of Overloaded Property Laravel MongoDB
为此,我建议使用Accessor。在Gallery模型中添加以下内容:
public function getYoutubeIdAttribute()
{
parse_str( parse_url( $this->link, PHP_URL_QUERY ), $query);
return $query['v'];
}
那么你的控制器就会是这样的:
public function galleryAll()
{
$gallery = Gallery::orderBy('date', 'desc')->get();
return view('gallery', compact('gallery'));
}
最后,在您的视图中,可以简单地访问youtube_id
,如下所示:
@foreach($gallery as $g)
{{ $g->youtube_link }}
@endforeach
发布于 2018-06-19 16:01:39
您不能使用:$can>link= parse_str($str,$can>link)
parse_str($str, $output);//output array
because $gallery->link is string
you see:http://php.net/manual/en/function.parse-str.php
https://stackoverflow.com/questions/50932344
复制