Доступ к контроллерам пакетов в 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', '[email protected]');

Затем я выполнил этот ответ 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\[email protected]');

но это приводит к ошибке об отсутствии класса:

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

Я также пробовал называть его с помощью имени пакета:

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

namespace Vendor\Package;

Контроллер должен расширять освещение:

\Illuminate\Routing\Controllers\Controller

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

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

Ответ 2

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

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

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

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