I'm trying to implement multi auth guards with AdminLTE in Laravel (version 6.x) and I have trouble to pass the guard (as $url variable) in login/register forms.
My API works fine without AdminLTE, and it works fine with normal user with AdminLTE.
I can display Admin login/register forms by taping "/login/admin" and "register/admin" in the address bar, but when I click login/register button I get "404 Not Found" page and in the address bar it displays "/login/$url"
I have changed the login.blade.php and register.blade.php in the following directory:
vendor/.../view/login.blade.php and vendor/.../view/register.blade.php
LoginController.php:
public function adminLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:6'
]);
if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('/admin');
}
return back()->withInput($request->only('email', 'remember'));
}
RegisterController.php:
protected function createAdmin(Request $request)
{
$data = $request->all();
$this->validateAdmin($data)->validate();
$admin = Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
return redirect()->intended('login/admin');
}
routes/web.php:
Route::post('/login/admin', 'Auth\LoginController#adminLogin');
Route::post('/register/admin', 'Auth\RegisterController#createAdmin');
login.blade.php:
#isset($url)
<form action="{{ url('login/$url') }}" method="post">
#else
<form action="{{ url(config('adminlte.login_url')) }}" method="post">
#endisset
register.blade.php:
#isset($url)
<form action="{{ url('register/$url') }}" method="post">
#else
<form action="{{ url(config('adminlte.register_url')) }}" method="post">
#endisset
You're hard coding the $url as string as oppose to using it as a variable
This is due to using single quotes in the blade view files in the url() helper function argument
Just change it to double quotes
login.blade.php:
#isset($url)
<form action="{{ url("login/$url") }}" method="post">
#else
<form action="{{ url(config('adminlte.login_url')) }}" method="post">
#endisset
register.blade.php:
#isset($url)
<form action="{{ url("register/$url") }}" method="post">
#else
<form action="{{ url(config('adminlte.register_url')) }}" method="post">
#endisset
Changing files in vendor folder is redundant because your changes will be overridden on composer update/install
From the docs
If you have published and modified the default master, page views or login views, you will need to update them too.
Option 1:
Make a copy of the views you modified.
Publish the views again, using
php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\AdminLteServiceProvider" --tag=views
Redo the modifications you did.
Hope this helps
Related
I want to generate a random password on button click but it leads to Error 404
The Form
<form style="position: relative; left: -15px" action="{{ route("dashboard.users.generate-app-password-store") }}" method="POST">
#csrf
<button type="submit" class="btn btn-primary float-right mt-2">
{{ trans("translation.generate-password") }}
</button>
</form>
The Controller Function
public function generateAppEmailPasswordStore(Request $request)
{
$user = User::findOrFail($request->uid);
$user->app_email_password_store = Hash::make(Str::random(8));
$user->app_email_password_store = $request->app_email_password_store;
$user->save();
Alert::flash(trans('translation.email-account-created'));
return redirect()->route('dashboard.users.profile', ['id' => $user->id]);
}
The route (prefix => dashboard is the main route group)
Route::group(['prefix' => 'user', 'middleware' => 'checkRole:admin'], function () {
Route::post('/generate-app-password-store', 'Dashboard\UsersController#generateAppEmailPasswordStore')->name('dashboard.users.generate-app-password-store');
});
The error
You are probably recieving 404 because of this line in the controller method.
$user = User::findOrFail($request->uid)
Check if you get the correct value for $request->uid or if there is a user with the given ID.
Otherwise it will throw a 404 error.
either change your dashboard.user.generate-app-password-store (instead of dashboard.users.generate-app-password-store) in your view
or
change your route prefix to users (instead of user)
The problem seems to be that you mismatch the " usage.
action="{{ route("dashboard.users.generate-app-password-store") }}"
should be
action="{{ route('dashboard.users.generate-app-password-store') }}"
The reasoning is that you close the action too early.
action="{{ route("
This is my TaskController where complete() function is defined to store done_at current time
public function complete($id)
{
$task = Task::create([
'done_at' => now(),
]);
return redirect()->route('tasks.index')->withSuccess('Done');
}
This is my web.php route
Route::post('/tasks/complete', 'TaskController#complete');
This is my index page where there is submit button to save current time
<form action="{{ route('tasks.complete', $task->id) }}" method="post">
#csrf
<input type="submit">
</form>
You missed name declaration of your route, like this:
Route::post('/tasks/complete', 'TaskController#complete')->name('tasks.complete');
Note: If you want to add new task use the first one, but if you want to update an existing task use the second one:
//---First:
TaskController:
public function complete() {
$task = Task::create([
'done_at' => now(),
]);
return redirect()->route('tasks.index')->withSuccess('Done');
}
web.php
Route::post('/tasks/complete', 'TaskController#complete')->name('tasks.complete');
Your view file(index page):
<form action="{{ route('tasks.complete') }}" method="post">
#csrf
<input type="submit">
</form>
//---Second:
Or if you need to pass the id parameter in your controller you should use the below code:
TaskController:
public function complete($id) {
$task = Task::findOrFail($id);
if ($task) {
$task->update([
'done_at' => now()
]);
return redirect()->route('tasks.index')->withSuccess('Done');
}
return redirect()->route('tasks.index')->withSuccess('Task No Found');
}
web.php
Route::post('/tasks/complete/{id}', 'TaskController#complete')->name('tasks.complete');
Your view file(index page):
<form action="{{ route('tasks.complete', ['id' => $task->id]) }}" method="post">
#csrf
<input type="submit">
</form>
As per your complete() function in the controller and as per the form action,
Your route should look like this:
Route::post('/tasks/complete/{id}', 'taskcontroller#complete')->name('tasks.complete');
Auth::user() has a POST request to an external website with the following:
postfile.blade.php
<form action="{{ url('https:www.external.com/api/') }}" method="POST" align="center">
#csrf
#method('POST')
<input type="hidden" name="Data1" value="{{ $Data1}}">
<input type="hidden" name="Data2" value="{{ $Data2}}">
<input type="hidden" name="Data3" value="{{ $Data3}}">
<input type="hidden" name="ReturnURLOK" value="{{ url('/success') }}">
<input type="hidden" name="ReturnURLError" value="{{ url('/fail') }}">
<button type="submit" value="POST TO API">PROCEED/button>
</form>
After which, https:www.external.com/api/ provides a POST request back to Auth::user() url wherein the data are saved on database.
Controller:
public function postfiles(Request $request)
{
$request->session()->put('user_id',Auth::user()->id);
return view('postfile');
}
public function parse(Request $request)
{
$files = File::create([
'Data4' => $request->input('Data4'),
'Data5' => $request->input('Data5'),
'Data6' => $request->input('Data6'),
]);
$data = array(
'Data4' => $request->input('Data4'),
'Data5' => $request->input('Data5'),
'Data6' => $request->input('Data6'),
);
Auth::loginUsingId($request->session()->get('user_id'));
return view('success')->with($data);
}
The data are being saved correctly but in the success.blade.php I'm getting an error when I try to display the data on the blade.
Error is
Trying to get property 'username' of non-object
success.blade.php
<div class="container">
<div>
<h3>CONGRATULATIONS {{ Auth::user()->username}}!</h3>
<h2>The following Data has been saved</h2>
{{ $Data4}}
{{ $Data5}}
{{ $Data6}}
</div>
</div>
Routes:
Route::group(['middleware' => ['auth', 'activated', 'currentUser']], function () {
Route::get('postfile', 'App\Http\Controllers\FileController#postfiles')->name('postfile');
Route::POST('success', 'App\Http\Controllers\FileController#parse')->name('parse');
});
It seems the user's session is somehow lost and Auth::user() becomes null after being redirected back during the POST request from the external website.
i dont know why your logged-in user is lost but:
one solution i can say is that you can save id of that user somewhere like coockie or session and after redirecting back from your api, you get that id and re-login that user
First of all I want to say that my problem is very similar to this question, only the answer is not working in my case.
I am trying to connect my form action to my UserController. it's an update avatar function. Here's what it look like.
in my profile/show.blade
<div class="col-md-12 justify-content-center">
<form action="{{ action('UsersController#update_avatar') }}" method="post" enctype="multipart/form-data">
#csrf
</form>
</div>
UsersController
public function avatar()
{
$user = Auth::User();
return view('dashboard.profile'.$user->id,compact('user',$user));
}
public function update_avatar(Request $request){
$request->validate([
'avatar' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
$user = Auth::User();
$folder = 'avatars';
Storage::delete($folder.'/'.$user->avatar);
$avatarName = $user->id.'_avatar'.'.'.request()->avatar->getClientOriginalExtension();
$request->avatar->storeAs('avatars',$avatarName);
$user->avatar = $avatarName;
$user->save();
return back()
->with('success','You have successfully upload image.');
}
routes/web.php
Route::get('dashboard/profile/{{profile}}', 'Dashboard\\UsersController#avatar');
Route::post('dashboard/profile/{{profile}}', 'Dashboard\\UsersController#update_avatar');
here's the error I am receiving
Thank you so much in advance!
Change these routes:
Route::get('dashboard/profile/{{profile}}', 'Dashboard\\UsersController#avatar');
Route::post('dashboard/profile/{{profile}}', 'Dashboard\\UsersController#update_avatar');
To these:
Route::get('dashboard/profile/{{profile}}', 'UsersController#avatar')->name('user.avatar');
Route::post('dashboard/profile/{{profile}}', 'UsersController#update_avatar')->name('user.update_avatar');
And in your form use route instead of action
<form action="{{ route('user.update_avatar') }}" method="post" enctype="multipart/form-data">
#csrf
</form>
You can try do something like this:
Route::post('dashboard/profile','Dashboard\UsersController#update_avatar')->name(profile.update);
and use it in the form like this:
<form action="{{ route('profile.update') }}">
I want to insert data in database. i found a problem. I have 2 blade.php page. 1. dashboard.blade.php and another is class.blade.php.
When i use in my form action dashboard.blade.php its working. but when i used in action class.blade.php its not working. i can't found this problem. Here is my form action :
<form class="form-horizontal" role="form" method="POST" action="{{ url('/dashboard') }}">
{!! csrf_field() !!}
when i changed it
<form class="form-horizontal" role="form" method="POST" action="{{ url('/class') }}">
{!! csrf_field() !!}
then its not working.
Here is my controller
public function showclass(Request $request)
{
$randomnumber = rand(50001,1000000);
$classrooms = new Classrooms();
$classrooms->class_name = $request['class_name'];
$classrooms->subject_name = $request['subject_name'];
$classrooms->section = $request['section'];
$classrooms->class_code = $randomnumber;
$classrooms -> user_id = Auth::user()->id;
$classrooms -> save();
Flash::success('Your status has been posted');
//return redirect(route('dashboard'));
return view('dashboard', array('classroom' => Auth::user()) );
}
There is an error in your Route. You have used showdata method instead of showclass. Just change it like below:
Route::post('/class', [
'uses' => 'classroom#showclass',
'as' => 'classrooms']);
Note: Make sure to specify specific method while defining the routes.