Привет, друзья. Хочу сегодня поделится своим взглядом на то, как можно сделать простую и эффективную авторизацию/регистрацию пользователей через любую социальную сеть, используя плагин Ulogin. Почему через этот плагин? Потому что он может избавить разработчика от кучи головной боли, которая возникнет при синхронизации с каждой социальной сетью в отдельности. Плюс вы сможете получить данные из плагина в едином красивом формате.

Я исхожу из того, что читатель разбирается во фреймворке Laravel 5.3 Поэтому я не буду разжевывать простые вещи. Итак, с чего начать? Для начала нам нужно на странице регистрации и авторизации подключить JS плагин. Лично я делаю это через создание отдельного шаблона auth/social.blade.php В который помещаю следующий простой код:

{{-- Social buttons--}}

<div class="text-center margin-bottom-20" id="uLogin"
     data-ulogin="display=panel;theme=flat;fields=first_name,last_name,email,nickname,photo,country;
                             providers=facebook,vkontakte,odnoklassniki,mailru;hidden=other;
                             redirect_uri={{ urlencode('http://' . $_SERVER['HTTP_HOST']) }}/ulogin;mobilebuttons=0;">
</div>

@section('js')
    <script src="//ulogin.ru/js/ulogin.js"></script>
@endsection

Немного объяснений к коду. urlencode используем для кодирования строки к нормальному для передачи по http виду. На redirect_uri будет приходить ответ от сервера Ulogin со статусами и данными. В поле fields мы указываем, какие данные нам нужно получить из социальной сети. В конце шаблона я подключаю сам плагин. Обратите внимание, что здесь происходит вставка кода в блок 'js', который должен быть прописан в главном шаблоне: yield('js')

Да, один момент. Если вы работаете по SSL, то вместо 'http://' указывайте 'https://'. Тогда не будет предупреждения о небезопасной передаче данных.

Когда шаблон готов, то мы его просто подключаем на странице регистрации и залогинивания в том месте, где нам нужно, просто вставив в шаблоне одну строчку: include('auth.social')

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

Теперь нам нужно написать бэкенд часть. А именно создать контроллер и роут. Роут будет получать ответ от сервера Ulogin и передавать его в наш контроллер.

Создаем контроллер с названием UloginController.php и прописываем в нем публичный метод login в который передаем запрос.

Создаем роут: Route::post('ulogin', 'UloginController@login');

Есть еще один нюанс! В Laravel есть защита от CSRF атак. А значит, передача данных с другого сервера не будет иметь токена безопасности и случится ошибка безопасности. Для того, чтобы это пофиксить, необходимо в посреднике (middleware) VerifyCsrfToken.php прописать исключение для нашего роута (пути): protected $except = ['ulogin'];

Теперь, когда сервер вернет ответ на '/ulogin', токен безопасности будет проигнорирован и ошибки не произойдет.

Теперь напишем сам контроллер:

<?php
/**
 * Ulogin.ru auto registration or login.
 */
namespace App\Http\Controllers;

use App\User;
use Auth;
use Hash;
use Illuminate\Http\Request;
use Redirect;

class UloginController extends Controller
{

// Login user through social network.
    public function login(Request $request)
    {
        // Get information about user.
        $data = file_get_contents('http://ulogin.ru/token.php?token=' . $_POST['token'] . '&host=' . $_SERVER['HTTP_HOST']);
        $user = json_decode($data, TRUE);

        $network = $user['network'];

        // Find user in DB.
        $userData = User::where('email', $user['email'])->first();

        // Check exist user.
        if (isset($userData->id)) {

            // Check user status.
            if ($userData->status) {

                // Make login user.
                Auth::loginUsingId($userData->id, TRUE);
            }
            // Wrong status.
            else {
                \Session::flash('flash_message_error', trans('interface.AccountNotActive'));
            }

            return Redirect::back();
        }
        // Make registration new user.
        else {

            // Create new user in DB.
            $newUser = User::create([
                'nik' => $user['nickname'],
                'name' => $user['first_name'] . ' ' . $user['last_name'],
                'avatar' => $user['photo'],
                'country' => $user['country'],
                'email' => $user['email'],
                'password' => Hash::make(str_random(8)),
                'role' => 'user',
                'status' => TRUE,
                'ip' => $request->ip()
            ]);

            // Make login user.
            Auth::loginUsingId($newUser->id, TRUE);

            \Session::flash('flash_message', trans('interface.ActivatedSuccess'));

            return Redirect::back();
        }
    }
}

Как видно из кода, мы вначале проверяем, есть ли в нашей базе пользователь с таким email адресом. Если есть, то мы его сразу залогиниваем. Если нет, то мы вначале создаем пользователя в базе, а потом залогиниваем. Вероятность того, что кто-то создаст аккаунт в социальной сети с email адресом того, кто на вашем сайте уже зарегистрирован, для того, чтобы войти в чужой аккаунт, практически сведена к нулю, так как социальные сети требуют проверки указанного адреса.

Какие поля в базе данных видно из кода. Для вывода текстового сообщения я использую функцию перевода trans(), что позволяет мне использовать любые языки на сайте.

Вот и все. Просто, эффективно и очень гибко. В следующий раз, если будет время, я напишу о том, как можно автоматически залогинить/зарегистрировать пользователя, когда гость ставит лайк посту или жмет на кнопку создания комментария на вашем сайте. Там все посложнее, но тоже гибко и эффективно.
Поделиться с друзьями
-->

Комментарии (62)


  1. AlterEgoDi
    20.01.2017 17:58

    Вопрос: при авторизации ВКонтакте E-mail возвращает?


    1. Kirill_Dan
      20.01.2017 17:58

      Да, возвращает.


    1. OtshelnikFm
      20.01.2017 18:11

      Смотря как пользователь зарегистрирован в ВК. Не все сейчас регистрируются через эмейл. В этом случае эмейла нет


      1. Kirill_Dan
        20.01.2017 18:16

        Ну этого нюанса я не знаю, честно говоря. Если сервер мыло не передаст, то скрипт может бросить исключение. Нужно тогда ставить проверку на существование мыла.


  1. Kirill_Dan
    20.01.2017 18:25

    Для проверки существования мыла, нужно вставить проверку:

    // Check exist email.
            if (isset($user['email']) && !empty($user['email'])) {
                // Здесь основной код
            }
            \Session::flash('flash_message_error', trans('interface.NotEmail'));
    
            return Redirect::back();
    


  1. Kirill_Dan
    20.01.2017 18:36

    Ааа, господа и дамы. Стормозил, простите. Если какого-либо поля в социальной сети не будет, включая мыло, то во всплывшем окошке ulogin попросит пользователя заполнить недостающие поля. Поэтому, если Вконтакте не содержит мыло, то пользователю предложат его ввести отдельно во время авторизации на вашем сайте. Так что проблемы как бы и нет.


  1. dMarley
    20.01.2017 18:45

      // Find user in DB.
            $userData = User::where('email', $user['email'])->first();
    
            // Check exist user.
            if (isset($userData->id)) {
               ...
            }
            // Make registration new user.
            else {
               ...
                ]);

    А почему бы не использовать findOrNew? И к тому же, можно проверку сделать намного проще в Вашем случае:


    if($userData)

    Ведь если такой пользователь не будет найдет, в $userData будет null.


    1. dMarley
      20.01.2017 18:49

      firstOrCreate, если точнее.


      1. Kirill_Dan
        20.01.2017 18:57

        Можно, конечно можно так, как и вы предлагаете. Так будет даже проще. Но все равно нужно будет делать условие для вывода разных сообщений. Поэтому я решил и не морочить себе голову.


        1. dMarley
          20.01.2017 19:07

          Сообщений каких?


          \Session::flash('flash_message', trans('interface.ActivatedSuccess'));
          \Session::flash('flash_message_error', trans('interface.AccountNotActive'));

          Этих?


          1. Kirill_Dan
            20.01.2017 19:11

            Да.


            1. dMarley
              20.01.2017 19:14

              Так ведь firstOrCreate вернет Вам инстанс юзера, его статус и можно проверять для вывода сообщения (или его отсутствия). Еще есть замечательный метод exists, который поможет Вам в выводе сообщения об успешной регистрации.


              1. Kirill_Dan
                20.01.2017 19:21

                Согласен, но ведь все равно нужно будет писать условие. А значит как именно сделать проверку и регистрацию становится не особо принципиальным. Хотя вы говорите про Ларавел вей, что очень правильно.


              1. Kirill_Dan
                20.01.2017 19:25

                Да, кстати. Почему не стоит тут применять firstOrCreate. Дело в том, что аргументы нужно прописывать в методе, полученные от социальной сети. И все они должны совпадать с существующим профилем. Но может получится так, что пользователь изменил некоторые данные в профиле. Тогда будет произведена попытка регистрации и ошибка по не уникальности емаил.


              1. MetaDone
                20.01.2017 19:54

                если сделать так

                $newUser = User::firstOrCreate([
                                'nik' => $user['nickname'],
                                'name' => $user['first_name'] . ' ' . $user['last_name'],
                                'avatar' => $user['photo'],
                                'country' => $user['country'],
                                'email' => $user['email'],
                                'password' => Hash::make(str_random(8)),
                                'role' => 'user',
                                'status' => TRUE,
                                'ip' => $request->ip()
                            ]);
                

                то последует попытка создать нового пользователя, т.к. Hash::make('any_string') будет все время различаться


                1. Kirill_Dan
                  20.01.2017 20:07

                  Кстати, тоже хорошее замечание.


  1. MetaDone
    20.01.2017 19:47
    +2

    https://github.com/laravel/socialite — почему не использовали этот способ?


    1. Kirill_Dan
      20.01.2017 20:06
      -4

      Потому что то решение, которое написал я, быстрее написать, чем установить и настроить пакет socialite. Плюс вся «магия» и головная боль по работе с социалками лежит на сервере ulogin. Я же просто работаю с json массивом. Плюс ко всему прочему, я использую всякие диалоговые окошки для мгновенной авторизации, формируя их аяксом на лету, и прочие плюшки. Поэтому мне гораздо проще работать со своим решением (простым, как угол дома, всего с одним роутом и одним контроллером), чем допиливать напильником чужое. Хотя каждый выбирает то, что удобно/выгодно/и т.д. ему конкретно. Я же люблю иногда создавать свои решения под мои конкретные задачи. И если случается где-то трабла, то я не жду, пока автор пакета его допилит, пофиксит, выпустит новый релиз. Я свое решение смогу доработать/пофиксить в течении нескольких минут. Но, опять таки, каждый выбирает свой путь. И очень часто многие разработчики хотят поставить пакет и забыть. Но я часто использую нетрадиционные и нестандартные подходы, поэтому большинство готовых решений мне просто не подходит.


    1. Kirill_Dan
      20.01.2017 20:10
      -3

      Плюс, этот пакет работает только с рядом социалок: Laravel Socialite provides an expressive, fluent interface to OAuth authentication with Facebook, Twitter, Google, LinkedIn, GitHub and Bitbucket. А ulogin со всеми существующими.


      1. MetaDone
        20.01.2017 20:20

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

        public function redirectToProvider($driver)
            {
                if(empty(config('services.'.$driver))){//нет драйвера - нужно что-то сделать
                    abort(404);
                }
                return Socialite::driver($driver)->redirect();
            }
        

        этот пакет работает только с рядом социалок:

        нужно больше социалок? не вопрос — https://socialiteproviders.github.io/


        1. Kirill_Dan
          20.01.2017 20:29
          -1

          Я с вами согласен в том, что чем меньше от внешних сервисов зависишь, тем лучше. Но от этого все равно не уйти, к сожалению. Сегодняшние web решения много от чего внешнего зависят. Да хоть те же скрипты для бутстрапа, фронтенд фреймворка и т.д. А написать свое грамотное и независимое решение по авторизации через социалки из коробки — это очень приличный кусок работы. А сделать его еще и гибким, с легкой интеграцией в фронтенд фроймворки, с красивой передачей данных через свое API и т.д., то в какой то момент приходит понимание, что уже ничего не хочется.


          1. MetaDone
            20.01.2017 20:33

            библиотека и внешний сервис — немного разные зависимости. Если библиотека окажется с багом — я могу отправить pull-request туда, а если не примут — использовать свой форк на крайний случай. А если тот же самый ulogin ляжет — что тогда делать?


            1. Kirill_Dan
              20.01.2017 20:38
              -2

              Тогда в ритме танго отключать виджет (закомментировать в шаблоне одну строчку) и всем юзерам придется жать кнопку восстановления своего пароля. Если вспомнят свой email. Торба будет! Тут без вариантов. Но вот пару дней назад глюканул фэйсбук по всему миру, и народ не мог зайти в свои аккаунты. Так что тут тоже вопрос интересный. Если пользователь новый, то он может зарегистрироваться в родной форме регистрации. А для зареганных можно хранить очень долгую куку.


        1. Kirill_Dan
          20.01.2017 20:32
          -2

          Но огромный минус внешнего сервера авторизации в том, что если ляжет он, то и наш сайт тоже приболеет. Это очевидно. Но как тут быть, что лучше/проще/дешевле — это уже философский вопрос.


  1. nukedsun
    20.01.2017 20:16
    +1

    uLogin — штука хорошая, удобная, но — спорная. Не зависит ни от какого фреймворка, написано куча плагинов… Но жесткая привязка авторизации к чужому сайту у меня в свое время перевесило чашу весов в пользу как вы выражаетесь — «головной боли», и hybridauth


    1. Kirill_Dan
      20.01.2017 20:22
      -2

      Здесь с вами спорить тяжело. Это сложный выбор. Но взять и ручками написать авторизацию с кучей социалок, следить за изменением их API и так далее, это тоже задача непростая. Везде завести сигнатуры, везде зарегаться, как разработчик и еще куча всего. Если речь идет о трех-шести социалках, то может через OAuth и надежнее будет. Но когда социалок много — это headache еще та. Выбор сложный.


  1. greabock
    21.01.2017 02:35
    +4

    Судя по коду, автор вообще не имеет опыта с Laravel. Да и в целом стиль, мягко говоря, хромает.


    1. Kirill_Dan
      21.01.2017 13:59

      Я был бы вам очень сильно благодарен, да и все читатели тоже, если бы вы взяли эту горстку кода, и переписали так, как вы считаете будет идеально и с Ларавел вей. Ведь написать гораздо быстрее, чем даже сказать. Покажите класс?


      1. Big_Shark
        21.01.2017 14:28
        +1

            public function login(Request $request, uLoginService $uLogin)
            {
                $data = $uLogin->getUserInfo($request->get('token'));
        
                $user = User::where('email', $data->email])->first();
        
                if (null === $user) {
                    $user = User::createFromULogin($data);
        
                    \Session::flash('flash_message', trans('interface.ActivatedSuccess'));
                }
        
                Auth::loginUsingId($user->id, TRUE);
        
                return Redirect::back();
            }

        Ну хотя-бы как-то так.


        1. Kirill_Dan
          21.01.2017 14:39
          -1

          Вопрос. Зачем ради сокращения двух строчек кода, писать свой сервис провайдер и фасад? В чем преимущество, или смысл? Всю «магию» перебросили в итоге в пакет, но смысла это не поменяло! Читал как-то статью от автора Джанго на питоне. Так человек пытался объяснить, что делать класс с двумя строчками кода — это путь в никуда. И мол, сегодняшние программисты дошли до полного абсурда. Что в итоге не упрощает приложение, а очень сильно его усложняет. Выглядит изящнее, бесспорно. Но ради этого делать еще один пакет с пару строк кода, лично я считаю уже чересчур. Спасибо вам за конструктив, это приятно видеть.


          1. franzose
            21.01.2017 14:53
            +1

            А причем тут еще один пакет? uLoginService — это отдельный класс, а не пакет.


            1. Kirill_Dan
              21.01.2017 15:00
              -1

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


              1. Big_Shark
                21.01.2017 15:05
                +2

                Для того чтобы можно было все это протестировать, для того чтобы заменить file_get_contents на curl с таймаутом, для того чтобы проверить что мы получили валидный json и так далее, и тому подобное.


                1. Kirill_Dan
                  21.01.2017 15:10
                  -1

                  Тоже верно. Но это двойная работа. Сам сервер нам либо валидный json возвращает, либо error. Хотя, вы правы. Лучше не доверять получаемым данным и контролировать их самому. Но суть статьи была не в том, чтобы показать примочки кодинга, а в еще одном методе, как можно авторизироваться через социалки. Но ваше замечание дельное, благодарю.


              1. ellrion
                23.01.2017 18:25

                Потому что у вас не две строчки кода. Потому что так будет проще тестировать. Потому что так читабельнее. Потому что такой код легче в поддержке.


        1. Kirill_Dan
          21.01.2017 14:47

          Да, кстати, запрост передается постом!


          1. franzose
            21.01.2017 14:52

            И что? $request->get('token') позволяет получить данные как из $_GET, так и из $_POST. Название метода в данном случае означает «получить», а не «получить из $_GET».


            1. Kirill_Dan
              21.01.2017 15:05

              Ок, согласен. Просто в документации не нашел четкого описания, что POST он также получает. Только про проверку полученного из запроса метода нашел. Спасибо за пояснение.


              1. ellrion
                23.01.2017 18:21

                что бы не сбиваться можно использовать метод $request->input($key)


  1. OnYourLips
    21.01.2017 12:40
    +2

    За такой код в нормальных компаниях принято увольнять.

    Вы не используете пакет Laravel Socialite и переизобретаете то, что он и так уже делает.
    Вы не умеете пользоваться классом Request и неправильно обрабатываете запрос.
    Вы игнорируете соглашение PSR-2, которому следует Laravel.
    В вашем коде есть ошибки с неопределенными индексами.

    Представьте, какую свинью вы подкладываете человеку, которому придётся работать с этим после вас.


  1. Kirill_Dan
    21.01.2017 13:54
    -4

    За такой код в нормальных компаниях принято увольнять.


    А где вы работаете?

    Вы не используете пакет Laravel Socialite и переизобретаете то, что он и так уже делает.


    Вы точно программист? Ведь вам так лень что-то свое писать. Про чтобы просто вникнуть в суть задачи, так вообще молчу.

    Вы не умеете пользоваться классом Request и неправильно обрабатываете запрос.


    Конкретно укажите на код! А то пока выглядит, как гав-гав-гав.

    Вы игнорируете соглашение PSR-2, которому следует Laravel.


    Вы серьезно? https://laravel.com/docs/5.3/structure#the-app-directory А вы вообще в курсе, что это значит?

    В вашем коде есть ошибки с неопределенными индексами.


    Я глянул ваши другие комментарии и сколько вам наплевали за ваш «профессионализм» в карму, так походу это у вас ошибка в ДНК.

    Представьте, какую свинью вы подкладываете человеку, которому придётся работать с этим после вас.


    Лучше не нужно про свиней, а то ваше похрюкивание вас выдает.

    П.С. Бог ты мой! Во что превратилась Хабра! Неужели все адекватные люди уже убежали отсюда?!


    1. franzose
      21.01.2017 14:51

      PSR-2 не про папочки, а про стиль кодирования.


      1. Kirill_Dan
        21.01.2017 15:17
        -2

        Я использую последний PhpStorm, с подключенным модулем Ларавел. И он автоматически использует код стайл с отступами в 4 пробела, переносами скобки и т.д… Лично я не вижу в этом ничего смертельного. Хотя с удовольствием прочел бы рекомендацию Тейлора по Ларавел код стайл. Изменить его — это дело нескольких минут.


      1. Kirill_Dan
        21.01.2017 15:19

        Я глянул ваш профиль, вы раньше писали статьи. Если не секрет, почему сейчас не пишите?


        1. franzose
          21.01.2017 15:21

          Своих идей для статей пока нет, а переводами заниматься не очень хочется.


          1. Kirill_Dan
            21.01.2017 15:26

            У меня есть миллион идей (особенно по аналитике). Если интересно, можем скооперироваться.


    1. OnYourLips
      21.01.2017 16:09
      +1

      А где вы работаете?
      Переход на личности — это хамство. Мы не меня или вас обсуждаем, а конкретную статью с конкретным кодом.

      Вы серьезно?
      Серьезно. Установите phpcs в ваш PhpStorm и проверьте.

      Я глянул ваши другие комментарии и сколько вам наплевали за ваш «профессионализм» в карму, так походу это у вас ошибка в ДНК.
      «Достойная» реакция на критику. Такие же, как и вы, карму и слили мне. Потому что объективная критика бьёт сильнее, чем необоснованные прямые оскорбления.


      1. Kirill_Dan
        21.01.2017 16:28

        Объективную критику выражают такие пользователи, как: franzose, Big_Shark, nukedsun и MetaDone. И я им благодарен и нормально с ними общался. А вы же просто дерьмом кидаетесь. Проявить после вашего «супер адекватного и аргументированного» комментария хоть каплю уважения — это себя не уважать. Если вы не видите разницы между аргументированной критикой с указанием конкретных узких мест, между тупым высером, который вы тут родили, то лучше тогда вообще помолчать, сохраните свою карму!


        1. dMarley
          21.01.2017 22:47

          Вы бы хотя бы сделали по Laravel-way, и как минимум обрабатывали запрос через Request, который вы заинжектили. А так, у Вас, по-сути, код написанный на коленке. Зачем писать статью ради того, чтобы написать статью? Какая от этого польза?


          1. Kirill_Dan
            22.01.2017 01:11

            Написать по код стайлу, задача пары минут. Сделать алгоритм, задача уже гораздо потруднее. Я предоставил вариант для решения непростой задачи простым путем. Суть идеи ясна. Если никому ничего не интересно, не нужно, всем нужен готовый пакет, то тогда и незачем вообще что-либо писать, и что-либо обсуждать. Отличных кодеров очень много. А вот тех, кто может что-то «родить» очень и очень мало. По сути, практически все эксперты и гики. Просишь показать свои порталы, социальные сети, интернет-магазины, которые создали с нуля эти профи, и все сразу сливаются. А так все супер эксперты, которые все знают, умеют, и другим рассказывают, что они ламеры. Читаю кучу статей по Ларавел, процентов 98 тупо перевод из буржуй нета. Что, уже сами ничего не можем написать и родить? А как только что-то написал (пусть и на коленке), то все, на фиг такое нужно, мол это никому не интересно. Это тупик для русскоязычного сообщества! Вы это понимаете? Вон я на гике написал статью по поводу создания ТЗ: https://geektimes.ru/post/275068/ И где все профи были? Смотрели на статью, как баран на новые ворота. Слова знакомые искали, но так и не нашли. Нет никакого у нас сообщества профессионалов. Одни анонимные «гики» с самооценкой до небес и скромным портфолио, которое нигде найти невозможно. Это так, немного лирики.


            1. dMarley
              22.01.2017 01:21

              Тогда выходит, вы родили "недоношенную" идею. Суть создания "нового" разве состоит в том, чтобы сделать что-то, абы работало? Можно ведь сделать нормально, потратив чуть больше времени.
              И по поводу того, что Вас бы уволили за такой код — чистая правда.


              1. Kirill_Dan
                22.01.2017 01:38
                -2

                К большому сожалению большинства, и большому моему счастью, я независимый специалист, и могу позволить себе написать код на коленке. Много тут на хабре «умников» готовых уйти на свои хлеба, самому искать себе заказчика, и работать по 12 часов в день на стартапах, которые часто не стреляют? А то многие пригрели пятую точку на конторах и умничают про свой хай левел. Я этот контроллер написал через пять минут после прочтения документации. И ничего, не умер. Получил дельные замечания, и тут же поправил. Кстати, если откроете сайт Ларавел, то Тейлор всем рекомендует не парить мозг по поводу код стайла, а сосредоточится на функционале. Код стайл можно и позже поправить. Но все так цепляются не за суть, не за алгоритмы, не за какие-то другие подходы, а именно за код стайл, или применение не родных функций (мол гики классно знают фреймворк). Мне это напоминает, когда в дискуссии начинают цепляться уже к найденным в словах ошибках и пунктуации. Это о многом говорит. Во всем мире приложения и всякие программы написаны по кодстайлу, с соблюдением всех патернов и правильного использования функций ядра. Но почему-то большинство этих решений говно говном! И каждый день выходят новые программы, новые фреймворки, кучи аналогов и т.д. Может дело не в код стайле? Может инструмент нужно применять для достижения конкретных целей, а не делать из него фетиш? Очень многие отлично знают свой инструмент, а вот что они с его помощью делают — вот это часто полная шляпа!


                1. Icewild
                  22.01.2017 16:14
                  +1

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

                  P.S. ошибки потом поправлю, сейчас времени нет.


                  1. Kirill_Dan
                    22.01.2017 16:26
                    -1

                    Можно на красивом чистом русском языке говорить полный бред, переливая из пустого в порожнее и корчя из себя большого эксперта! Что можно наблюдать на всех каналах страны с «великими» политологами и экономистами. Можно бить себя пяткой в грудь и кричать, то что вы великий гуру, но не в состоянии показать и строчки своего кода. Но то все пустое. Вспомним такое приложение, как Sypex Dumper. Код этого приложения — это ад адский. Но тем не менее — это одно из самых популярных и востребованных решений во всем мире! Да и вообще, я уже очень давно обратил внимание на то, что «великие» критики не написали ни одной статьи, не создали не одного опен сорс решения, которое можно скачать с гитхаба или битбакета. А так они огого какие гуру, под анонимными никами и без своего фото в профиле! Наверняка происходит в пятой точке жим-жим, что бы когда будете устраиваться на очередное место работы, не дай бог не нашли ваши высоко интеллектуальные размышления в сети. Умно, но вас это явно не красит!


                1. dMarley
                  22.01.2017 17:11

                  О как у вас подгорело то. Нет, суть в том, что если что-то и делать, то делать с умом и последующим продвижением вашего решения в массы (аля хабр, как вы и поступили). И не удивляйтесь, что на вас вылили бочку с Г, потому что ваш код и наполнил эту самую бочку.


                  Я этот контроллер написал через пять минут после прочтения документации. И ничего, не умер.

                  Тогда почему вы удивляетесь критике, причем обоснованной?


                  Кстати, если откроете сайт Ларавел, то Тейлор всем рекомендует не парить мозг по поводу код стайла, а сосредоточится на функционале.

                  Ссылочку можно, где это написано?


                  Но все так цепляются не за суть, не за алгоритмы, не за какие-то другие подходы, а именно за код стайл

                  Код должен быть читабельным. Абы как написанную белеберду я лично не стал бы использовать в своем приложении и, тем более, тратить время на приведение этого всего к нормальному виду.


                  , или применение не родных функций

                  А зачем тогда используют фреймворки, скажите мне? Чтобы инжектить зависимость для обработки запроса, но использовать глобальный $_POST? WTF?!


                  Не вижу смысла с вами дальше продолжать диалог (хотя, скорее, это два монолога, потому что вы отказываетесь слушать и прислушиваться) с человеком, у которого нет серьезного опыта разработки на Laravel. Почему я решил, что у вас его нет? Да потому, что для вас, видимо, создание фасада или сервис провайдера это невероятно сложные задачи.


                  Have a good life.


                  1. Kirill_Dan
                    22.01.2017 18:47

                    Ссылочку можно, где это написано?


                    Вот вам ссылочка. Разговор окончен.
                    https://laravel.com/docs/5.3/contributions#coding-style


                    1. dMarley
                      22.01.2017 21:20

                      Господи, ты бы английский выучил бы для начала или вник в то, ЧТО там написано.


                      1. Это для КОНТРИБЬЮТОРОВ раздел, т.е. тех, кто ПИШЕТ ФРЕЙМВОРК, а не ИСПОЛЬЗУЕТ его.
                      2. Имеется в виду то, что тулза StyleCI всё равно все приведет в PSR-2, поэтому париться по поводу код-стайла не стоит.

                      Are you blind or something?


                      1. Kirill_Dan
                        22.01.2017 22:37

                        Я думал, что вы просто сольетесь, но нет. Ищите перемогу в зраде. Как это типично для некоторых представителей хомосапиенс.


                        1. dMarley
                          23.01.2017 01:04

                          Хоспаде..


  1. Radik_Wind
    22.01.2017 22:21
    +2

    Меня всегда удивляет почему большая часть разработчиков любит городить излишнюю вложенность. Ваш код не исключение. Пример:

    if ($someThing) {
        return doSomeThing();
    } else {
        return doAnotherAction();
    }
    

    Так ведь на много лучше, не так ли:

    if ($someThing) {
        return doSomeThing();
    }
    
    return doAnotherAction();
    


    Читать код из-за этой постоянной вложенности крайне не удобно.


    1. Kirill_Dan
      22.01.2017 22:34

      Согласен. Старая привычка идущая испокон веков. От нее избавится не всегда просто. Мне нравится лаконичность Рельсов, там вообще нет обязательных ретурнов, чище код, разные типы массивов и т.д.


  1. alutskevich
    23.01.2017 12:08

    За статью спасибо! Вы потратили время, поделились своим опытом и это надо ценить и труд, какой бы он не был, уважать. Кому-то эта статья будет очень даже полезной, учитывая количество добавивших её в избранное.

    По коду. Моё личное мнение.

    Зачем использовать стороннюю библиотеку, когда можно написать своё.
    А что здесь Ваше? Вы используете сторонний сервис, который Вам отдаёт этот код. Всё, что Вы написали есть на сайте самого сервиса. Более того, для Laravel есть готовый плагин который надо подключить и тогда писать ничего не надо. На Вашу фразу про то, что «какие нынче разработчики, что ничего сами написать не могут» — не ко мне. Вы копипастом и созданием контроллера потратили 2 часа, я подключением в composer пакета и выводом формы — 1 час (время условное). Думаете, мой уровень от этого пострадал?

    А если нативное API изменится, что следить за всеми изменениями?
    А если изменится response сервиса?

    $network = $user['network'];
    

    И завтра уже не network, а userData и что делать будете? А если ID самого div блока поменяется и т.д… Для этого есть тесты — пишите их и Вам будет всё равно что использовать.

    А что в коде не так?
    Всё, что уже писали ребята до меня +
    1. — file_get_contents -> cUrl
    2. —
    if ($userData->status) {
    
                    // Make login user.
                    Auth::loginUsingId($userData->id, TRUE);
                }
                // Wrong status.
                else {
                    \Session::flash('flash_message_error', trans('interface.AccountNotActive'));
                }
    
    ->
        $userData->status 
            ? Auth::loginUsingId($userData->id, TRUE)
             : Session::flash('flash_message_error', trans('interface.AccountNotActive'));