2016-06-20 3 views
1

Учитывая этот код, помещенный в routes.php файла по умолчанию в Laravel 5.1:Is Laravel 5.1 App: singleton работает неправильно?

\App::singleton('CatalogsService', function(){ 
      return new CatalogsService; 
     }); 

Route::group(['prefix' => 'catalogs'], function() { 
    Route::get('statesmx', function(){  

     return var_dump(app('CatalogsService')); 
    }); 

    Route::get('statesmx2', function() { 
     return var_dump(app('CatalogsService')); 
    }); 

    Route::get('statesmx3', function() { 
     return var_dump(app('CatalogsService')); 
    }); 

}); 

Почему я получаю другой экземпляр CatalogsService при переходе к 3 определенным маршрутам?

локальный/каталоги/statesmx отвалов:

object(App\Services\Common\CatalogsService)[152] 

localhost/catalogs/statesmx2 отвалы:

object(App\Services\Common\CatalogsService)[153] 

localhost/catalogs/statesmx3 отвалы:

object(App\Services\Common\CatalogsService)[154] 

Я ожидал получить тот же Id Ссылка на объект.

Единственный способ получить ту же ссылку, добавляя следующий код перед Route::group....

app('CatalogsService'); 

, когда я делаю это на 3 маршруты дамп же ссылку на объект:

object(App\Services\Common\CatalogsService)[106] 

Я не Почему это происходит? Для меня это выглядит так: Laravel Singleton не работает должным образом, если нет чего-то, что мне не хватает в том, как работает Singleton в Laravel.

Благодарим вас за любую помощь или намек на этот вопрос.

PD: Я новичок в Laravel.

ответ

0

В программной инженерии, одноэлементный шаблон является шаблоном, который ограничивает экземпляра класса к одному объекту ...

Таким образом, каждый раз при переходе между маршрутами (каждый запрос) , приложение создает новый экземпляр, который будет использоваться во всем приложении. Даже если вы получаете одну и ту же ссылку на объект между запросами, это не тот же экземпляр.

Singleton означает: создание экземпляра единого объекта для каждого запроса.

От Doc Laravel:

Одноэлементный метод связывает класс или интерфейс в контейнер, который должен быть разрешен только один раз, а затем тот же экземпляр будет возвращен при последующих вызовах в контейнер.

Лучшее место для привязки одноэлементного внутри метода register от AppServiceProvider.

$this->app->singleton('CatalogsService', function ($app) { 
    return new CatalogsService; 
}); 

Удачи.

+0

Hi. Я думаю, что вы в замешательстве. Экземпляром класса и объекта является одно и то же в контексте языков, поддерживающих классы (JS - частный случай, но не является предметом этого вопроса). Итак, если экземпляр создан, это означает, что объект был создан. Такой объект имеет адрес памяти, а ссылка на этот объект указывает на его адрес. – mogarick

+0

В одноэлементном шаблоне цель состоит в том, чтобы убедиться, что существует только один экземпляр класса, поэтому, когда что-то требует и экземпляр/объект класса, возвращаемый экземпляром, должен быть одним и тем же, что означает, что адрес памяти объекта/экземпляра должен быть тоже самое. Если адрес отличается, то мы не говорим об одном экземпляре, поэтому в этом случае у нас нет Singleton. Вот почему я задаюсь вопросом, действительно ли Синглтон в Ларавеле - Синглтон. Это может быть Singleton, но с продолжительностью запроса. Это то, о чем я не уверен. – mogarick

+0

По запросу я имею в виду «Http Request», а не доступ к памяти! –

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