#php #laravel #redirect
#php #laravel #перенаправление
Вопрос:
У меня есть аутентифицированный пользователь по имени vendor, которого я могу добавлять, обновлять предприятия. Однако, когда я пытаюсь удалить запись, она перенаправляет на домашнюю страницу вместо перенаправления, которое я указал в контроллере. Я не уверен, имеет ли это какое-то отношение к тому, как настроено мое промежуточное программное обеспечение, но в итоге оно выдает мне сообщение о сбое авторизации в промежуточном программном обеспечении, которое звучит так: «Вам не разрешен доступ к панели администратора». Я уверен, что делаю что-то не так либо в промежуточном программном обеспечении, либо в контроллере. Я должен упомянуть, что для суперадминистратора это промежуточное программное обеспечение работает нормально. То есть администратор, который может блокировать и разблокировать пользователей и видеть все введенные компании. Вот следующий код.
vendorMiddleware.php
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
class VendorMiddleware
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->role_as == 'vendor') {
if (Auth::check() amp;amp; Auth::user()->isBanned) {
$banned = Auth::user()->isBanned == "1";
Auth::logout();
if ($banned == 1) {
$message = 'Your account has been Banned. Please contact the administrator.';
}
return redirect()->route('login')->with('status', $message)->withErrors(['email' => 'Your account has been Banned. Please contact the administrator.']);
}
return $next($request);
} else {
return redirect('/home')->with('status', 'You are not permitted to access the vendor dashboard');
}
}
}
Функция уничтожения в моем ресурсе vendorEmpresaController.php
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return IlluminateHttpResponse
*/
public function destroy($id)
{
$empresa = Empresa::find($id);
if ($empresa != null) {
$empresa->delete();
return redirect('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
// return redirect()->to('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
}
return redirect('/vendor-empresas')->with('status', 'ID Equivocado! La empresa no fue borrado.');
}
Мой index.blade.php где находятся форма и модалы
@extends('layouts.vendor-admin')
@section('content')
<!-- Start delete modal-->
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header text-center">
<h4 class="modal-title w-100 font-weight-bold">Borrar</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">amp;times;</span>
</button>
</div>
<form action="vendor-empresas/{vendor_empresa}" method="POST" id="deleteForm">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<div class="modal-body mx-3">
<input type="hidden" name="_method" value="DELETE">
<div class="text-center">
<i class="fas fa-exclamation-triangle mb-4" style="color: #ffc107; font-size: 32px;"></i>
</div>
<h3 class="text-center text-uppercase">¿Estás Seguro/a?
</h3>
</div>
<div class="modal-footer d-flex justify-content-center">
<button class="btn btn-primary" data-dismiss="modal">Cancelar</button>
<button type="submit" class="btn btn-danger">Sí, Borralo!</button>
</div>
</form>
</div>
</div>
</div>
<!--end delete modal-->
<div class="container-fluid mt-5">
<!-- Heading -->
<div class="card mb-4 wow fadeIn">
<!--Card content-->
<div class="card-body d-sm-flex justify-content-between">
<h4 class="mb-2 mb-sm-0 pt-1">
<a href="/">Inicio</a>
<span>/</span>
<span>Empresas Registradas</span>
</h4>
@if (session('status'))
<div class="alert alert-success fade-message" role="alert">
{{ session('status') }}
</div>
@endif
<div class="modal fade" id="modalRegisterForm" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header text-center">
<h4 class="modal-title w-100 font-weight-bold">Añadir Empresa</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">amp;times;</span>
</button>
</div>
<form action="/vendor-empresas" method="POST">
{{ csrf_field() }}
<div class="modal-body mx-3">
<div class="md-form mb-1">
<input type="text" name="erfc" id="orangeForm-erfc" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-erfc">RFC</label>
</div>
<div class="md-form mb-1">
<input type="text" name="enombre" id="orangeForm-enombre" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-enombre">Nombre</label>
</div>
<div class="md-form mb-1">
<input type="text" name="ecalle" id="orangeForm-ecalle" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-ecalle">Calle</label>
</div>
<div class="md-form mb-1">
<input type="text" name="ecolonia" id="orangeForm-ecolonia" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-ecolonia">Colonia</label>
</div>
<div class="md-form mb-1">
<input type="text" name="eciudad" id="orangeForm-eciudad" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-eciudad">Ciudad</label>
</div>
<div class="md-form mb-1">
<input type="text" name="eestado" id="orangeForm-eestado" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-eestado">Estado</label>
</div>
<div class="md-form mb-1">
<input type="text" name="ecpostal" id="orangeForm-ecpostal" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-ecpostal">Codigo Postal</label>
</div>
<div class="md-form mb-1">
<input type="text" name="epais" id="orangeForm-epais" class="form-control validate">
<label data-error="wrong" data-success="right" for="orangeForm-epais">País</label>
</div>
<div style="display: none;" class="md-form mb-1">
<input type="text" name="user_id" readonly id="orangeForm-euser" class="form-control validate" value="{{ Auth::user()->id }}">
</div>
<div style="display: none;" class="md-form mb-1">
<input type="text" name="eregby" readonly id="orangeForm-eregby" class="form-control validate" value="{{ Auth::user()->id }}">
</div>
</div>
<div class="modal-footer d-flex justify-content-center">
<button type="submit" class="btn btn-deep-orange">Añadir</button>
</div>
</form>
</div>
</div>
</div>
<div class="text-center">
<a href="" class="btn btn-default btn-rounded mb-4" data-toggle="modal" data-target="#modalRegisterForm"><i class="fa fa-plus" aria-hidden="true"></i>amp;nbsp;amp;nbsp; Añadir</a>
</div>
</div>
</div>
<!-- Heading -->
<!--Grid row-->
<!--Grid column-->
<div class="row">
<!--Card-->
<div class="col-md-12 mb-4">
<!--Card content-->
<div class="card">
<!-- List group links -->
<div class="card-body">
<div class="table-responsive">
<table id="datatable2" class="table table-bordered">
<thead>
<tr>
<th style="display: none;">ID</th>
<th>RFC</th>
<th>Nombre</th>
<th>Calle</th>
<th>Colonia</th>
<th>Ciudad</th>
<th>Estado</th>
<th>Codigo Postal</th>
<th>País</th>
<th>Acción</th>
</tr>
</thead>
<tbody>
@foreach ($empresas as $empresa)
<tr>
<input type="hidden" name="id" value="{{ $empresa->id }}">
<td style="display: none;">{{ $empresa->id }}</td>
<td>{{ $empresa->erfc }}</td>
<td>{{ $empresa->enombre }}</td>
<td>{{ $empresa->ecalle }}</td>
<td>{{ $empresa->ecolonia }}</td>
<td>{{ $empresa->eciudad }}</td>
<td>{{ $empresa->eestado }}</td>
<td>{{ $empresa->ecpostal }}</td>
<td>{{ $empresa->epais }}</td>
<td>
<div class="text-center">
<a class="badge badge-pill btn-primary px-3 py-2" href="{{ url('vendor-empresas/'.$empresa->id).'/edit' }}">Editar</a>
<a class="delete badge badge-pill btn-danger px-3 py-2">Borrar</a>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<!-- List group links -->
</div>
</div>
<!--/.Card-->
</div>
<!--Grid row-->
</div>
@endsection
@section('scripts')
<script>
$(document).ready(function() {
let table = $('#datatable2').DataTable();
// Start Delete Record
table.on('click', '.delete', function() {
$tr = $(this).closest('tr');
if($($tr).hasClass('child')) {
$tr = $tr.prev('.parent')
}
let data = table.row($tr).data();
console.log(data);
$('#deleteForm').attr('action', '/delete-empresa/' data[0]);
$('#deleteModal').modal('show');
});
// End Delete Record
});
</script>
<script>
$(document).ready(function($) {
$(function() {
setTimeout(function() {
$('.fade-message').slideUp();
}, 3000);
});
});
</script>
@endsection
и, наконец, изображение моего маршрута: список
Заранее благодарю вас за любую помощь, которую вы можете предоставить.
Редактировать: я пытался с EmpresaPolicy.php и не повезло ни с @can, ни без него. У меня был @can (‘delete’, $ empresa) @endcan, но он сказал, что переменная $ empresa не определена. Итак, в EmpresaPolicy.php У меня есть:
public function delete(User $user, Empresa $empresa)
{
return true;
}
В моем AuthServiceProvider у меня есть:
protected $policies = [
'AppEmpresa' => 'AppPoliciesEmpresaPolicy',
];
I tried this in my vendorEmpresasController.php
public function destroy($id)
{
$empresa = Empresa::find($id);
$this->authorizeResource(Empresa::class, 'delete', $empresa);
if ($empresa != null) {
$empresa->delete();
return redirect('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
// return redirect()->to('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
} else {
return redirect('/vendor-empresas')->with('status', 'ID Equivocado! La empresa no fue borrado.');
}
}
И, наконец, в моем web.php У меня есть:
Route::delete('/vendor-empresas/{vendor_empresa}', 'vendorEmpresaController@destroy');
Я все еще перенаправляюсь обратно на home, когда хочу быть перенаправленным на / vendor-empresas
Любая помощь приветствуется. Спасибо.
Правка # 2
Вот вывод dd для vendormiddleware.php
Комментарии:
1. Так что в принципе
Auth::user()->role_as == 'vendor'
не соответствует действительности?2. Не могли бы вы расширить свой вопрос, указав пользователя из базы данных, который работает, а тот, который нет?
3. Удалить
else { return redirect('/home')->with('status', 'You are not permitted to access the vendor dashboard'); }
в vendorMiddleware4. Привет, Собир и RCRalph. Я не уверен, что role_as == поставщик возвращает правдивость или ложность, но после удаления строки, предложенной Sobir в промежуточном программном обеспечении, я все еще получал то же сообщение и обнаружил, что у меня было что-то похожее в промежуточном программном обеспечении Adin: дескриптор общедоступной функции ($ request, Closure $ next) { if (Auth::user ()-> role_as == ‘admin’) { return $ next ($ request); } else { return redirect (‘ /home’)-> with(‘статус’, ‘Вам не разрешен доступ к дурацкой панели мониторинга!’); } }} Есть какие-нибудь подсказки? Спасибо. редактировать-работает, удалить-не удается
5. Если я удалю инструкции else в обоих промежуточных программах, я получаю: Попытка получить ‘заголовки’ свойств не-объекта
Ответ №1:
Ваше условие: if (Auth::user()->role_as == 'vendor')
Если условие вернется false
, вы получите это: return redirect('/home')->with('status', 'You are not permitted to access the vendor dashboard');
Вывод таков: если вы перенаправлены на /home
и видите 'You are not permitted to access the vendor dashboard'
сообщение, это означает, что поле текущего зарегистрированного пользователя role_as
не равно 'vendor'
.
Комментарии:
1. Действительно странно, как в db, role_as == поставщик. Таким образом, я могу просматривать, создавать и обновлять, но не удалять.
2. Вы проверяли объект user в промежуточном программном обеспечении? Я имею в виду — в промежуточном программном обеспечении, прежде чем сначала, если сделать это:
dd(Auth::user());
.3. Спасибо за ваши комментарии, Pjplonka. Я отредактировал свой пост, чтобы показать детали dd (Auth::user());
4. @ErikJamesRobles хорошо, используете ли вы это сообщение:
'You are not permitted to access the vendor dashboard'
в своем приложении, за исключением того, что VendorMiddleware?5. Предупреждение adminMiddleware гласит, что вам не разрешен доступ к панели управления администратора, а программное обеспечение VendorMiddleware сообщает, что вам не разрешен доступ к панели управления поставщика (если это обычный пользователь).
Ответ №2:
Обнаружил проблему. Во-первых, в моем web.php файл, мне нужно было изолировать мои группы поставщиков и администраторов и их перспективные маршруты. Вот как это выглядит сейчас:
<?php
use IlluminateSupportFacadesRoute;
use IlluminateSupportFacadesAuth;
Route::get('/', function () {
return view('frontend.index');
});
Auth::routes();
Route::group(['middleware' => ['auth', 'isUser']], function () {
Route::get('/home', 'HomeController@index')->name('home');
});
Route::group(['middleware' => ['auth', 'isAdmin']], function () {
Route::get('/dashboard', function () {
return view('admin.dashboard');
});
// Usuarios
Route::get('registered-user', 'AdminRegisteredController@index');
Route::delete('/user-delete/{id}', 'AdminRegisteredController@destroy');
Route::get('role-edit/{id}', 'AdminRegisteredController@edit');
Route::put('role-update/{id}', 'AdminRegisteredController@updaterole');
// Empresas
Route::get('registered-empresa', 'AdminEmpresaController@index');
Route::post('save-empresa', 'AdminEmpresaController@store');
Route::get('/edit-empresa/{id}', 'AdminEmpresaController@edit');
Route::put('/empresa-update/{id}', 'AdminEmpresaController@update');
Route::delete('/delete-empresa/{id}', 'AdminEmpresaController@destroy');
// Empleados
Route::get('registered-empleado', 'AdminEmpleadoController@index');
Route::get('/edit-empleado/{id}', 'AdminEmpleadoController@edit');
Route::put('/empleado-update/{id}', 'AdminEmpleadoController@update');
Route::post('save-empleado', 'AdminEmpleadoController@store');
Route::delete('/delete-empleado/{id}', 'AdminEmpleadoController@destroy');
});
Route::group(['middleware' => ['auth', 'isVendor']], function () {
Route::get('/vendor-dashboard', function () {
return view('vendor.dashboard');
});
Route::resource('vendor-empresas', 'vendorEmpresaController');
Route::resource('vendor-empleados', 'vendorEmpleadoController');
Route::delete('/vendor-empresas/{vendor_empresa}', 'vendorEmpresaController@destroy');
});
2-е: В моем индексе для поставщика я вызывал функцию удаления администраторов, а не функцию удаления поставщика, которая находится в VendorEmpresaController. Теперь вот код:
@section('scripts')
<script>
$(document).ready(function() {
let table = $('#datatable2').DataTable();
// Start Delete Record
table.on('click', '.delete', function() {
$tr = $(this).closest('tr');
if($($tr).hasClass('child')) {
$tr = $tr.prev('.parent')
}
let data = table.row($tr).data();
console.log(data);
$('#deleteForm').attr('action', '/vendor-empresas/' data[0]);
$('#deleteModal').modal('show');
});
// End Delete Record
});
</script>
<script>
$(document).ready(function($) {
$(function() {
setTimeout(function() {
$('.fade-message').slideUp();
}, 3000);
});
});
</script>
@endsection
И вот код для контроллера в vendorEmpressaController, расположенный в папке Vendor:
public function destroy($id)
{
$empresa = Empresa::find($id);
if ($empresa != null) {
$empresa->delete();
return redirect('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
// return redirect()->to('/vendor-empresas')->with('status', 'Empresa Borrado Exitosamente.');
} else {
return redirect('/vendor-empresas')->with('status', 'ID Equivocado! La empresa no fue borrado.');
}
}
Я надеюсь, что это поможет кому-то с такой же проблемой. Приветствия.