Laravel存储库中无法解决的依赖关系解析


Unresolvable dependency resolving in Laravel Repository

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

主页界面

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;
  } 
}

主页服务提供商

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的回答是正确的,因为他发现了一些重要的错误。

更改

$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;