Когда я вызывал $ ig-> login ('name', 'pass') в любом методе, вся информация профиля пользователя изменялась в этом объекте, но потом, если я вызываю dd ($ ig = app (Instagram :: class)) в другом методе контроллера я вижу, что предыдущие данные не сохранялись.
Это правильное поведение. Когда в Laravel отправляется новый запрос, создается новый экземпляр Instagram
. Я не уверен, что вы понимаете значение синглтона, но с точки зрения Laravel существует один экземпляр на HTTP-запрос.
Поскольку используемый вами Instagram API не содержит функций для повторной регистрации, я создал класс (он будет находиться в папке app/Classes
).
<?php
namespace App\Classes;
use InstagramAPI\Instagram;
use InstagramAPI\Response\LoginResponse;
class CustomInstagram extends Instagram {
public function relogin(LoginResponse $response) {
$appRefreshInterval = 1800;
$this->_updateLoginState($response);
$this->_sendLoginFlow(true, $appRefreshInterval);
return $this;
}
}
Измените экземпляр singleton, чтобы он использовал класс App\Classes\CustomInstagram
.
$this->app->singleton(Instagram::class, function ($app) {
Instagram::$allowDangerousWebUsageAtMyOwnRisk = true; // As wiki says
return new App\Classes\CustomInstagram();
});
Чтобы использовать объект Instagram
с аутентифицированным пользователем, необходимо как-то сохранить информацию для входа. Он будет размещен там, где происходит вход в систему.
try {
$response = app(Instagram::class)->login($username, $password);
if ($response->isTwoFactorRequired()) {
// Need to handle if 2fa is needed (we're not completely logged in yet)
}
// Can use session to persist \InstagramAPI\Response\LoginResponse but I'd recommend the database.
session(['igLoginResponse' => serialize($response)]);
} catch (\Exception $e) {
// Login failed
}
Затем создайте промежуточное программное обеспечение для повторной регистрации пользователя в Instagram (если ответ на вход существует). Вам необходимо зарегистрировать это как , описанное здесь . Затем синглтон Instagram можно использовать в вашем контроллере.
namespace App\Http\Middleware;
use Closure;
use InstagramAPI\Instagram;
class InstagramLogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$responseSerialized = session('igLoginResponse');
if (!is_null($responseSerialized)) {
$ig = app(Instagram::class);
$response = unserialize($responseSerialized);
$ig->relogin($response);
}
return $next($request);
}
}