Laravel 5.8 Adding Multiple Middleware Directly To Route - php

I'm using Laravel 5.8 and I have a route like this:
Route::get("certs","CertController#index")->name('certificate.front')->middleware('auth');
Now I wanted to add another middleware to this route, so I tried this:
Route::get("certs", "CertController#index")->name('certificate.front')->middleware('prevent-back-history','auth');
Now I don't get any error and it works But I wonder is this way better or not:
Route::get("certs", "CertController#index")->name('certificate.front')->middleware(['prevent-back-history','auth']);
So which is better and correct in this case?
Note that I don't want to use Route groups and needed to specify the middleware name directly to the route.

The last code is the correct way, because if you can see in your code
Route::get("certs", "CertController#index")->name('certificate.front')->middleware(['prevent-back-history','auth']);
If you wanted to have more than specific 1 middleware, you should use an array to define the middleware, so using [''] is the correct way, in case you wanted to add more middleware into the route.

#apose7523
Both the approaches are correct and are working, so it does not matter what approach you choose
Route::get('example',controller)->middleware('first', 'second');
Route::get('example',controller)->middleware(['first', 'second']);

Related

Laravel returning the same view for 2 different routes

Laravel is somehow getting the same view for 2 different routes and I can't figure out why since I'm not very familiar with Laravel.
Here's the 2 routes in question :
Route::get('/{label}', [BookController::class, 'listbyCat'])->name('bycats');
Route::get('/{id}', [BookController::class, 'singlebook'])->name('book');
The first route is the one returning the view (calling the method), that means if I switch between them it wall call singlebook() in both routes.
HTML :
Book
Category
When you try to access any resource you gonna write the route on the browser
so what if i just had two resources like those:
Route::get('/book/{label}', [BookController::class, 'listbyCat'])->name('bycats');
Route::get('/book/{id}', [BookController::class, 'singlebook'])->name('book');
And i am trying to access localhost::8080/book/5
So what tells laravel from this route that this route belongs to which one of the resources ?
Nothing !!
Cause 5 could be considered as a label or id
So you should change the route to be identifiable to laravel
Try to change one of the routes, Example:
Route::get('/book/by/{label}', [BookController::class, 'listbyCat'])->name('bycats');
Route::get('/book/{id}', [BookController::class, 'singlebook'])->name('book');
Should be obvious that when there is no other way for laravel to determine which route you want, that it will route to the first one it has in its routing table.
This would be a simple workaround that should illustrate what you are missing.
Route::get('/cat/{label}', [BookController::class, 'listbyCat'])-name('bycats');
Route::get('/book/{id}', [BookController::class, 'singlebook'])->name('book');
Artisan should be your goto tool whenever you first encounter a problem like this.
php artisan route:list

Laravel Duplicate Route names

I'm using same route name for the get & post methods in route. those routes are using for the same purpose.
ex : I'm calling to load add view form using get route
Route::get('add', 'UserController#addView')->name('user.add');
then,
I'm calling to store data in that form using post route
Route::post('add', 'UserController#store')->name('user.add');
is there any issue , If I use the same route name like this?
No, you can not use the same name for 2 different routes as is stated in the documentation if you really need to name the routes you should look for different names, but if there's no need to have named routes you can have each url with its method like:
Route::get('/your-url', 'App\Http\Controllers\UserController#addView');
Route::post('/your-url', 'App\Http\Controllers\UserController#store');
If you are making a CRUD you can have:
Route::resource('user', UserController::class);
This will create all the urls needed for a CRUD:
Actually you have same name for both routes i.e., name('user.add'). Change that.
Yes you can get issues in future. For example, I had issues after functionality update - I've updated route interface (added some fields) and new fields does not appeared in result after opening URL.
Please run command php artisan optimize to see is it all ok.

What are some use cases of Named Routes in Laravel?

After reading the documentation, I still only have a vague idea of what Named Routes are in Laravel.
Could you help me understand?
Route::get('user/profile', function () {
//
})->name('profile');
Route::get('user/profile', 'UserProfileController#show')->name('profile');
It says:
Once you have assigned a name to a given route, you may use the route's name when generating URLs or redirects via the global route function
I don't understand what the second part of the sentence means, about generating URLs or redirects.
What would be a generated URL in the case of profile from the above example? How would I use it?
The best resource is right here : https://laravel.com/docs/5.8/routing#named-routes
One of the common use case is in your views. Say your post request goes to a particular route, basically without named routes you can simply go like this to store a task
action="/task"
but say for example you need to update the route to /task/store , you will need to update it everywhere you use the route.
But consider you used a named route
Route::post('/task', 'TaskController#store')->name('task.store');
With named routes you can use the route like this in your view:
action="{{route('task.store')}}"
Now if you choose to update your route, you only need to make the change in the routes file and update it to whatever you need.
Route::post('/task/now/go/here', 'TaskController#store')->name('task.store');
If you need to pass arguments to your routes, you pass it as arguments to route helper like this:
route('task.edit', 1), // in resource specific example it will output /task/1/edit
All of the view examples are given you use blade templating.
After adding a name to a route, you can use the route() helper to create urls.
This can now be used in your application.
For instance, in your blade templates this may look like:
{{ route('profile') }}
This will use the application url and the route path to create a url.
this is how it looks it:
named route sample name('store');:
Route::get('/store-record','YourController#function')->name('store');
store is the named route here. to call it use route('store')
defining another type of route. this is not named route:
Route::get('/store-record','YourController#function')
you can access this route using {{ url('/store-record') }}
hope this helps

Laravel how to generate urls using GET route names?

I got this 2 routes in my routes file (web)
Route::get('management/special-fees/add/{userId}', 'Management\SpecialFeeController#create')->name('management/special-fees/add');
Route::post('management/special-fees/add', 'Management\SpecialFeeController#store')->name('management/special-fees/add');
They both share the same name but one is GET and the other is POST, so far so good. But now I want to make an url in my view to open the form, for that I use the method route() like this
route('management/special-fees/add',$user->id )
but when trying to go to the url I get this route
.../management/special-fees/add?5
there is a question mark instead of a "/" so the route is invalid.
I made some tests and I figured out that happens because is trying to go to the POST route instead of the GET one if I change the POST route's url in the web file like this
Route::get('management/special-fees/add/{userId}', 'Management\SpecialFeeController#create')->name('management/special-fees/add');
Route::post('management/special-fees/addSSSS', 'Management\SpecialFeeController#store')->name('management/special-fees/add');
I will in fact get this url
.../management/special-fees/addSSSS?5
So why is the route() method generating a url for the POST route over the GET one? how do I make it to choose the GET route first?
In laravel the routing is prioritized by in the order it is written in your route.php file.
In this case you're writing the Route::post last, which in turn tells Laravel that that one should have the highest priority. Try switching them and the Route::get will have the higher priority.
Like so:
Route::post('management/special-fees/addSSSS', 'Management\SpecialFeeController#store')->name('management/special-fees/add');
Route::get('management/special-fees/add/{userId}', 'Management\SpecialFeeController#create')->name('management/special-fees/add');
I may be wrong, but I think you'll have to re-think route naming. One of the problems route naming helps eliminate is redundant and complex names. For example, if you looked at route:list for Route::resource('something', 'SomethingController') it will have something.index, something.store as route names for Route::get('something') and Route::post('something').
If it's the same name, it will always resolve to the first one and will probably never hit the second route; in your case will hit the POST route and never the GET route.
?5 means 5 is an argument for your get route.
try this
url('management/special-fees/add/'.$user->id)
for get route insted of
route('management/special-fees/add',$user->id )

Get route pattern by route name in laravel 5.3

In laravel 5.1, I was able to get the route path by route name, for example:
Defined Route:
Route::post('users/{user_id}/delete', 'UserController#delete')->name('user:delete');
In laravel 5.1, when I tried the below method, It gave the route without any error If I didn't pass any route parameter:
route('user:delete'); // Output: http://example.com/users/%7Buser_id%7D/delete
and then in javascript, I simply replaced %7Buser_id%7D with the user id dynamically. But laravel 5.3 is throwing error when accessing route by name that has parameters and I don't want to pass one, because the parameters are set dynamically from the javascript.
Is there any way I can access route pattern by route name like:
http://example.com/users/{user_id}/delete
Or
/users/{user_id}/delete
Thanks in advance.
You can give some route method some value, that will be then replaced in javascript. For example: route('user:delete', 'USER_ID'), then in javascript you will simply replace USER_ID.
or the better way, is to use package called "Laroute"

Categories