首页 > 解决方案 > 试图获取非对象的属性'page_slug'(查看:)Laravel 6.*

问题描述

我使用 Provider 将数据发送到所有页面。我可以拉数据,但发送参数时出错。

这是提供者

 public function boot()
        {
            View::share('page',Pages::all()->sortBy('page_must'));
            Schema::defaultStringLength(191);
        }

在这里,我试图从提供者发送一个带有数据的参数。我可以在这里打印名称。但是参数给出错误。

     <ul>
         @foreach($page as $service)
       <li><a href="{{route('service.Index',$service->page_slug)}}">{{$service->page_title}}</a></li>
          @endforeach
     </ul>

这是控制器

public function index($slug)
    {
        $pageList=Pages::all()->sortBy('page_must');
        $page=Pages::where('page_slug',$slug)->first();
        return view('frontend.service.index',compact('page','pageList'));
    }

这是路线

Route::get('/service/{slug}','Frontend\PageController@index')->name('service.Index');

标签: phplaravel

解决方案


@foreach()当您使用 检索单个模型时,您不需要使用循环->first()。您可以直接访问以下值$page

// Controller
$page = Pages::where("page_slug", $slug)->first();

// View
<li>
  <a href="{{ route('service.Index', $page->page_slug) }}">
    {{ $page->page_title }}
  </a>
</li>

快速说明,Pages不是一个好的型号名称。模型是单数的,所以应该是Page.

此外,调整此代码:

// View::share('page', Pages::all()->sortBy('page_must'));
View::share('pages', Pages::all()->sortBy('page_must'));

在这段代码中,您将一个$page变量共享给所有视图,但是您随后通过 传递了一个新$page变量compact('page'),这将覆盖它。

如果您改为使用变量 name pages,那么您将不会有这种冲突,并且它将被正确命名以表示变量包含的内容。$page应该是一个Page,并且$pages应该是一个Collection实例Page变量命名很重要。

啊,还有一件事。如果您调整上面的代码,您可以使用@foreach()with :$pages

@foreach($pages AS $sPage)
// using `$sPage` to not conflict with `$page` from `compact()`
<li>
  <a href="{{ route('service.Index', $sPage->page_slug) }}">
    {{ $sPage->page_title }}
  </a>
</li>

总之,这里的问题是冲突/命名不佳的变量。View::share('page', ...)并且compact('page')$page在视图中设置,一个是 a Collection,它可以按预期与 一起工作@foreach(),另一个是单个Page实例,它的行为不同。


推荐阅读