2013-02-19 5 views
11

Я создал пакет, следующий за "Creating a Package" instructions in the Laravel 4 documentation. После создания пакета я создал папку «контроллеры» и файл маршрутов. Новая структура файла:Доступ к контроллерам пакетов в Laravel 4

/src 
    /Vendor 
     /Package 
      PackageServiceProvider.php 
    /config 
    /controllers 
    /lang 
    /migrations 
    /views 
    routes.php 
/tests 
/public 

Я добавил маршруты файл на загрузочную часть провайдера пакет услуг:

public function boot() 
{ 
    $this->package('vendor/package'); 
    include __DIR__ . '/../../routes.php'; 
} 

Затем добавляют основной маршрут к файлу маршрутов:

Route::get('/package', function() { 
    return "Package route test"; 
}); 

Посещение моей заявки по указанному маршруту (app.dev/package) возвращает ожидаемое:

Package route test 

Затем добавить основной вызов контроллера к маршруту (с помощью контроллера Laravel по умолчанию, «HomeController») работает:

Route::get('/package', '[email protected]'); 

Я последовал this SO answer для настройки контроллера для пакета. Я добавил папку SRC/контроллеры композитору classmap, то я бросил автозагрузчик и проверил поставщик/композитор/autoload_classmap.php и нашел класс успешно загружен композитором:

<?php 

// autoload_classmap.php generated by Composer 

$vendorDir = dirname(__DIR__); 
$baseDir = dirname($vendorDir); 

return array(
    'HomeController' => $baseDir . '/src/controllers/HomeController.php', 
); 

Теперь я добавил новый контроллер пакетов на маршрут, используя пространство имен:

Route::get('/package', 'Vendor\Package\Controllers\[email protected]'); 

но выдает ошибку о не найти класс:

ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist 

Я также попытался назвать его U петь имя пакета:

Route::get('/package', 'Package::[email protected]'); 

, который производит ту же ошибку:

ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist 

Независимо от того, что я пытаюсь пакет не могу получить доступ к его собственному контроллеру, который композитором подтверждающий загружается (при просмотре поставщика/пакета/autoload_classmap.php).

Любые идеи? Я не уверен, что проблема заключается в том, что композитор не загружает класс, я не уверен, с чего начать с отладки проблемы. Я создал другой пакет и повторил шаги здесь и получил ту же проблему.

я могу получить доступ мнения пакет как из пакета и приложения, например:

View::make('package::view'); 

Проблема, кажется, между композитором загрузки контроллера и Laravel возможность получить к нему доступ.

ответ

16

Ошибка заключалась в том, что в маршруте был указан путь к контроллерам.У меня было следующее:

Route::get('/package', 'Vendor\Package\Controllers\[email protected]'); 

Правильное использование является:

Route::get('/package', 'Vendor\Package\[email protected]'); 

С пространством имен, включенных в контроллер:

namespace Vendor\Package; 

контроллер должен распространяться Осветите:

\Illuminate\Routing\Controllers\Controller 

Sti ll не может использовать имя пакета (например: Package :: HomeController @ showWelcome), но я могу использовать пространство имен. ура.

Проблема решена.

+0

Я просто играю с Laravel 4 и столкнулся с этой проблемой. Вам действительно нужно добавить каждый класс в файл vendor/composer/autoload_classmap.php? Вы могли бы подумать, что он сможет найти эти классы без этого, не так ли? – neilcrookes

+0

@neilcrookes По соображениям производительности композитор генерирует плоскую карту классов всех классов, этот файл генерируется автоматически, и очень плохая идея отредактировать его вручную для чего угодно, кроме быстрого теста. Он генерируется с использованием информации в вашем файле composer.json. См. Http://getcomposer.org/doc/04-schema.md#autoload – rich97

+0

+1 Спасибо, что вернулись и ответили на ваш собственный вопрос. – rich97

6

Вы можете попробовать изменить Vendor/пакет/composer.json и вставьте контроллеры директории для автоматической загрузки/classmap:

.... 
"autoload": { 
    "classmap": [ 
     "src/migrations", 
     "src/controllers", 
     "src/models" 
    ], 
    "psr-0": { 
     "Package\\Controller": "src/" 
    } 
} 
.... 

После этого откройте терминал и из вашего пакета корневого каталога сделать композитор дамп -autoload

работы для меня ...

+0

Насколько я знаю и опыт, это не будет работать для пакетов поставщиков, а только для пакетов в вашем рабочем столе. Попробуйте удалить файл composer.json в пакете поставщика и dump-autoload, это ничего не изменит, поскольку все данные загружаются из файла composer.lock. Вы можете отредактировать файл autoload_classmap.php. Если вы хотите знать, что происходит за сценой, проверьте файл composer.lock и файл autoload_classmap.php, они дают хорошее представление о механике. Пожалуйста, поправьте меня, если я ошибаюсь! – sidneydobber

2

взглянуть в эту мерзавца статье могут быть полезны https://github.com/jaiwalker/setup-laravel4-package

+0

Спасибо за раздел «Использование контроллера»! Добавление контроллеров в classmap решило мою проблему. – Mouagip

+0

Я рад, что это помогло вам – jai

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