Laravel Type error: Too few arguments to function

Laravel Type error: Too few arguments to function

我创建了一个带有索引控制器的控制器:

public function index(EntityRepository $vcs, EntityRepository $vcskns)
{
    $entitiesLists = $vcs->getEntities();
    $entitiesWithKnLists = $vcskns->getEntitiesWithKeyneeds();

    return view('admin.home', compact('entitiesLists', 'entitiesWithKnLists'));
}

在 EntityRepository 中我创建了 getEntitiesWithKeyneeds :

public function getEntitiesWithKeyneeds()
{
    $valuechains = Valuechain::orderBy('valuechains.id')
        ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
        ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
        ->where('langs.isMainlanguage', '=', '1')
        ->with('segments')
        ->with('keyneeds')
        ->withCount('segments')
        ->withCount('keyneeds')
        ->get();


    foreach ($valuechains as $valuechain) {
        $ids[] = $valuechain->id;
    }

    foreach ($ids as $id) {
        $vcskns[] = Segment::select(
            'lang_valuechain.vcname', 'lang_valuechain.vcshortname',
            'lang_segment.segname', 'lang_segment.segshortname', 'segments.id',
            'lang_segment.created_at', 'lang_segment.updated_at', 'lang_segment.deleted_at'
        )
            ->distinct()
            ->withCount('keyneeds')
            ->join('lang_segment', 'segments.id', '=', 'lang_segment.segment_id')
            ->join('valuechains', 'segments.valuechain_id', '=', 'valuechains.id')
            ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
            ->join('sectors', 'valuechains.sector_id', '=', 'sectors.id')
            ->join('lang_sector', 'sectors.id', '=', 'lang_sector.sector_id')
            ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
            ->where([
                ['langs.isMainlanguage', '=', '1'],
                ['valuechains.id', '=', $id]
            ])
            ->whereNull('valuechains.deleted_at')
            ->whereNull('sectors.deleted_at')
            ->whereNull('segments.deleted_at')
            ->get();

    }
    return $vcskns;
}

我收到一条错误消息:

类型错误:函数 App\Http\Controllers\BackOffice\StatsController::index() 的参数太少,1 个已通过,正好是 2 个预期

我希望我能解决这个问题。

另一个问题是知道如何强制后端的每个视图都具有 EntityRepository 的 returns。理论上我必须在我所有的方法中声明我的变量...

我不得不这样创建一个界面:

<?php
    namespace App\Contracts;

    interface EntityInterface {
        public function getEntities();
        public function getEntitiesWithKeyneeds();
}

我的 EntityRepository 如下所示:

<?php

namespace App\Http\Controllers\BackOffice\Repository;

use App\Contracts\EntityInterface;
use App\Segment;
use App\Valuechain;


class EntityRepository implements EntityInterface
{
    public function getEntities()
    {
        $vcs = Valuechain::select('valuechains.id', 'lang_valuechain.vcname',     
                    'lang_valuechain.vcshortname')
                    ->withCount('segments')
                    ->join('sectors', 'valuechains.sector_id', '=', 'sectors.id')
                    ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
                    ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
                    ->where('langs.isMainlanguage', '=', '1')
                    ->whereNull('valuechains.deleted_at')
                    ->whereNull('sectors.deleted_at')
                    ->get();

        return $vcs;
    }

    public function getEntitiesWithKeyneeds()
    {
        // liste des cdv
        $valuechains = Valuechain::orderBy('valuechains.id')
                ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
                ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
               ->where('langs.isMainlanguage', '=', '1')
                ->with('segments')
                ->with('keyneeds')
                ->withCount('segments')
                ->withCount('keyneeds')
                ->get();

        foreach ($valuechains as $valuechain) {
            $ids[] = $valuechain->id;
        }

        foreach ($ids as $id) {
            $vcskns[] = Segment::select(
                'lang_valuechain.vcname', 'lang_valuechain.vcshortname',
                'lang_segment.segname', 'lang_segment.segshortname', 'segments.id',
                'lang_segment.created_at', 'lang_segment.updated_at', 
                'lang_segment.deleted_at'
            )
                ->distinct()
                ->withCount('keyneeds')
                ->join('lang_segment', 'segments.id', '=', 'lang_segment.segment_id')
                ->join('valuechains', 'segments.valuechain_id', '=', 'valuechains.id')
                ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
                ->join('sectors', 'valuechains.sector_id', '=', 'sectors.id')
                ->join('lang_sector', 'sectors.id', '=', 'lang_sector.sector_id')
                ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
                ->where([
                    ['langs.isMainlanguage', '=', '1'],
                    ['valuechains.id', '=', $id]
                ])
                ->whereNull('valuechains.deleted_at')
                ->whereNull('sectors.deleted_at')
                ->whereNull('segments.deleted_at')
                ->get();
        }
        return $vcskns;

    }
}

在 app/Providers/AppServiceProvider.php 中,我必须绑定接口。我想我必须使用 Illuminate\Support\ServiceProvider 覆盖构造函数:

public function __construct($app)
{
    $this->app = $app;

    $this->app->bind(
        'App\Contracts\EntityInterface',
        'App\Http\Controllers\BackOffice\Repository\EntityRepository'
    );
}

我使用这些值的控制器看起来像这样(这是我的索引方法):

public function index(EntityInterface $vcs)
{
    $entitiesLists = $vcs->getEntities();
    $entitiesWithKnLists = $vcs->getEntitiesWithKeyneeds();

    return view('admin.home', compact('entitiesLists', 'entitiesWithKnLists'));
}