【问题标题】:Laravel namespace issueLaravel 命名空间问题
【发布时间】:2014-09-07 18:03:12
【问题描述】:

我有一个 laravel 4.1 应用程序,我在我的 app 文件夹中创建了一个文件夹来存储大部分逻辑。

/app/Acme/Models/
/app/Acme/Repositories/

这是两个主要文件夹。

在我的 composer.json 中,我在自动加载中有这个,并进行了转储运行。

    "psr-4" : {
            "Acme\\" : "app/Acme"
    }

无论我得到什么,我认为都是愚蠢的问题。例如我的 Acme/Models/Task.php 有以下内容

<?php
namespace Acme\Models;

class Task extends \Eloquent {

    public function job()
    {
        return $this->belongsTo('Job');
    }

}

但是当我运行它时,我得到一个错误

Fatal error: Class 'Task' not found in vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 780

在我的 Job.php 中,我在文件顶部有相同的命名空间....

我必须手动导入/使用同名空间中的对象吗? use Acme/Models/Job as Job; ?好像是这样的重复...

当我设置namespace Acme/Repositories; 的命名空间时,在我的存储库文件夹中,我必须使用 之类的项目

use Acme\Models\Job as Job;

我,有点失落!

【问题讨论】:

    标签: php laravel namespaces


    【解决方案1】:

    命名空间是相对的,因此您无需添加 use 即可直接引用同一命名空间中的类。

    您遇到的错误是因为您需要完全限定与命名空间模型的关系,因此 eloquent 知道在哪里可以找到它们,例如

    $this->belongsTo('\Acme\Models\Jobs');
    

    对于您的存储库命名空间,您需要按照建议在文件中添加 use 语句,或引用完全限定的命名空间,例如 new \Acme\Models\Job();

    附带说明,我知道 PHPStorm(而且我确信其他 IDE)会为您注入命名空间,这非常有用,并且每次您引用一个类时都不必编写 use 或完整的命名空间 - 值得退房。

    编辑:抱歉,我第一次没有正确阅读问题 - 更新了我的答案。

    【讨论】:

    • Jude,我想是因为在 Task.php 中我使用了命名空间 Acme\Models;我可以只使用 Job,因为它在同一范围内......?
    • 抱歉,我略过了一行,说他们在同一个 NS 中,并假设您的意思是另一个类在 Acme\Repository NS 中。你又是对的,它应该是相对的,但是你得到的错误来自一个完全不同的问题......你只需要完全限定这种关系。例如 $this->belongsTo('\Acme\Models\Job');
    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 2014-09-03
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2013-03-26
    • 2016-05-14
    相关资源
    最近更新 更多