У меня возникла ошибка «неразрешимое разрешение зависимостей [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 как правильный в любом случае, так как он все же обнаружил некоторые важные ошибки.
+ Изменить
$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)
Вы должны вводить MainPageInterface
в ваш контроллер не MainPageRepository
это точка привязки в поставщике услуг.
вместо
use Repositories\MainPageRepository;
так должно быть
use Repositories\MainPageInterface;