я сталкиваюсь с конфликтом имен при запуске семян моей базы данных (вместе с другими консольными командами).
все мои модели хранятся в 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 {}
некоторые из моих моделей расширяют красноречивую модель напрямую, например
<?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 каким-то образом компилирует начальные файлы, что вызывает конфликт. у кого-нибудь есть идеи, или кто-нибудь еще сталкивался с этим вопросом?
Проблема в
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Sport extends Model {}
Это создает проблему, как у вас уже есть App\Models\Model
Теперь, когда PHP пытается получить родительский класс Sport
(Model
), он не может решить, действительно ли вы просите App\Models\Model
или же Illuminate\Database\Eloquent\Model
,
Эту проблему можно решить, фактически изменив ее на:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model as BaseModel;
class Sport extends BaseModel {}
Обновить: Почему вы видите это во время посева? Хорошо, Laravel 5 использует PSR-4, он не загружает вашу модель, пока не будет запрошено, что происходит, когда вы пытаетесь запустить SportTableSeeder
,
Я быстро поиграл с этим. Я думаю, что вы правы, кажется, что семя сгруппировало все это вместе, и это приводит к конфликту имен.
Но я хотел бы добавить, что я думаю, что ваше соглашение об именах немного сбивает с толку. С помощью Model
в разных контекстах внутри одного и того же типа классы Eloquent не кажутся идеальными.
Почему бы просто не переименовать ваш Model
как 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();
}
}
Обратите внимание — при этом методе вы потеряете начальный вывод на консоли