#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. Извините, у меня нет хорошего представления о привязке синглтона. Комментарий был основан только на предположении. Лучше, если кто-то с большим количеством знаний добавит ответ, или я опубликую ответ после некоторого чтения.