【问题标题】:Cannot access protected property - Laravel 5.7 - Docker无法访问受保护的属性 - Laravel 5.7 - Docker
【发布时间】:2018-09-12 21:46:31
【问题描述】:

我目前正在尝试将 Laravel 站点放在一起,该站点可以通过 PHP Docker 库进行通信以执行一些基本的 docker 任务。大多数事情我都搞混了,但是当我尝试在索引刀片中显示图像列表时遇到了问题。

抛出错误:

Cannot access protected property Docker\API\Model\ImageSummary::$id (View: /var/www/html/resources/views/admin/images/index.blade.php)

在我的控制器中:

public function index()
{
  $docker = Docker::create();
  $params=array("all"=>true);
  $images = $docker->imageList();
  return view('admin/images.index')->with(compact ('images'));
}

然后我尝试在刀片中填充表格:

<tbody>
<td>
@foreach ($images as $image)
{{$image->id}}
@endforeach
</td>
</tbody>

Vardump 在刀片上运行 $images 显示:

array(2) { [0]=> object(Docker\API\Model\ImageSummary)#990 (10) { ["id":protected]=> string(71) "sha256:657d7ae3892e0bf35bb240af7e81089788f74fd7ad9ab0f72fbfa6f274fcf6cc" ["parentId":protected]=> string(71) "sha256:e239fd404f67adb024ea61b9b1d16dae476a968d5dcd073e284a462fe9fcc356" ["repoTags":protected]=> array(2) { [0]=> string(23) "zmsbase:20180901-151007" [1]=> string(14) "zmsbase:latest" } ["repoDigests":protected]=> NULL ["created":protected]=> int(1535811082) ["size":protected]=> int(297427932) ["sharedSize":protected]=> int(-1) ["virtualSize":protected]=> int(297427932) ["labels":protected]=> NULL ["containers":protected]=> int(-1) } [1]=> object(Docker\API\Model\ImageSummary)#991 (10) { ["id":protected]=> string(71) "sha256:16508e5c265dcb5c05017a2a8a8228ae12b7b56b2cda0197ed5411bda200a961" ["parentId":protected]=> string(0) "" ["repoTags":protected]=> array(1) { [0]=> string(12) "ubuntu:18.04" } ["repoDigests":protected]=> array(1) { [0]=> string(78) "ubuntu@sha256:72f832c6184b55569be1cd9043e4a80055d55873417ea792d989441f207dd2c7" } ["created":protected]=> int(1534958937) ["size":protected]=> int(84117621) ["sharedSize":protected]=> int(-1) ["virtualSize":protected]=> int(84117621) ["labels":protected]=> NULL ["containers":protected]=> int(-1) } }   

我尝试过嵌套 for 循环,但总是遇到同样的错误,我在控制器中填充新 var 并使用 get 方法填充数组方面取得了一些成功,例如

public function index()
{
  $docker = Docker::create();
  $params=array("all"=>true);
  $images = $docker->imageList($params);
  foreach ($images as $image) {
  $imagestatus[$image->getId()]=$image->getrepoTags();
  }
  return view('admin/images.index', compact ('imagestatus'));
}

在这种情况下,我可以从 imagestatus 中获取变量。

所以问题是,是否可以从刀片(即第一个控制器示例)访问受保护的 docker 映像值?如果不是,为什么(我在这里缺少理解:)。

如何使用所有相同的值进行填充和排列。我的第二个控制器示例我正在努力填充多个键和单个值。感谢您提供的任何帮助。

【问题讨论】:

    标签: php laravel docker


    【解决方案1】:

    id 属性就是他们所说的protected。当属性是protected(而不是public)时,它不能直接从对象外部访问。

    这样做的原因称为“信息隐藏”,这是面向对象编程的核心。这背后的主要原因是人们应该能够根据对象的行为而不是实现来推断对象。

    在你的情况下,你可能正在寻找一个稍微不那么哲学的答案,所以你也可以简单地使用这个:

    @foreach ($images as $image)
        {{$image->getId()}}
    @endforeach
    

    【讨论】:

    • 谢谢,我不敢相信就是这样。我在控制器中使用 getId 来填充数组,但一定没有在刀片中尝试过。测试了一下,确实显示了 id 值。
    • 对不起,还有一个问题,我如何迭代它以允许访问 var 转储中包含的 repotags。更改为 {{$image->getrepoTags}} 我得到一个:htmlspecialchars() 期望参数 1 是字符串,给定数组(查看:/var/www/html/resources/views/admin/images/index.blade.php )
    • 您可以简单地再次使用相同的概念,例如。 @foreach ($image-&gt;getrepoTags() as $tag)
    • PS 美元符号在 Twig 中不是必需的,如果您愿意,可以将其去掉。
    • 好的,是的,我现在明白了。它嵌套在原始 for 循环中。再次感谢 Stratadox。
    猜你喜欢
    • 2014-09-13
    • 2020-01-20
    • 1970-01-01
    • 2016-08-27
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多