2

问题:在 PostController.php 中的第 4 行找不到类 PostRepostioryInterface 或在修补命名空间时我什至找不到类 App\Models\Interfaces\PostRepositoryInterface

问题:如何在 laravel 4 中注册命名空间?我需要做什么才能让 L4 识别此命名空间中的类/接口?

Larave 3 在 ClassLoader 中有一个 $namespaces 静态对象,您可以在其中添加命名空间

Autoloader::namespaces(array(
  'App\Models\Interfaces' => path('app').'models/interfaces',
));

我不确定我是否对 laravel 3 有此权利,但无论哪种方式,Laravel 4 中都不存在 AutoLoader 并且 ClassLoader 存在,但 Laravel 4 中的 ClassLoader 中不存在方法命名空间。

我看过这个,但如果不以某种方式注册命名空间,它似乎不起作用。 在 Laravel 4 中使用命名空间

示例结构:

app/models/interfaces
    PostRepostitoryInterface.php
app/models/repositories
    EloquentPostRepository.php


namespaces:
    App\Models\Repositories;
    App\Models\Interfaces;

文件:

PostRepositoryInterface.php

<?php namespace App\Models\Interfaces;
interface PostRepositoryInterface {
    public function all();
    public function find($id);
    public function store($data);
}

EloquentPostRepository.php

<?php namespace App\Models\Repositories;
use App\Models\Interfaces\PostRepositoryInterface;
class EloquentPostRepository implements PostRepositoryInterface {

    public function all()
    {
        return Post::all();
    }

    public function find($id)
    {
        return Post::find($id);
    }

    public function store($data)
    {
        return Post::save($data);
    }
}

PostController.php

<?php
use App\Models\Interfaces\PostRepositoryInterface;
class PostsController extends BaseController {

    public function __construct( PostRepositoryInterface $posts )
    {
        $this->posts = $posts; 
    }

谢谢

4

2 回答 2

7

你可能忘了做composer dump-autoload。这会更新 Laravel 自动加载的类列表。

您可以阅读更多关于作曲家文档

于 2013-03-05T17:34:32.237 回答
1

在 laravel irc 频道上,我发现命名空间应该在 L4 中工作,而不需要在任何地方注册它们。这是因为 composer dump-autoload 为我将它们添加到 composer/autoload 文件中。所以这不是问题。

这个问题显然是一个错字(我在上面的代码中找不到它,但是在复制/粘贴了类名和命名空间的每一行之后发生了一些变化),而且不知何故在我的真实代码中我遗漏了'使用 EloquentPostRepository.php 的语句

use App\Models\Interfaces\PostRepositoryInterface;

现在,我在尝试将命名空间接口与 ioc 和控制器构造函数一起使用时遇到了另一面墙(目标接口 App\Models\Interfaces\PostRepositoryInterface 不可实例化),但我想这应该是一个不同的问题。

于 2013-03-06T00:01:01.337 回答