2015-06-29 9 views
0

В моем приложении Laravel я разбиваю код переднего и заднего конца на папку. Это app/Http/Controllers/BackEnd и app/Http/Controllers/FrontEnd. Вместо того, чтобы вводить все данные в каждом файле, я думал, что будет проще определить два пространства имен: BackEnd и FrontEnd. Я отредактировал мой файл композитор этого:Laravel 5 не может найти класс для пользовательского пространства имен

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

Я побежал композитор автосамосвалы и настроить свой файл маршрут, как это:

Route::group(['prefix' => 'webman', 'middleware' => 'auth', 'namespace' => 'BackEnd'], function() 
{ 
    Route::get('/', ['as' => 'webmanHome', 'uses' => '[email protected]']); 
}); 

Но когда я просматриваю к localhost:8000/webman/ я просто получаю сообщение об ошибке, Class App\Http\Controllers\BackEnd\HomeController does not exist. Контроллер действительно существует, это файл:

<?php namespace BackEnd; 

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 

class HomeController extends Controller { 

    /** 
    * Display the admin home page, showing the front-end menu and "apps" as links to other sections of the ACP. 
    * 
    * @param Reqeust  $request 
    * 
    * @return View 
    */ 
    public function index(Request $request) 
    { 
     return view('backend.index'); 
    } 

} 

Я проверил vendor/composer/autoload_psr4.php, чтобы убедиться, что пространство имен определяется и оно, это в возвращаемом массиве 'BackEnd\\' => array($baseDir . '/app/Http/Controllers/BackEnd'),.

Странно, если я использую <?php namespace App\Http\Controllers\BackEnd; наверху HomeController.php, тогда все работает, почему? Что мне не хватает? Почему автозагрузка не может найти файл только с BackEnd?

+0

Возможно, ваш шаблон лезвия пытается получить доступ к контроллеру в неправильном месте. (если вы используете ссылку «действие»), поэтому укажите контроллер в лезвии, как BackEnd \ HomeController @ lala – animaacija

ответ

3

При установке namespace в Route::group() фактически это добавляется к App\Http\Controllers. Что вы можете сделать, это удалить его и ссылки на полный путь, как так:

Route::group(['prefix' => 'webman', 'middleware' => 'auth'], function() 
{ 
    Route::get('/', ['as' => 'webmanHome', 'uses' => '\BackEnd\[email protected]']); 
}); 
+0

Спасибо, это решает мою проблему. Не могли бы вы объяснить, почему использование '' namespace '=>' \ BackEnd'' тоже не работает? – Styphon

+1

Значение 'namespace' обрезается косой чертой, а затем добавляется в' App \ Http \ Controllers'. Взгляните на источник, а именно на метод 'formatUsesPrefix()' в 'vendor/laravel/framework/src/Illuminate/Routing/Router.php'. – user2479930

0

изменение Try/комментируя строку ниже в RouteServiceProvider.php protected $namespace = 'App\Http\Controllers';

+1

Возможно, было бы неплохо включить информацию о том, что это делает и как это может нарушить другие маршруты. – user2479930

0

Там интересный и простой способ обойти эту проблему. .. Поставщики услуг.

Когда файл маршрута загружается через поставщика, «Приложение \ Http ...» не применяется.

public function boot() 
{ 
    $this->loadRoutesFrom(app_path('Your/Model/routes.php')); 
} 

Имейте в виду, что никакое промежуточное ПО не прилагается. Ваша группа маршрутов должна будет указать «промежуточное» веб-соединение, иначе вы будете гадать, почему валидация и т. Д. Больше не работает ... (был там!)

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

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