Разрешение неразрешимых зависимостей в репозитории Laravel

У меня возникла ошибка «неразрешимое разрешение зависимостей [Parameter # 1 [$ mainPage]]» после попытки управления внедрением зависимостей в моем репозитории. Мне уже удалось построить свой контроллер, репозиторий, интерфейс и поставщика услуг. Здесь чего-то не хватает? Я что-то не так делаю в своей логике?

Домашний контроллер

use Repositories\MainPageRepository;

class HomeController extends BaseController {

protected $cPage, $mainPage;

public function __construct(MainPageRepository $cPage, $mainPage)
{
$this->cPage = $cPage;
$this->mainPage = $mainPage;
}

public function getPages($lang, $slug)
{

$cPage = $this->cPage->getCurrentPage($lang, $slug);

$mainPages = $this->mainPage->getAllMainPages($cPage);

$allPages = $this->getAllPages($mainPages);

return View::make('index')
->with('cPage', $cPage)
->with('mainPages', $mainPages)
->with('allPages', $allPages);
}

private function getAllPages($pages)
{
$allPages = array();

foreach ($pages as $page) {

//...

}
return $allPages;
}

MainPageInterface

namespace Repositories;

interface MainPageInterface {

public function getCurrentPage($lang, $slug);

public function getAllMainPages($cPage);
}

MainPageRepository

namespace Repositories;

use Page;

class MainPageRepository implements MainPageInterface{

public function getCurrentPage($lang, $slug)
{
$cPage = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
->where('slug', '=', $slug)
->where('code', '=', $lang)
->first();

return $cPage;
}

public function getAllMainPages($cPage)
{
$mainPage = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
->where('parent_id', null)
->get();

return $mainPage;
}
}

MainPageServiceProvider

namespace Repositories;

use Illuminate\Support\ServiceProvider;

class MainPageServiceProvider extends ServiceProvider {

public function register()
{
$this->app->bind('MainPageInterface', 'MainPageRepository');
}
}

Реализованы изменения после ответа @Matt Burrows:
Проблема все еще сохраняется
контроллер

use Repositories\MainPageInterface;

class HomeController extends BaseController {

protected $cPage, $mainPage;

public function __construct(MainPageInterface $cPage, $mainPage)
{
$this->cPage = $cPage;
$this->mainPage = $mainPage;
}

Поставщик услуг

public function register()
{
$this->app->bind('Repositories\MainPageInterface', 'Repositories\MainPageRepository');
}

Итак, мне наконец удалось преодолеть это, разделив две функции в моем репозитории на 2 отдельных репозитория. Это добилось цели. Я приму ответ @Matts как правильный в любом случае, так как он все же обнаружил некоторые важные ошибки.

-1

Решение

+ Изменить

$this->app->bind('MainPageInterface', 'MainPageRepository');

в

$this->app->bind('Repositories\MainPageInterface', 'Repositories\MainPageRepository');

Внутри вашего поставщика услуг.

Также изменить

use Repositories\MainPageRepository;

в

use Repositories\MainPageInterface;

и изменить

public function __construct(MainPageRepository $cPage, $mainPage)

в

public function __construct(MainPageInterface $cPage, $mainPage)

И это должно работать.

Не забудьте зарегистрировать вашего поставщика услуг в app.php, если вы еще этого не сделали.

Это можно сделать, добавив путь к классу в массив провайдеров следующим образом;

'providers' => array(
//...
'Repositories\MainPageServiceProvider'
)

Обязательно composer dump-autoload тоже

Для проблемы Unresolvable dependency resolving [Parameter #1 [ $mainPage ]] это связано с тем, что контейнер IoC не знает, какой тип объекта $ mainPage. Типа брось объект, и ты получишь то, что хочешь.

Это можно сделать так;

use Path\To\A\Object;

...

__construct(MainPageRepository $cPage, Object $mainPage)
1

Другие решения

Вы должны вводить MainPageInterface в ваш контроллер не MainPageRepositoryэто точка привязки в поставщике услуг.

0

вместо

use Repositories\MainPageRepository;

так должно быть

use Repositories\MainPageInterface;
0
По вопросам рекламы [email protected]