Php Laravel 5数据库种子设定中的命名冲突

Php Laravel 5数据库种子设定中的命名冲突,php,namespaces,laravel-5,laravel-seeding,Php,Namespaces,Laravel 5,Laravel Seeding,在运行数据库种子(以及其他控制台命令)时,我遇到命名冲突 我的所有模型都存储在app/models目录中,并位于app\models命名空间中。此目录中有一个名为model.php的基本模型,它扩展了laravel基本模型 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model as BaseModel; abstract class Model extends BaseModel {} 我最初的猜测是,l

在运行数据库种子(以及其他控制台命令)时,我遇到命名冲突

我的所有模型都存储在
app/models
目录中,并位于
app\models
命名空间中。此目录中有一个名为
model.php
的基本模型,它扩展了laravel基本模型

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model as BaseModel;

abstract class Model extends BaseModel {}

我最初的猜测是,laravel以某种方式编译了种子文件,这导致了冲突。有没有人有什么想法,或者其他人已经遇到过这个问题了?

我很快就解决了这个问题。我认为你是对的,这颗种子似乎把它组合在一起,这就给了你命名上的冲突

但我想补充一点,我认为你的命名惯例有点混乱。在同一类型的雄辩类中的不同上下文中使用
模型似乎并不理想

为什么不把你的
模型
重命名为
BaseModel
——把有说服力的类保留为
模型
。然后,如果有人浏览一下您的代码,就会发现它是如何工作的

Edit:因此问题在于
DatabaseSeeder
类使用
illighted\Database\Eloquent\Model
。然后它会调用('yourseed File Here')
,这会动态解析并调用类本身,这意味着其他类在
DatabaseSeeder
类的上下文中运行

这造成了名称空间问题——导致种子失败

您或许可以这样做:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder {

    public function run()
    {
        Model::unguard();

        $sport = new SportTableSeeder;
        $sport->run();    
    }
}
问题在

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sport extends Model {}

更新:为什么您在播种时看到这一点?Laravel 5使用PSR-4,它在收到请求之前不会加载任何型号,这是在您尝试运行
SportTableSeeder

时发生的,这不是
使用的重点吗?我并不过分担心命名惯例。laravel过去使用
BaseController
,但在L5升级中,它被重命名为
Controller
,并将
Lightning\Routing\Controller
导入为
BaseController
,因此我的命名与此一致。因此我也认为,因此,我在数据库播种器中使用了我的
illumb\Database\elount\Model
,认为这样可以解决问题,但运气不好。你的新建议很有趣,但正如你所说,我失去了输出,还可以编写2倍多的代码行。编译后的文件可以在存储目录
storage/framework/compiled.php
中找到。我刚刚有一个想法-你能发布你的数据库种子文件吗?@satrun77我根本看不到该文件。我相信你的回答是正确的,但是,您有没有想过为什么它只在控制台中访问而不是通过HTTP访问时才会导致错误?我觉得这两种方法都应该失败。这可能是由于这个错误OpCache通常在CLI中被禁用。
PHP Fatal error:  Cannot use Illuminate\Database\Eloquent\Model as Model because the name is already in use in /home/vagrant/Code/wisletics/app/Models/Sport.php on line 3
<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder {

    public function run()
    {
        Model::unguard();

        $sport = new SportTableSeeder;
        $sport->run();    
    }
}
<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sport extends Model {}
<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model as BaseModel;

class Sport extends BaseModel {}