【发布时间】:2014-12-31 13:49:42
【问题描述】:
我对在 Laravel PHP 中使用 Repositories 还是个新手。我创建了一个存储库文件,并将其放置在我的项目根文件夹中名为“Repositories”的目录中。在我主页的控制器中,我为存储库创建了一个“__construct()”函数,但是当我尝试访问此页面时,我不断收到“Class Repositories\VideoRepository 不存在”错误。
我不太清楚为什么即使在使用“php artisan dump-autoload”之后我仍会收到此错误。我没有将存储库放在正确的文件夹中吗?
控制器(app\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));
}
}
存储库(app\repositories\VideoRepository.php):
编辑:将命名空间“app\repositories”添加到此界面。
<?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 存储库(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"
}
编辑:为我的存储库和 php artisan dump-autoload 添加“psr-4”代码块后,这就是我的'autoload_psr4. php' 目前看起来像:
<?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'),
);
【问题讨论】:
-
你能发布你的 composer.json 文件吗?
-
见我上面编辑的问题,我包括了'composer.json'。
-
嘿 Jeff,请参阅下面我对我的回答的最后评论,您的命名空间区分大小写。将其更改为
app\Repositories,或者如果您的项目根目录中仍有存储库文件夹,则只需Repositories。另外,请确保您的 psr-4 文本中的大小写正确:"Repositories\\" : "app\\Repositories"