Laravel PHP:存储库类不存在

时间:2014-11-04 15:37:58

标签: php laravel-4

我在Laravel PHP中使用Repositories还是新手。我创建了一个存储库文件,并将其放在名为' 存储库'的目录中。在我的项目的根文件夹中。在我的主页控制器中,我创建了一个' __ construct()'存储库的功能,但是当我尝试访问此页面时,我不断获得类存储库\ VideoRepository不存在'错误。

即使在我使用' php artisan dump-autoload'之后,我也不确定为什么我会一直收到此错误。我不是将存储库放在正确的文件夹中吗?

控制器(表观\ OverviewController.php):

<?php

use Controllers\VideosController;

use Models\Video;

use Models\Validators as Validators;

class OverviewController extends BaseController {

/* The Video model */
protected $video;

/* The picture model */
protected $picture;

/* The layout for the Videos and Pictures Overview */
protected $layout = 'layouts.master';

 public function __construct()
 {
    $this->video =   \App::make('Repositories\VideoRepository');
 }

/* List all the videos and stones
Included Pagination for neatness */

 public function index()
 {
    $allpicsvids = Video::paginate(10);
    $this->layout->content = \View::make('overview', array('allpicsvids' => $allpicsvids));
 }


}

库(应用\库\ VideoRepository.php):

编辑:添加了命名空间&#39; app \ repositories&#39;到这个界面。

<?php namespace app\repositories;

interface VideoRepository {

public function all();

public function find($id);

public function findOrFail($id);

public function create($input);

public function update($id, $input);

public function delete($id);

public function forceDelete($id);

public function restore($id);

}

Eloquent Repository(app \ repositories \ EloquentVideoRepository.php):

<?php namespace Repositories;

use Models\Video;

class EloquentVideoRepository implements VideoRepository {

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

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

public function findOrFail($id)
{
    return Video::findOrFail($id);
}

public function create($input)
{
    return Video::create($input);
}

public function update($id, $input)
{
    $video = Video::find($id);
    $video->video_name = $input['video_name'];
    $video->video_description = $input['video_name'];
    $video->video_edges = $input['video_edges'];
    $video->video_stores = $input['video_stores'];
    $video->video_order = $input['video_order'];
    $video->video_link = $input["video_link"];
    $video->video_height = $input['video_height'];
    $video->video_width = $input['video_width'];
    $video->category = $input['category'];
    $video->video_project = $input['video_project'];
    $video->touch();
    return $video->save();
}

public function delete($id)
{
    $video = Video::find($id);
    return $video->delete();
}

public function forceDelete($id)
{
    $video = Video::find($id);
    return $video->forceDelete();
}

public function restore($id)
{
    $video = Video::withTrashed()->find($id);
    return $album->restore();
}


}

composer.json:

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
    "laravel/framework": "4.2.*"
},
"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",

       /* Added this line below so that my repositories could be recognized */
        "app/repositories",

        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ]
},
"scripts": {
    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize"
    ],
    "post-update-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize"
    ],
    "post-create-project-cmd": [
        "php artisan key:generate"
    ]
},
"config": {
    "preferred-install": "dist"
},
"minimum-stability": "stable"
}

编辑:添加&#34; psr-4 &#34;我的存储库代码块和 php artisan dump-autoload ,这就是我的&#39; autoload_psr4.php &#39;目前看起来像:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
 'repositories\\' => array($baseDir . '/app/repositories'),
 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
);

3 个答案:

答案 0 :(得分:2)

您可以通过psr-4加载存储库,而不是尝试将其添加到类映射中:

在作曲家json中:

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",

        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ],
    psr-4: {
        "Repositories\\" : "Repositories"
    }
},

您还需要在VideoRepository文件的顶部添加命名空间。

另外,我建议您将Repositories目录移动到您的app文件夹中。这样,您的自定义代码将全部驻留在框架的文件夹中,该文件夹旨在包含您的添加内容。 composer.json psr-4看起来像这样:

"Repositories\\" : "app\\Repositories"

任何Repository文件中的命名空间都是:

<?php namespace app\Repositories;

我还建议查看Laracast video on PSR-4 autoloading。这是非常有用的,如果你计划在laravel建设东西,这是值得的钱。

答案 1 :(得分:2)

您的界面不在任何特定的命名空间中。您的EloquentVideoRepository是 - 因此无法找到该类,因为它们位于同一目录中。

如果将接口拉入与实现类相同的命名空间,则很容易修复。

另外,psr-4自动加载应该是“Repositories \”:'repositories',除非你想调整文件夹名称的大小。

答案 2 :(得分:1)

听起来它没有被自动加载,你需要将它添加到composer.json。

您可以将其添加到autoload / classmap数组中,或者使用PSR autoloading查看。