3

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

我所有的模型都存储在app/Models目录中,并且在App\Models命名空间中。此目录中有一个名为Model.php扩展 laravel 基础模型的基础模型。

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model as BaseModel;

abstract class Model extends BaseModel {}

我的一些模型扩展了这个基类,例如

<?php namespace App\Models;

class User extends Model {}

我的一些模型直接扩展了 eloquent 模型,例如

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sport extends Model {}

当我的应用程序通过 http 访问时,这工作正常,并且没有命名冲突。但是,当我尝试运行控制台命令时,例如db:seed,我收到以下错误:

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

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

4

2 回答 2

3

问题在

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sport extends Model {}

这会产生一个问题,就像您已经遇到的那样App\Models\Model,现在当 PHP 尝试获取Sport( Model) 的父类时,它无法决定您是否实际要求App\Models\ModelIlluminate\Database\Eloquent\Model

这个问题可以通过实际更改为:

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model as BaseModel;

class Sport extends BaseModel {}

更新:为什么你在播种时看到这个?好吧,Laravel 5 使用 PSR-4,它在请求之前不会加载您的任何模型,这在您尝试运行时发生SportTableSeeder

于 2015-02-26T12:16:04.413 回答
1

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

但我想补充一点,我认为您的命名约定有点令人困惑。在相同类型的 Eloquent 类中的不同上下文中使用Model似乎并不理想。

为什么不直接重命名你的Modelas BaseModel- 并将 Eloquent 类保留为Model. 然后,对于浏览您的代码的人来说,它的功能立即显而易见。

编辑:所以问题是DatabaseSeeder该类使用Illuminate\Database\Eloquent\Model. 然后,$this->call('Your Seed 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();    
    }
}

注意 - 使用此方法您将丢失控制台上的种子输出

于 2015-02-22T09:02:02.700 回答