Laravel Repository中无法解析的依赖关系

时间:2014-11-11 15:08:28

标签: php laravel dependency-injection repository

尝试在我的存储库中管理依赖项注入后,我遇到了“无法解析的依赖项解析[参数#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');
}

好的,所以我终于设法通过将我的存储库中的两个函数分成两个单独的存储库来克服这个问题。这就是诀窍。在任何情况下,我都会接受@Matts的回答是正确的,因为他发现了一些重要的错误。

3 个答案:

答案 0 :(得分: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 :(得分:0)

您应该将MainPageInterface注入控制器而不是MainPageRepository,这是服务提供商中的绑定点。

答案 2 :(得分:0)

而不是

use Repositories\MainPageRepository;

应该是

use Repositories\MainPageInterface;