我在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'),
);
答案 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查看。