Laravel 5.0, невозможно повторно объявить класс App\models\Category

Недавно я обновил свой проект с laravel 4.2 до laravel 5.0 и столкнулся с несколькими ошибками.

Я не определял пространства имен в версии 4.2, но, как было предложено здесь

Я начал определять пространства имен в своем коде. Я не знаю, связана ли проблема, с которой я столкнулся, с этим, но она возникла в середине этого процесса.

Я получаю следующую ошибку при выполнении кода:

exception 'Symfony\Component\Debug\Exception\FatalErrorException' with
message 'Cannot redeclare class App\models\Category' in  
/Users/yash/summers/lightsCameraDinner/lcd_updated/app/models/Category.php:19

Вот мой Category.php:

<?php namespace App\models;

use Eloquent;

class Category extends Eloquent {

  protected $table = 'categories';
  protected $guarded = array('id');

  // Defining 'Many to Many' Relationship with 'VendorProfile' Model
  public function clients() {
    return $this->belongsToMany('Client');
  }

  // Defining 'One to Many' Relationship with 'Job' Model
  public function jobs() {
    return $this->hasMany('Job');
  }
}

Я искал подобные ошибки на SO, но не нашел.

Это функция в моем контроллере, которая вызывается на маршруте «/».

    public function getIndex() {
    $categories = Category::all();

    $messages = Message::groupBy('receiver_id')
                ->select(['receiver_id', \DB::raw("COUNT('receiver_id') AS total")])
                ->orderBy('total', 'DESC')
                ->get()
                ->toArray();

    $vendors_ids = array();
    foreach ($messages as $message) {
      $vendors_ids[] = $message['receiver_id'];
    }

    $clients = Client::where('profile_type', 'VendorProfile')
                      ->where('is_activated', 1)
                      ->whereIn('id', $vendors_ids)
                      ->limit(4)
                      ->get();

    if($clients->count() < 4) {
      $clients = Client::where('profile_type', 'VendorProfile')
                        ->where('is_activated', 1)
                        ->limit(4)
                        ->get();
    }   
    Log::info('getIndex function of PagesController');
    $this->layout = View::make('layouts.homepage');
    $this->layout->content = View::make('pages/index', ['categories' => $categories, 'clients' => $clients]);
    return $this->layout;
  }

Дайте мне знать, если вам нужно что-то еще из кода. Я уже довольно давно пытаюсь найти решение.


person Yash    schedule 28.05.2015    source источник
comment
У вас есть еще один Category Class в том же пространстве имен?   -  person DavidDomain    schedule 28.05.2015
comment
Нет, не знаю. Раньше у меня было все в глобальном пространстве имен, поэтому я думаю, что в то время я получил бы ошибку. Во-вторых, эта категория находится в пространстве имен App\models, и у меня нет другого класса с именем model в этом пространстве имен.   -  person Yash    schedule 28.05.2015
comment
Ошибка указывает на Category.php:19, на этом файл заканчивается. Что это обозначает?   -  person Yash    schedule 28.05.2015
comment
Я только что создал модель с artisan make:model. Моя модель выглядит иначе, чем ваша. namespace App;. И use Illuminate\Database\Eloquent\Model;. Может быть. Попробуй это.   -  person DavidDomain    schedule 28.05.2015
comment
Странный. Я изменил его на namespace App , но теперь PagesController говорит App\Categorynot found.   -  person Yash    schedule 28.05.2015
comment
И Eloquent в любом случае относится к Illuminate\Database\Eloquent\Model в app.php   -  person Yash    schedule 28.05.2015
comment
Добавьте это в свой контроллер use App\Models\Category   -  person DavidDomain    schedule 28.05.2015
comment
App\Models\Category не найдено. Добавляя это, он просматривает пространство имен App\Models, но мои модели находятся в пространстве имен App. Так что, я думаю, это не имеет никакого смысла.   -  person Yash    schedule 28.05.2015


Ответы (2)


Это потому, что вы создали контроллер, а затем перетащили его в подпапку. Вам нужно изменить пространство имен на правильное или правильно сгенерировать контроллер.

php artisan make:controller Api/CategoryController  

или измените пространство имен на

namespace App\Http\Controllers\Api;

(если API - это имя папки, в которой находится контроллер)

person Adam    schedule 05.07.2015

Я знаю, что вопрос старый, но я отвечу на то, что сработало для меня. Недавно я тестировал обновление Laravel 4.2 до 5.0 в ветке git. У меня была та же проблема с классом Model с именем Megaloquent, который расширяет Eloquent в Laravel 4.2, который теперь называется Model.

Поскольку вначале я пытался заставить его работать без пространства имен, я добавил подкаталоги app/ в карту классов composer.json.

"autoload": {
    "classmap": [
        "database",
        "app/Http/Controllers",
        "app/Http/Controllers/Auth",
        "app/Models",
        "app/Libraries"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

И после многих проблем с тем, чтобы заставить его работать, я решил использовать пространство имен в контроллерах и моделях, которое теперь кажется мне более структурированным и точным. Вы должны удалить app/Controllers-Models-Libraries из classmap, так как psr-4 уже загружает все классы в app/{subdirectories}/classes, а автозагрузка classmap делает это дважды. Вы получите только это после их удаления

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

Это внутренняя конфигурация Laravel, которую вы не можете контролировать, но их удаление исправило ошибку для меня.

person KeitelDOG    schedule 14.03.2017