Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
dd(); в Middleware не срабатывает, переход на нижний роут
return redirect()->route('sms_login',
происходит даже если я его удалю )))))
Какой то кеш работает наверное незнаю где искать
Вот мой роут
Route::any('/account_order','AccountOrderController@index')->name('account_order')->middleware('sms_auth');
Вот Middleware
<?php
namespace App\Http\Middleware;
use App\Http\Controllers\LoginController;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthenticationException;
/*use Illuminate\Contracts\Auth\Factory as Auth;*/
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Support\Facades\View as View;
use App\User;
use AuthenticatesUsers;
class SmsAuthenticate
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
protected $type;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
/* public function __construct(Auth $auth)
{
$this->auth = $auth;
}*/
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle(Request $request, Closure $next)
{
dd(123);
if(isset($request->room)){
$request->session()->forget('room');
$request->session()->put('room', $request->room);
}
if(isset($request->bathroom)){
$request->session()->forget('bathroom');
$request->session()->put('bathroom', $request->bathroom);
}
if(null!==($request->input('type'))){
$request->type=$request->input('type');
}
if(null!==($request->input('id'))){
$id=$request->input('id');
}
if (!Auth::check()) {
return redirect()->route('sms_login', ['type'=>$request->type,'room'=>$request->room,'bathroom'=>$request->bathroom]);
}
else{
return $next($request);
}
}
}
Перехожу на роут sms_login Представляете, Я в шоке где искать уже не знаю
Вот запись в Kernel.php
'sms_auth' => \App\Http\Middleware\SmsAuthenticate::class,
Написал вместо
Auth::check()
auth()->check()
а вместо
Auth::loginUsingId($user[0]->id,true);
auth()->loginUsingId($user[0]->id,true);
Та же проблема ничего не поменялось
Посмотрите пожалуйста что может быть такое.
dd($request->session()->get('userData'));
Показывает юзера то значит аутентификация прошла успешно и в сессии есть юзер,
так как прошел условие
if(Auth::check())){
А если захожу на страницу home появляется форма логина как для не авторизированного пользователя
<?php
namespace App\Http\Middleware;
use App\Http\Controllers\LoginController;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Support\Facades\View as View;
use App\User;
use AuthenticatesUsers;
class SmsAuthenticate
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle(Request $request, Closure $next)
{
dump($request->input('type'));
if(null!==($request->input('type'))){
$request->type=$request->input('type');
}
if(null!==($request->input('id'))){
$id=$request->input('id');
}
if (!Auth::check()/*!$this->auth->user()*/) {
if(isset($request->id)){
$user=User::where('id',$request->id)->get();
Auth::loginUsingId($user[0]->id,true);
$request->session()->put('userData', $user);
}else{
return redirect()->route('sms_login',['type'=>$request->type]);
}
/*return redirect()->route('sms_login',);*/
}
else{
dd($request->session()->get('userData'));
}
return $next($request);
}
}
В чем может быть дело?
Все понятно - спасибо за совет но вот авторизация все равно не произойдет даже если я ее вконтроллере буду осуществлять, видимо недостаточно аргументов для ее осуществления, я просто пытался понять почему открывается шаблон логина во время вот этого действия
$this->auth->authenticate();
Разве это не приказ просто аутентифицировать пользователя?
По большому счету выносить в контроллер может и надо логику если работать педантично,
но в реалии ничего не поменяется и проблему с аутентификацией это не решит,
Может кто подскажет почему открылась форма логина? А лучше что нужно сделать чтобы аутентифицировать юзера,
может юзер аутентифицируется только при наличии пароля и мыла специальным методом, как тогда имитировать существование пароля и мыла если на момент аутентификации нет их и каким методом это все осуществляется
Помогите пожалуйста разобраться, создал middleware sms_authenticate
Все работает код на телефон приходит сохраняется в базе, но на завершающем этапе когда надо аутентифицировать пользователя в системе методом $this->auth->authenticate();
Что то не срабатывает выкидывает на страницу обычного логина
Хотя у меня своя страница СМС логина была создана
По идее должен аутентифицировать пользователя там занести его в сессиб методами Ларавеля и выйти из middleware на
next request
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Support\Facades\View as View;
use App\Http\Libraries\sms;
use App\User_login;
use App\Meta;
class SmsAuthenticate
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
if (!$this->auth->user()) {
if (isset($_POST['sms_verification']) && $_POST['sms_verification'] == 'true') {
$phone = preg_replace('~\D+~', '', $_POST['phone']);
$sms_verification = $this->login($phone, $_POST['login_sms_verification']);
if (isset($sms_verification['error'])) {
$sms_verification['phone'] = $phone;
return redirect()->route('view_sms_verification', $sms_verification);
}
} else {
if (isset($_POST['phone'])) {
$phone = preg_replace('~\D+~', '', $_POST['phone']);
}
if (isset($_POST['sended']) && $_POST['sended'] == 'true') {
$response = $this->send_sms($phone);
if (isset($response['error'])) {
$data_content['error'] = $response['error'];
} else {
$data_content['phone'] = $phone;
return redirect()->route('view_sms_verification', $data_content);
}
} else {
return redirect()->route('sms_login');
}
}
}
$this->auth->authenticate();
return $next($request);
}
function send_sms($phone, $data_content = null)
{
$phone = htmlspecialchars($phone);
$sms = new SMS();
$result = User_login::check_status($phone);
if (!$result) {
// Создаем пользователя если нет такого телефона
User_login::create_user($phone);
} else {
if ($result->status == 0) {
$response['error'] = trans('login.lg_acc_is_blocked');
return $response;
}
}
$code = User_login::generateCode(2);
User_login::save_verification_code($phone, $code);
$sms_text = Meta::create('sms_to_client_on_login', array('code' => $code));
/*$response = $sms->send(array('phone'=>$phone,'text'=>$sms_text));*/
if (isset($response['error'])) {
return array('error' => trans('login.lg_send_sms_error'));
} else {
return TRUE;
}
}
function login($phone, $code)
{
$phone = str_replace(' ', '', $phone);
$saved_code = User_login::return_verification_code($phone);
if ($saved_code == $code && $code != '') {
// удаляем код с базы
User_login::delete_verification_code($phone);
return true;
} else {
return array('error' => trans('login.lg_wrong_code'));
}
}
}
Есть мысль что на момент аутентификации в базе нет email && name Может он без этих полей не аутентифицирует, как тогда быть подскажите. По возможности дайте максимально полный ответ.Примного благодарен
Обращаемся так createMongoInfo($user)
protected function generateDomain($domain,$length = 1){
//Смотрим в базу нет ли там такогоже домена
$site = Site::where('domain_name',$domain)->get();
if(isset($site[0])){
$chars = 'abdefhiknrstyz';
$numChars = strlen($chars);
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
$domain=$domain.'_'.$string;
$this->generateDomain($domain,$length+1);
}
else{
//No such site
dump('return',$domain);//Здесь после одного прохода imediasun_z
return $domain;
}
}
protected function createMongoInfo($user){
$domain_name=stristr($user->email, '@', true);
dd($this->generateDomain($domain_name,1));//Null
}
Почему в dd createMongoInfo NULL когда в ретурне generateDomain imediasun_z
$user->role_user->role_id
Ингогда надо спросить у самого себя чтобы понять
Может другие методы кому известны быстрее и проще?
Объясните пожалуйста как нужно сделать в моем случе
Есть таблица Users (id,name,email,...)
Есть таблица Roles (1=>Admin,2=>Guest,...)
Есть таблица Role_users (user_1d=>role_id)
Как мне обратиться к role_id
Когда у меня есть юзер
$user = User::find($activation->user_id);
Я создал Модель Role_user
И в модели User написал следующее
public function role_user()
{
return $this->hasOne('App\Role_user');
}
Но я не получил однозначного ответа а только вот этот стек
HasOne {#94 ▼
#foreignKey: "role_users.user_id"
#localKey: "id"
#query: Builder {#279 ▶}
#parent: User {#280 ▶}
#related: Role_user {#273 ▼
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#attributes: []
#original: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#events: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▶]
}
#withDefault: null
}
А хочется написать $user->role_id И получить значение
Простите за столь простой вопрос конечно же вот так, знакомлюсь с ларавелем
$html = view('privat/retail/templates/menu_present',$data)->render();
Я пользуюсь Ларавель
Хочу в вид динамически подгружать данные с темплейтом
Как осуществить
В основном шаблоне у меня аяксом забираются данные и темплейт для них
[code=javascript]
$.ajax({
type: 'POST',
dataType: 'json',
url: '/privat/showCompanyMenu',
success: function(jsondata){
$('#result').html(jsondata)
}
});
[/code]
А вот файл в котором происходит выбор подгружаемого темплейта и данных к нему
[PHP]
public function showCompanyMenu()
{
//Возвращает данные меню по конкретному юзеру
//И возвращает HTML шаблон для отображения представления меню
$html = view('privat/retail/templates/menu_present')->render();
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'html'=>$html);
$json_string=json_encode($arr);
echo $json_string;
}
[/PHP]
Как данные (a,b,c,d) прокинуть в шаблон чтобы в json получить html с данными
Я пытаюсь в контексте подгрузить html файл через Аякс
$.ajax({
type: 'POST',
dataType: 'json',
url: '/privat/showCompanyMenu',
success: function(jsondata){
$( "#result" ).load( "/resources/views/"+"privat/retail/templates/menu_present.html" );
}
});
Но видно роутинг блокирует обращение к папкам фреймворка в обход него,
Как мне указать файл который в папке видов лежит так чтобы Аякс успешно отработал?
Я сделал Через ДНС только вот вопрос по Ларавелю есть
Я допустим хочу зайти на сайт imedia.domen.loc/
Вот этот роут почему то не срабатывает
Route::domain('{account}.domen.loc')->group(function () {
Route::get('/', function ($account) {
dd($account);
});
});
А если вот так
Route::domain('{account}.domen.loc')->group(function () {
Route::get('/user', function ($account) {
dd($account);
});
});
То захожу но мне же корень тоже нужен как, туда попасть?
У меня тут проблема с поддоменами
Смотри если я в /etc/hosts/ указываю 127.0.0.1 magelan.loc sun.magelan.loc
я попадаю на свой индекс это отлично так и надоно если я указываю
127.0.0.1 magelan.loc *.magelan.loc
такого сайта не видит апач
Можешь помочь?
Это что значит что нельзя проверять таким образом в конструкторе?
$this->middleware('auth');?
Я убрал этот мидлвеар из конструктора но по прежнему нет залогиненого пользователя
Такая ситуация что в HomeController
в который после логина перекидывает
есть в конструкторе вот такая строка
public function __construct()
{
$this->middleware('auth');
}
если я ее убираю попадаю в Home controller
но она ж наверное и нужна чтобы без логина туда не заходили
А если до него прописать dd(Auth::user()->id);
Получаю ошибку что такого объекта нет,
Выходит нет авторизации?
Auth::check() = false
Как найти косяк?
Хотя я залогиниваюсь этому свидетельствует вот этот вывод
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
dd($this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath()));
}
Здесь не происходит редирект а есть конкретный респонс с путем куда нужно перенаправить в случае успешного логина
Может что то с сесиями и не хранится Auth:user() Как это проверяется?
Тема закрыта спасибо
Да супер ты меня понял, но вот объект этот не содержит ошибок, у меня расписано как ты написал но ошибки не появляются
Ну к примеру меня тоже редиректило при регистрации потому что в базе такое мыло уже есть, должен же я был увидеть респонс а оно просто редиректит на туже страницу
Я логинюсь через /login
Отдебажил что выкидывает вот это исключение в экшене login
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
По идее я должен где то видеть ответ - этот респонс, но просто опять форма логина.
Есть какие то идеи как подключить грамотно вывод респонса?
Спасибо, ваше решение помогло действительно просто кеш ))
Привет всем, подскажите в чем дело в форме метод-post
<form class="form-horizontal" role="form" method="POST" action="{{route('registerBuyer')}}">
Роут на обработку указано POST
Route::post('register_buyer', 'Auth\RegisterController@register')->name('registerBuyer');
Почему я попадаю в это исключение?
Auth::routes();
Есть запись в роут файле, вот как найти бы где записаны роуты в Auth?
Я разобрался там подключен файл из вендора
На комманду route:list
я получил список роутов
Очень хочу разобраться как показывается форма регистрации
GET|HEAD | register| register| App\Http\Controllers\Auth\RegisterController@showRegistrationForm
Есть вот такой роут (очень хочется понять где он прописан так как в файлах роутов его нет 100%)
И этого экшена нет а форма показывается