Класс не найден в Laravel 5 при регистрации в контейнере IoC

В Laravel 5 я пытаюсь добавить MyClass в контейнер IoC.

Итак, я добавляю следующую структуру:

app / Libs / MyClass.php

<?php namespace App\Libs;

use App\Interfaces\MyClassInterface;

class MyClass implements MyClassInterface {

    public function list($itemId)
    {
        // do any things
    }

}

приложение / Фасады / MyClassFacade.php

<?php namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class MyClassFacade extends Facade {

        protected static function getFacadeAccessor()
        {
                return 'myclass';
        }
}

app / Providers / MyClassServiceProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use App\Libs\MyClass;
class MyClassServiceProvider extends ServiceProvider {
    public function boot()
    {
        //
    }
    public function register()
    {
        $this->app->bind('myclass', function () {
            return new MyClass();
        });
    }
}

app / config / app.php (у провайдеров)

'App\Providers\MyClassServiceProvider',

app / config / app.php (в псевдонимах)

'MyClass' => 'App\Facades\MyClassFacade',

приложение / Http / Controllers / MyClassController.php

<?php namespace App\Http\Controllers;

class MyClassController {

public function index($itemId = null)
{
    $itemList = MyClass::list($itemId); // this is line error

    return view('item.list')->with($itemList);
}

приложение / HTTP / routes.php

Route::pattern('numeric', '[0-9]+');
Route::get('item/{numeric?}', array('as' => 'item_list', 'uses' => 'MyClassController@index'));

Затем я выполнил команду

composer update

и

composer dump-autoload

Но всегда я получаю эту ошибку:

Class 'App\Http\Controllers\MyClass' not found

Где я ошибаюсь?


person JulianoMartins    schedule 06.10.2014    source источник


Ответы (1)


В строке с ошибкой нужно использовать:

$itemList = \MyClass::list($itemId); // this is line error

вместо:

$itemList = MyClass::list($itemId); // this is line error

или измените этот файл на:

<?php namespace App\Http\Controllers;

use MyClass;

class MyClassController {

public function index($itemId = null)
{
    $itemList = MyClass::list($itemId); // this is line error

    return view('item.list')->with($itemList);
}

Это не специфическая проблема Laravel. Вот как вы используете пространства имен. Подробнее на Как использовать объекты из других пространств имен и как импортировать пространства имен в PHP

person Marcin Nabiałek    schedule 06.10.2014
comment
Я не могу этого сделать, Марчин, потому что таким образом вы сказали, что класс MyClass должен быть статическим классом. Я знаю, что, поскольку у объекта есть псевдоним, об остальном позаботится контейнер. - person JulianoMartins; 06.10.2014
comment
@JulianoMartins Не совсем. Если вы используете здесь MyClass::, вы сообщаете PHP, что хотите использовать MyClass из текущего пространства имен. Единственный способ решить эту проблему - либо добавить начальную обратную косую черту, чтобы указать, что этот класс находится в глобальном пространстве имен (как вы определили свой псевдоним), либо использовать импорт пространства имен с use. Другого пути нет, если Контроллер не находится в глобальном пространстве имен. - person Marcin Nabiałek; 06.10.2014
comment
Марцин Набялек, ты прав. Теперь все отлично поработало! Спасибо! - person JulianoMartins; 06.10.2014