代码之家  ›  专栏  ›  技术社区  ›  davidvera

laravel类型错误:参数太少,无法运行

  •  0
  • davidvera  · 技术社区  · 6 年前

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

    public function index(EntityRepository $vcs, EntityRepository $vcskns)
    {
        $entitiesLists = $vcs->getEntities();
        $entitiesWithKnLists = $vcskns->getEntitiesWithKeyneeds();
    
        return view('admin.home', compact('entitiesLists', 'entitiesWithKnLists'));
    }
    

    在EntityRepository中,我创建了GetEntityWithKeyNeeds:

    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\Mealths\Buto\SttsStCOrth:::索引()的参数太少,1通过,正好是2

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

    另一个问题是,我如何才能强制后端的每个视图都返回我的整个存储库。理论上,我必须在所有的方法中声明我的变量…

    1 回复  |  直到 6 年前
        1
  •  0
  •   davidvera    6 年前

    我必须这样创建一个接口:

    <?php
        namespace App\Contracts;
    
        interface EntityInterface {
            public function getEntities();
            public function getEntitiesWithKeyneeds();
    }
    

    我的整个历史都是这样的:

    <?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/提供者/AppService PvaveR.PHP中,我必须绑定接口。我想我必须从使用Lista\\Buffel\\ 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'));
    }