【问题标题】:Laravel PHP: Repository Class does not existLaravel PHP:存储库类不存在
【发布时间】: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"

标签: php laravel-4


【解决方案1】:

听起来好像没有自动加载,你需要把它添加到composer.json中。

您可以将其添加到自动加载/类映射数组或使用PSR autoloading 查看。

【讨论】:

  • 在我的“composer.json”文件中,我添加到“classmap”块“app/repositories”,保存文件,然后运行“php artisan dump-autoload”,但我仍然得到同样的错误。
【解决方案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 目录移动到您的应用程序文件夹中。这样,您的自定义代码将全部驻留在框架的文件夹中,该文件夹旨在包含您的添加。 composer.json psr-4 看起来像这样:

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

您在任何存储库文件中的命名空间将是:

<?php namespace app\Repositories;

我还建议查看Laracast video on PSR-4 autoloading。它非常有帮助,如果你打算在 laravel 中构建东西,那是非常值得的。

【讨论】:

  • 我在“composer.json”文件中添加了一个“psr-4”块,在我的存储库文件中添加了“命名空间”行,然后运行“php artisan dump-autoload”。我仍然收到同样的错误。
  • 好的,打开文件vendor\composer\autoload_psr4.php。这是 composer 编写自动加载 psr-4 路径的实际代码的地方。在与您的 Repositories 文件夹路径一致的情况下,它是否在相对于您的基本目录(项目的根目录)的正确位置显示该文件夹?
  • 我进行了编辑并包含了我的“autoload_psr4.php”文件中的代码。
  • 啊,所以我相信作曲家是区分大小写的。尝试更改您的 composer.json 文件,以便 Repositories 的大小写与您在存储库文件中提供的命名空间相匹配。确保您的文件夹名称也有正确的大小写。
  • 没问题。我在学习 laravel 时遇到了一个非常相似的问题,并且在 stackoverflow 上得到了很大的帮助。我很高兴我可以提前付款!
【解决方案3】:

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

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

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

【讨论】:

  • 我尝试将'namespace app\repositories'行添加到我的界面,但我的'VideoRepository'类仍然找不到:(
  • 命名空间应该和你的 EloquentVideoRepository 类一样:命名空间存储库;
猜你喜欢
  • 2014-02-09
  • 2014-06-24
  • 2020-06-22
  • 1970-01-01
  • 2018-01-02
  • 2021-05-27
  • 2016-08-27
  • 2014-12-03
  • 2021-06-18
相关资源
最近更新 更多