Доступ к контроллерам пакетов в Laravel 4

Я создал пакет, следуя инструкциям «Создание пакета» в документации 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', 'HomeController@showWelcome');

Затем я выполнил этот SO-ответ для настройки контроллера для пакета. Я добавил папку src / controllers в карту классов композитора, затем сбросил автозагрузчик и проверил vendor / composer / 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\HomeController@showWelcome');

но это вызывает ошибку о том, что класс не найден:

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

Я также пробовал вызывать его, используя имя пакета:

Route::get('/package', 'Package::HomeController@showWelcome');

что вызывает ту же ошибку:

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

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

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

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

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

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


person sam    schedule 19.02.2013    source источник


Ответы (3)


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

Route::get('/package', 'Vendor\Package\Controllers\HomeController@showWelcome');

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

Route::get('/package', 'Vendor\Package\HomeController@showWelcome');

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

namespace Vendor\Package;

Контроллер должен выдвинуться, загорится:

\Illuminate\Routing\Controllers\Controller

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

Задача решена.

person sam    schedule 19.02.2013
comment
Я просто играю с Laravel 4 и столкнулся с этой проблемой. Вам действительно нужно добавлять каждый класс в файл vendor / composer / autoload_classmap.php? Вы бы подумали, что без этого можно было бы найти эти классы, не так ли? - person neilcrookes; 15.04.2013
comment
@neilcrookes По соображениям производительности composer генерирует плоскую карту классов всех классов, этот файл создается автоматически, и очень плохая идея редактировать его вручную для чего-либо, кроме быстрого теста. Он создается с использованием информации из вашего файла composer.json. См. getcomposer.org/doc/04-schema.md#autoload. - person rich97; 01.11.2013

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

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

После этого откройте свой терминал и из корневого каталога пакета выполните автозагрузку-дамп композитора.

Работает для меня...

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

ознакомьтесь с этой статьей git, которая может помочь https://github.com/jaiwalker/setup-laravel4-package

person jai    schedule 10.05.2014
comment
Спасибо за раздел Использование контроллера! Добавление контроллеров в карту классов решило мою проблему. - person Mouagip; 29.01.2015
comment
Я рад, что это помогло тебе - person jai; 05.02.2015