Конфликт имен в заполнении базы данных Laravel 5

я сталкиваюсь с конфликтом имен при запуске семян моей базы данных (вместе с другими консольными командами).

все мои модели хранятся в 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 каким-то образом компилирует начальные файлы, что вызывает конфликт. у кого-нибудь есть идеи, или кто-нибудь еще сталкивался с этим вопросом?

3

Решение

Проблема в

<?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,

3

Другие решения

Я быстро поиграл с этим. Я думаю, что вы правы, кажется, что семя сгруппировало все это вместе, и это приводит к конфликту имен.

Но я хотел бы добавить, что я думаю, что ваше соглашение об именах немного сбивает с толку. С помощью 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();
}
}

Обратите внимание — при этом методе вы потеряете начальный вывод на консоли

1

По вопросам рекламы [email protected]