Ошибка Laravel: объект класса Torann \ GeoIP \ Location не может быть преобразован в строку - PullRequest
1 голос
/ 06 мая 2019

Я получаю сообщение об ошибке при отправке данных о местоположении в базу данных с использованием Laravel GeoIP::getLocation('2405:204:970a:d9b3:10a3:5280:9064:3f31'),

Ошибка:

Объект класса Torann \ GeoIP \ Location не может быть преобразован в строку

Это мой Auth LoginController.Как вставить данные GeoIP Loacation в базу данных.Пожалуйста, помогите мне

Если я удаляю этот код 'current_location' => GeoIP::getLocation('2405:204:970a:d9b3:10a3:5280:9064:3f31'), Я больше не получаю эту ошибку, все данные вставляются в базу данных, но я добавляю этот код, я получаю эту ошибку

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Jenssegers\Agent\Agent;
use Carbon\Carbon;
use App\User;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Closure;
use GeoIP;
use Location;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;


    function authenticated(Request $request, $user)
  {
    // Chrome, IE, Safari, Firefox, ...
          $agent = new Agent();
        $browser = $agent->browser();
        // Ubuntu, Windows, OS X, ...
         $platform = $agent->platform();


    $user->update([
        'last_signin' => Carbon::now()->toDateTimeString(),
        'ip_address' => $request->getClientIp(),
        'browser_login' => $agent->browser(),
        'browser_version' => $agent->version($browser),
        'device_login' => $agent->platform(),
        'device_version' => $agent->version($platform),
         'current_location' => GeoIP::getLocation('2405:204:970a:d9b3:10a3:5280:9064:3f31'),
        'language' =>  $agent->languages(),
        'root' => $agent->robot(),
        'https' => $request->server('HTTP_USER_AGENT'),
    ]);
  }
    /**
     * Where to redirect users after login.
     *
     * @var string
     */



    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest',['except'=>['logout', 'userLogout', 'profile']]);
    }
     public function userLogout()
    {
        Auth::guard('web')->logout();
        return redirect('/');
    }
}

Auth Route:

//User Auth Route Function
Auth::routes();

Ответы [ 3 ]

0 голосов
/ 06 мая 2019

Возможно, вы пытаетесь использовать метод getLocation из неправильного экземпляра.

1.) Попробуйте следующим образом:

"использовать Torann \ GeoIP \ GeoIPFacade как GeoIP" $ location = GeoIP :: getLocation ();

2.) Или попробуйте, как указано в документации к пакету Geoip (http://lyften.com/projects/laravel-geoip/doc/methods.html) из этого экземпляра \Torann\GeoIP\GeoIP и затем используйте geoip()->getLocation('27.974.399.65');

0 голосов
/ 06 мая 2019

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

Я бы порекомендовал изменить столбец current_location в вашей базе данных, чтобы сделать его типом json.

Тогда вы сможете вставить свои данные как:

    $user->update([
        'last_signin' => Carbon::now()->toDateTimeString(),
        'ip_address' => $request->getClientIp(),
        'browser_login' => $agent->browser(),
        'browser_version' => $agent->version($browser),
        'device_login' => $agent->platform(),
        'device_version' => $agent->version($platform),
        'current_location' => json_encode(GeoIP::getLocation('2405:204:970a:d9b3:10a3:5280:9064:3f31')->toArray()),
        'language' =>  $agent->languages(),
        'root' => $agent->robot(),
        'https' => $request->server('HTTP_USER_AGENT'),
    ]);
0 голосов
/ 06 мая 2019

Это происходит потому, что GeoIP::getLocation('2405:204:970a:d9b3:10a3:5280:9064:3f31') возвращает экземпляр Torann\GeoIP\Location, и вы пытаетесь сохранить его как строку.

При проверке документации этого объекта он имеет следующую форму:

\Torann\GeoIP\Location {

    #attributes:array [
        'ip'           => '232.223.11.11',
        'iso_code'     => 'US',
        'country'      => 'United States',
        'city'         => 'New Haven',
        'state'        => 'CT',
        'state_name'   => 'Connecticut',
        'postal_code'  => '06510',
        'lat'          => 41.28,
        'lon'          => -72.88,
        'timezone'     => 'America/New_York',
        'continent'    => 'NA',
        'currency'     => 'USD',
        'default'      => false,
    ]
}

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

Если вам нужно использовать только один столбец в БД,Вы можете проверить некоторые реализации GeoHashing skthon / geogash .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...