2015-02-20 3 views
3

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

+0

Скомпилированный файл может быть найден в каталоге хранения 'storage/framework/compiled.php' – satrun77

+0

У меня просто была мысль - можете ли вы разместить файл базы данных базы данных, пожалуйста? – Laurence

+0

@ satrun77 Я вообще не вижу этот файл. –

ответ

1

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

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

Примечание - вы потеряете выход семян на консоль с помощью этого метода

+0

разве это не пункт 'use'? Я не слишком беспокоюсь об именовании. laravel использовать «BaseController», но в обновлении L5 он был переименован в «Контроллер», и он импортирует 'Illuminate \ Routing \ Controller' как' BaseController', поэтому мое именование соответствует этому. –

+0

Я обновил свой ответ – Laurence

+0

, поэтому я тоже подумал об этом, поэтому я использовал псевдоним «Illuminate \ Database \ Eloquent \ Model» в сеялке базы данных, считая, что это решит проблему, но не повезло. ваше новое предложение интересно, но, как вы сказали, я теряю выход, а также пишу 2x столько строк кода. –

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 {} 

Update: Почему вы видите это время высева? Ну, Laravel 5 использует PSR-4, он не загружает ни одну вашу модель, пока она не будет запрошена, что происходит, когда вы пытались запустить SportTableSeeder.

+0

Я верю, что вы правы с этим ответом, но какие-либо мысли о том, почему он вызывает ошибку при доступе в консоли, а не через HTTP? я чувствую, что это должно потерпеть неудачу в обоих направлениях. –

+1

Это может быть связано с этой ошибкой https://bugs.php.net/bug.php?id=66773 OpCache обычно отключен в CLI. – crynobone

Смежные вопросы