Вопрос

Ниже приведена часть моего файла маршрутизации.Однако всякий раз, когда я посещаю /recipe или /recipe/{id} url-адрес, по которому я получаю сообщение об ошибке

Невозможно повторно объявить класс Recipe.

Кстати, рецепт - это название моей модели.

Route::group(array('before' => 'auth'), function(){
    Route::any('/logout', 'LoginController@actionLogout');
    Route::get('/recipe/add', 'RecipeController@showAdd');
    Route::post('/recipe/add', 'RecipeController@actionAdd');
});
Route::any('/', 'HomeController@actionHome');
Route::get('/recipe', 'RecipeController@showIndex');
Route::get('/recipe/{id}', 'RecipeController@showItem');

Если я изменю файл маршрутизации на приведенный ниже, ошибка больше не возникнет.Однако тогда на URL-адреса, очевидно, влияет "before"=>"auth", что означает, что доступ к нему могут получить только те, кто вошел в систему.

Route::group(array('before' => 'auth'), function(){
    Route::any('/logout', 'LoginController@actionLogout');
    Route::get('/recipe/add', 'RecipeController@showAdd');
    Route::post('/recipe/add', 'RecipeController@actionAdd');
    Route::any('/', 'HomeController@actionHome');
    Route::get('/recipe', 'RecipeController@showIndex');
    Route::get('/recipe/{id}', 'RecipeController@showItem');
});

Я неправильно использую группы, или я что-то упускаю?

Редактировать: Файл контроллера выглядит следующим образом:

<?

class RecipeController extends BaseController
{

    protected $layout = 'layouts.home';

    public function showIndex()
    {
        $this->layout->content = View::make('recipe.index')->with('recipes', Recipe::paginate(15));
    }

    public function showAdd()
    {
        $this->layout->content = View::make('recipe.add');
    }

    public function actionAdd()
    {
        $recipe = new Recipe;
        $recipe->creator = Auth::user()->id;
        $recipe->title = Input::get('name');
        $recipe->serves = Input::get('serves');
        if (Input::hasFile('image')){
            $fileName = date('m_d_Y_h_i_s_a', time()).'__'.str_replace(' ', '', Input::file('image')->getClientOriginalName());
            Input::file('image')->move('uploads', $fileName);
            $recipe->image = $fileName;
        }
        $recipe->save();
        Log::info(Input::get('method'));
        foreach (Input::get('method') as $index => $item){
            $method = new MethodItem();
            $method->content = $item;
            $method->order = $index;
            $recipe->Method()->save($method);
        }
        return Redirect::to('/recipe')->with('message','Wrong Username or Password');
    }

    public function showItem($id)
    {
        $recipe = Recipe::findOrFail($id);
        $this->layout->content = View::make('recipe.item')->with('recipe', $recipe);
    }

}

И модель:

<?php

class Recipe extends Eloquent{

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'recipes';

    public function Creator()
    {
        return $this->belongsTo('User', 'creator');
    }
    public function Method(){
        return $this->hasmany('MethodItem', 'recipe')->orderBy('order');
    }   

}

Правка 2

Похоже, проблема в том, как работает автозагрузчик Laravel (или composers).Похоже, что во время выполнения контроллера модель рецепта не была создана, как было обнаружено с помощью class_exists('Recipe', false).Однако, когда я запускаю class_exists('Recipe', true) возникает ошибка.

Редактировать 3

Итак, сортировка или ответ, который я нашел, заключается в переименовании класса recipe (и имени файла, а также всех ссылок на него).Затем мне пришлось создать пустой файл с именем recipe.php.Это кажется невероятно халтурным, но это работает, так что пока я буду придерживаться этого.Интересно, может быть, контроллеры должны иметь совершенно отдельные названия от моделей Eloquent?

Это было полезно?

Решение

Решение заключается в повторной генерации файлов автоматической загрузки.Что касается меня, то я просто побежал composer dump-autoload -o.Похоже, некоторым пользователям может понадобиться composer dump-autoload.

Большое спасибо пользователь2094178 за предоставление решения.

Другие советы

Ответ прост.Вы уже объявили о Recipe класс.Это не имеет никакого отношения к вашему файлу маршрутов;так что перестань смотреть туда.Выполните поиск по всему вашему проекту с помощью запроса "классный рецепт".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top