Маршрут к контроллеру в подпапке не работает в Laravel 4

Я обновлял свое приложение Laravel 3 до Laravel 4, когда столкнулся с этой проблемой...

Маршруты, которые я пробовал:

Route::get('backend/login', 'backend/UserController@login');
Route::get('backend/login', 'backend.UserController@login');

person Clifford James    schedule 24.01.2013    source источник
comment
Вы обновили файл автозагрузки? (композитор дамп-автозагрузка)   -  person J.T. Grimes    schedule 24.01.2013
comment
Да, файл автозагрузки обновлен, но проблема не решается.   -  person Clifford James    schedule 24.01.2013
comment
Вы просто получаете 404 или получаете более полезную ошибку? Если вы получите ошибку, можете ли вы опубликовать ее здесь?   -  person J.T. Grimes    schedule 25.01.2013
comment
Кроме того, ваш контроллер находится в пространстве имен?   -  person J.T. Grimes    schedule 25.01.2013
comment
Нет, контроллер не находится в пространстве имен.   -  person Clifford James    schedule 25.01.2013
comment
Я получаю сообщение об ошибке: ReflectionException: бэкэнд класса/UserController не существует   -  person Clifford James    schedule 25.01.2013
comment
Вы когда-нибудь заставляли это работать? Я думаю, вы можете просто сделать Route::get('backend/login', 'UserController@login'); Как только ваши контроллеры зарегистрированы, Laravel просто знает, где они находятся.   -  person Joshua    schedule 18.04.2013


Ответы (7)


У меня была аналогичная проблема всего несколько часов назад, и мне пришлось немного поиграть с ней, чтобы она заработала.

Маршруты:

Route::group(array('prefix' => 'admin'), function() {
    Route::resource('/', 'admin\DashboardController');
});

В "controllers/admin" я помещаю DashboardController:

namespace admin;

use Illuminate\Support\Facades\View;

class DashboardController extends \BaseController {

    public function index()
    {
        return View::make('admin/dashboard');
    }

}

Это сработало на Laravel 4. Надеюсь, вы найдете его достаточно полезным. :)

person Federico Stango    schedule 30.08.2013
comment
Это очень полезно. Вы спасаете положение. - person akbarbin; 20.07.2015

На данный момент в Laravel 4 Beta 1 вы можете «только ?» использовать пространство имен.

Например, здесь, в вашем файле контроллера: app/controllers/backend/UserController.php

<?php namespace Controllers\Backend;

use Illuminate\Routing\Controllers\Controller;

class UserController extends Controller {

    // Note extends Controller and not BaseController

    // Your stuff
}
?>

Итак, в файле: app/routes.php:

<?php
Route::get('backend/login', 'Controllers\Backend\UserController@login');

Я не знаю, лучше ли это, но работаю здесь. Редактирование и дамп-автозагрузка "composer.json" на самом деле не работают.

Если кто-то может улучшить это, он сделает мой день! :)

person Pierre Broucz    schedule 25.01.2013
comment
Все еще не работает: Route: Route::get('backend/login', 'Controllers\Backend\UserController@login'); Класс (в app/controllers/backend/UserController.php): ‹?php namespace Controllers\Backend; используйте Illuminate\Routing\Controllers\Controller; class UserController extends BaseController { Ошибка: ReflectionException: Class Controllers\Backend\UserController не существует - person Clifford James; 25.01.2013
comment
хорошо, как я уже сказал, позаботьтесь о: «класс UserController расширяет контроллер», а не «класс UserController расширяет BaseController» - person Pierre Broucz; 25.01.2013
comment
хм, пример кода дает вам работу здесь:/. Не забудьте запустить composer dump-autoload после добавления/удаления контроллеров: Docs/Controllers - person Pierre Broucz; 25.01.2013
comment
рад помочь вам, получайте удовольствие от laravel сейчас :) - person Pierre Broucz; 25.01.2013
comment
Хорошо, композитор dump-autoload сделал свое дело, но теперь я получаю следующую ошибку: FatalErrorException: Error: Class 'Controllers\Backend\View' не найден в этой строке кода: return View::make('backend.user.login') ; - person Clifford James; 25.01.2013
comment
Хм, это похоже на классическую разработку пакетов... Сегодня я больше не могу это тестировать, но почитайте джейсон льюис для получения дополнительной информации. Вы можете попробовать включить: use Illuminate\View\Environment; в свой контроллер и настроить функцию __construct() - person Pierre Broucz; 25.01.2013
comment
@CliffordJames - эта ошибка возникает, потому что ваше представление находится в другом пространстве имен, чем ваш контроллер. - person Shauna; 24.05.2013

Если вы собираетесь использовать Laravel 4, возможно, вам следует взглянуть на это: вы можете указать пространство имен, которое будет использоваться в группе маршрутов, как вы можете видеть здесь: http://www.laravel-ricks.com/tricks/route-group-namespacing

Итак, в вашем образце:

Route::group(array('prefix' => 'backend', 'namespace' => 'backend'), function()
{

    Route::get('login', 'UserController@login');

});

Работает как часы :)

Я использовал его, и он довольно хорош, он помогает вам сделать ваш код чище и понятнее. Попробуйте!

person facundofarias    schedule 05.06.2014

я рекомендую делать

Route::group(array('prefix' => 'backend'), function() {
    // Responds to Request::root() . '/backend/user'
    Route::resource('login', 'UserController');
});

см. больше информации здесь

Контроллеры вложенных ресурсов Laravel 4 Route::resource('admin/photo', «Фотоконтроллер»); не работает

person Arni Gudjonsson    schedule 29.01.2013

Мой контроллер администратора в каталоге app/controllers

class AdminController extends BaseController {
/**.
 * @return \AdminController
 */
    public function __construct()
    {

    }
}

Теперь у меня есть папка с именем admin в папке контроллеров, т.е. app/controllers/admin, и у меня есть еще один контроллер с именем AdminDashboardController.php

class AdminDashboardController extends AdminController {

/**
 * Display a listing of the resource.
 *
 * @return Response
 */
    public function getIndex()
    {
    return View::make('admin/dashboard');
    }
    }

И, наконец, мой файл Route.php

Route::group(array('prefix' => 'admin'), function()
{
    # Admin Dashboard
    Route::controller('/', 'AdminDashboardController');
 });

Надеюсь это поможет ..:-)

person Hassan Jamal    schedule 21.04.2014

Как объяснено здесь, в Laravel 4.1 вы можете указать пространство имен, которое будет использоваться в группе маршрутов, как вы можете видеть здесь: http://www.laravel-tricks.com/tricks/route-group-пространствоимен

Я использовал его, и он довольно хорош, он помогает вам сделать ваш код чище и понятнее. Попробуйте!

person facundofarias    schedule 03.06.2014

Вы также можете поместить свой бэкэнд/админ-панель в пакет... плод для размышлений :)

person Kevin Op den Kamp    schedule 01.05.2013