Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

nolros's avatar
Level 23

PHP / Laravel Mapping Best Practice

As I'm sure many of you know social sites return user credentials in different formats and keys. Socialite does an ok job in pull the main ones to root of array, but anything else requires some digging.

Example, some will return with email, some with emailAddress. As I attempt to map them I find the if else growing. Is there a better way to do this? Example, array_fetch.

    public function setUserFromSocial( $userData )
    {
        $addUser = array();

        if ( isset( $userData->email ) )
        {
            $addUser['email'] = $userData->email;
        }
        elseif ( isset( $userData->emailAddress ) )
        {
            $addUser['email'] = $userData->emailAddress;
        }
        else
        {
            $addUser['email']  = null;
        }

        if ( isset( $userData->username ) )
        {
            $addUser['username'] = $userData->username;
        }
        elseif ( isset( $userData->nickname ) )
        {
            $addUser['username'] = $userData->nickname;
        }
        else
        {
            $addUser['username']  = null;
        }

        if ( isset( $userData->first_name ) )
        {
            $addUser['first_name'] = $userData->first_name;
        }
        elseif ( isset( $userData->user['first_name'] ) )
        {
            $addUser['first_name'] = $userData->user['first_name'];
        }
        else
        {
            $addUser['first_name']  = null;
        }
        
        $addUser['last_name']   = ( isset( $userData->last_name ) ) ? $userData->last_name : null;
        $addUser['locale']      = ( isset( $userData->locale ) ) ? $userData->locale : null;

        return $addUser;
    }
0 likes
2 replies
acasar's avatar
acasar
Best Answer
Level 13

I don't think there is currently any good way to do it... In PHP 5.3+ something like that might work:

public function setUserFromSocial( $user )
{
    return {
        'email'  => @$user->email ?: $user->emailAddress ?: null,
        'username' => @$user->username ?: $user->nickname : null,
        'first_name' => @$user->first_name ?: $user->user['first_name'] : null,
        'last_name' => @$user->last_name ?: null,
        'locale'  => @$user->locale ?: null;
    };
}

Of course in PHP 7 you'll be able to clean it up even further:

public function setUserFromSocial( $user )
{
    return {
        'email' => $user->email ?? $user->emailAddress ?? null,
        'username' => $user->username ?? $user->nickname ?? null,
        'first_name' => $user->first_name ?? $user->user['first_name'] ?? null,
        'last_name' => $user->last_name ?? null,
        'locale' => $user->locale ?? null;
    };
}
1 like
nolros's avatar
Level 23

@annze thank you, but found a better way using laravel array helper. Let me know what you think:

EDIT: this does not really work as it will just map all values and also not add null.

       $addUser = array();

        $userKeys = [
            'id',
            'email',
            'emailAddress',
            'username',
            'nickname',
            'first_name',
            'last_name',
            'locale',

        ];
 
        $addUser['social']       = array_where($userData->user, function($key, $data) use ($userKeys)
        {
            return array_where($userKeys, function($k, $userKey) use ($key)
            {
                return ( $key === $userKey ) ?: false;
            });
        });

Laravel helpers for the win.

Please or to participate in this conversation.