Comments 63
// Check exist email.
if (isset($user['email']) && !empty($user['email'])) {
// Здесь основной код
}
\Session::flash('flash_message_error', trans('interface.NotEmail'));
return Redirect::back();
// 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
.
firstOrCreate
, если точнее.
Сообщений каких?
\Session::flash('flash_message', trans('interface.ActivatedSuccess'));
\Session::flash('flash_message_error', trans('interface.AccountNotActive'));
Этих?
Так ведь firstOrCreate
вернет Вам инстанс юзера, его статус и можно проверять для вывода сообщения (или его отсутствия). Еще есть замечательный метод exists
, который поможет Вам в выводе сообщения об успешной регистрации.
$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') будет все время различаться
public function redirectToProvider($driver)
{
if(empty(config('services.'.$driver))){//нет драйвера - нужно что-то сделать
abort(404);
}
return Socialite::driver($driver)->redirect();
}
этот пакет работает только с рядом социалок:
нужно больше социалок? не вопрос — https://socialiteproviders.github.io/
Судя по коду, автор вообще не имеет опыта с Laravel. Да и в целом стиль, мягко говоря, хромает.
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();
}
Ну хотя-бы как-то так.
А причем тут еще один пакет? uLoginService — это отдельный класс, а не пакет.
Для того чтобы можно было все это протестировать, для того чтобы заменить file_get_contents на curl с таймаутом, для того чтобы проверить что мы получили валидный json и так далее, и тому подобное.
Потому что у вас не две строчки кода. Потому что так будет проще тестировать. Потому что так читабельнее. Потому что такой код легче в поддержке.
И что? $request->get('token') позволяет получить данные как из $_GET, так и из $_POST. Название метода в данном случае означает «получить», а не «получить из $_GET».
За такой код в нормальных компаниях принято увольнять.
А где вы работаете?
Вы не используете пакет Laravel Socialite и переизобретаете то, что он и так уже делает.
Вы точно программист? Ведь вам так лень что-то свое писать. Про чтобы просто вникнуть в суть задачи, так вообще молчу.
Вы не умеете пользоваться классом Request и неправильно обрабатываете запрос.
Конкретно укажите на код! А то пока выглядит, как гав-гав-гав.
Вы игнорируете соглашение PSR-2, которому следует Laravel.
Вы серьезно? https://laravel.com/docs/5.3/structure#the-app-directory А вы вообще в курсе, что это значит?
В вашем коде есть ошибки с неопределенными индексами.
Я глянул ваши другие комментарии и сколько вам наплевали за ваш «профессионализм» в карму, так походу это у вас ошибка в ДНК.
Представьте, какую свинью вы подкладываете человеку, которому придётся работать с этим после вас.
Лучше не нужно про свиней, а то ваше похрюкивание вас выдает.
П.С. Бог ты мой! Во что превратилась Хабра! Неужели все адекватные люди уже убежали отсюда?!
PSR-2 не про папочки, а про стиль кодирования.
Вы бы хотя бы сделали по Laravel-way, и как минимум обрабатывали запрос через Request
, который вы заинжектили. А так, у Вас, по-сути, код написанный на коленке. Зачем писать статью ради того, чтобы написать статью? Какая от этого польза?
Тогда выходит, вы родили "недоношенную" идею. Суть создания "нового" разве состоит в том, чтобы сделать что-то, абы работало? Можно ведь сделать нормально, потратив чуть больше времени.
И по поводу того, что Вас бы уволили за такой код — чистая правда.
Взмжн ваш програм и норм, но за хрновый код-стуле мошн луз ёр айдиа. Без обид ифчо.
P.S. ошибки потом поправлю, сейчас времени нет.
О как у вас подгорело то. Нет, суть в том, что если что-то и делать, то делать с умом и последующим продвижением вашего решения в массы (аля хабр, как вы и поступили). И не удивляйтесь, что на вас вылили бочку с Г, потому что ваш код и наполнил эту самую бочку.
Я этот контроллер написал через пять минут после прочтения документации. И ничего, не умер.
Тогда почему вы удивляетесь критике, причем обоснованной?
Кстати, если откроете сайт Ларавел, то Тейлор всем рекомендует не парить мозг по поводу код стайла, а сосредоточится на функционале.
Ссылочку можно, где это написано?
Но все так цепляются не за суть, не за алгоритмы, не за какие-то другие подходы, а именно за код стайл
Код должен быть читабельным. Абы как написанную белеберду я лично не стал бы использовать в своем приложении и, тем более, тратить время на приведение этого всего к нормальному виду.
, или применение не родных функций
А зачем тогда используют фреймворки, скажите мне? Чтобы инжектить зависимость для обработки запроса, но использовать глобальный $_POST
? WTF?!
Не вижу смысла с вами дальше продолжать диалог (хотя, скорее, это два монолога, потому что вы отказываетесь слушать и прислушиваться) с человеком, у которого нет серьезного опыта разработки на Laravel. Почему я решил, что у вас его нет? Да потому, что для вас, видимо, создание фасада или сервис провайдера это невероятно сложные задачи.
Have a good life.
Ссылочку можно, где это написано?
Вот вам ссылочка. Разговор окончен.
https://laravel.com/docs/5.3/contributions#coding-style
Господи, ты бы английский выучил бы для начала или вник в то, ЧТО там написано.
- Это для КОНТРИБЬЮТОРОВ раздел, т.е. тех, кто ПИШЕТ ФРЕЙМВОРК, а не ИСПОЛЬЗУЕТ его.
- Имеется в виду то, что тулза StyleCI всё равно все приведет в PSR-2, поэтому париться по поводу код-стайла не стоит.
Are you blind or something?
if ($someThing) {
return doSomeThing();
} else {
return doAnotherAction();
}
Так ведь на много лучше, не так ли:
if ($someThing) {
return doSomeThing();
}
return doAnotherAction();
Читать код из-за этой постоянной вложенности крайне не удобно.
По коду. Моё личное мнение.
Зачем использовать стороннюю библиотеку, когда можно написать своё.
А что здесь Ваше? Вы используете сторонний сервис, который Вам отдаёт этот код. Всё, что Вы написали есть на сайте самого сервиса. Более того, для 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'));
Вставил код
<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>
@endsection@section('js')
<script src="//ulogin.ru/js/ulogin.js"></script>
@endsection
в свой login.blade.php
У меня не отображаются кнопки соц. сетей. Что я не так делаю?
Авторизация в Laravel, через социальные сети (Ulogin). Просто, гибко и эффективно