Laravel — Создает экземпляр объекта и сохраняет его во всех методах контроллера

#laravel #object #constructor #controller

Вопрос:

Я работаю с этим случаем, когда мне нужно создать экземпляр объекта после отправки формы в контроллере. Все работает нормально, пока я не вызову этот объект (как свойство) из другого метода. Похоже, он равен нулю.

Если я создам объект с помощью метода конструктора, у меня вообще не будет проблем.

Я не могу поддерживать этот объект в сеансе из-за закрытия.

Вот что я получил до сих пор.

// Версия с включенным объектом в конструкторе, который работает

 class SearchConsoleController extends Controller
{
   private $console;

   protected function __construct() {
     $callback = route('searchconsole.callback') ;
     $this->console = $this->setConsole(env('CLIENT_ID'), env('CLIENT_SECRET'), $callback);
   }

   private function setConsole($cliendId, $cliendSecret, $callback){
     $console = new Console(new Google_Client(), $cliendId, $cliendSecret, $callback);
     return $console;
   }

   public function index(Request $request) {
     return view('searchconsole.index')->with('authUrl', $this->console->getAuthUrl());
   }

   public function callback(Request $request){
      if ($request->has('code')) {
         $this->console->acceptCode($request->get('code'));
         return redirect()->action('SearchConsoleController@listSites', [$request]);
      }
      else{
         die('error');
      }
    }
 

Теперь версия, в которой я застрял с

 class SearchConsoleController extends Controller
{
   private $console;
   private $callback;

   protected function __construct() {
     $this->callback = route('searchconsole.callback') ;
   }

   private function setConsole($cliendId, $cliendSecret, $callback){
     $console = new Console(new Google_Client(), $cliendId, $cliendSecret, $this->callback);
     return $console;
   }

   public function index(Request $request) {
     // VIEW WITH A FORM FROM WHICH I GET CLIENT_SECRET amp; CLIENT_ID var

     return view('searchconsole.index');
   }

   public function getAuthUrl(Request $request) {
      // FORM FROM INDEX IS SUBMITTED
      $clientId = ($request->has('google-client-id'))  ? 
          $request->get('google-client-id') : 
          null
      ;
    
      $clientSecret = ($request->has('google-client-secret'))  ? 
          $request->get('google-client-secret') : 
          null
      ;

    $this->console = $this->setConsole($clientId, $clientSecret, $this->callback);
    return $this->console->getAuthUrl();
   }

   public function callback(Request $request){
      if ($request->has('code')) {
         //    ***** MY PROBLEM *********
         $this->console->acceptCode($request->get('code')); // HERE $this->console IS NULL;
         //    *******************
         return redirect()->action('SearchConsoleController@listSites', [$request]);
      }
      else{
         die('error');
      }
    }
 

I just can’t figure out how I can do this so console is still available

Обновить :

следуя @iamab.in совет, я заглянул в поставщика услуг, но я просто не знаю, как я могу создать экземпляр объекта консоли в поставщике услуг.

Вот что я сделал.

 namespace AppProviders;

use IlluminateSupportServiceProvider;
use AppHelpersConsole;
use Google_Client;
use IlluminateSupportFacadesRoute;

class AppServiceProvider extends ServiceProvider
{
   /**
    * Register any application services.
    *
    * @return void
    */
    public function register()
    {
        $this->app->bind(Console::class, function() {
           $request = app(IlluminateHttpRequest::class);
    
           $clientId = ($request->has('google-client-id'))  ? 
             $request->get('google-client-id') : 
             null
           ;
           $clientSecret = ($request->has('google-client-secret'))  ? 
            $request->get('google-client-secret') : 
             null
           ;
           $callback = Route::get()->name('searchconsole.callback');
           return new Console(new Google_Client(), $clientId, $clientSecret, $callback);
         });
    }

  public function boot(){}
  ....
 

Я просто не знаю, как и где это реализовать.

Еще раз спасибо

Обновление № 2 :

хорошо, мое решение работало, я просто не запустил правильное приложение ….. 😅

Комментарии:

1. Я думаю, вы могли бы использовать одноэлементную привязку laravel. Посмотрите на этот документ. Вы можете создать экземпляр Google_Client объекта или Console объекта, который применим.

2. Могу попробовать прямо сейчас, но, похоже, это то, что я искал! Спасибо! Посмотрю как можно скорее

3. @iamab.in : не могли бы вы, пожалуйста, опубликовать свой ответ, чтобы я мог отметить его как правильный ответ? еще раз спасибо, чувак, ты спас мой @$$

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