I have this:
Route::get('/admin/funcionarios', [App\Http\Controllers\AuthController::class, 'funcionarios'])->name('funcionarios');
and this:
<?php
namespace App\Http\Controllers;
use App\Models\Funcionarios;
class FuncionarioController extends Controller {
public function destroy($id) {
$funcionario = Funcionarios::find($id);
$funcionario->delete();
return redirect()->route('admin.funcionarios');
}
}
The problem is I get this error: Route [admin.funcionarios] not defined. (Symfony\Component\Routing\Exception\RouteNotFoundException)
Any ideas how to solve?
You can name your route what you would like, so instead of funcionarios you could name it admin.funcionarios if you prefer:
Route::get(...)->name('admin.funcionarios');
You can also use a Route Group to cascade this admin. name to the routes inside of it if you want:
Route::name('admin.')->group(function () {
Route::get(...)->name('funcionarios');
});
Now that route name for that route would be admin.funcionarios as route groups "cascade" configuration.
Laravel 8.x Docs - Routing - Named Routes
Laravel 8.x Docs - Routing - Route Groups - Route Name Prefixes
Try this:
Route::get('/admin/funcionarios',['as' => 'admin.funcionarios', App\Http\Controllers\AuthController::class, 'funcionarios']);
If you want to return redirect()->route('admin.funcionarios');
Try to change :
Route::get('/admin/funcionarios', [App\Http\Controllers\AuthController::class, 'funcionarios'])->name('funcionarios');
To
Route::get('/admin/funcionarios', [App\Http\Controllers\AuthController::class, 'funcionarios'])->name('admin.funcionarios');
or you can do it like this:
public function destroy($id) {
$funcionario = Funcionarios::find($id);
$funcionario->delete();
return redirect()->route('funcionarios');
}
if what the name part of the route is, you must write it in parentheses.
Related
I have a route like the following.
Route::get('/articles/{articleSlug}' ,
[App\Http\Controllers\ArticleController::class, 'single']);
And the method of single() at ArticleController class goes here:
public function single($slug)
{
$article = Article::where('slug',$slug)->first();
$article->increment('viewCount');
return view('home.article',compact('article'));
}
Now I wish to use Route Model Binding for finding this data from the articles table based on the column slug. But as I know, Route Model Binding finds data based on the id. So how to change Route Model Binding finding data from id to slug ONLY for ArticleController.php (meaning that the other Controller classes can work with id as route model binding)?
In case you want to use other model field as the biding attribute instead of id you can define a getRouteKeyName which return the name of the field which must be use
class Article extends Model {
// other methods goes here
public function getRouteKeyName() {
return 'slug';
}
}
Or you can pass the field name directly when you define the route like this
Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
With this code inside of your controller you must ensure that the name provide as parameter in the route definition match the name of the controller argument
public function single(Article $article)
{
$article->increment('viewCount');
return view('home.article',compact('article'));
}
Your controller is already set up, all you need to do is change your variable name to $slug in the route, and I believe that should be enough:
Route::get('/articles/{slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
change your route to this:
Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
and then inject the Article model to your controller function and let laravel do the rest for you:
public function single(Article $article)
{
$article->increment('viewCount');
return view('home.article',compact('article'));
}
you can customize route model bindings directly in the route definition:
past given code in app/model/Article.php:
public function getRouteKeyName()
{
return 'slug';
}
2.when you use slug change route to
Route::get('/articles/{article:slug}' , [App\Http\Controllers\ArticleController::class, 'single']);
to use id sample change slug to id
Route::get('/articles/{article:id}' , [App\Http\Controllers\ArticleController::class, 'single']);
you can add bind method to your model boot() like this
public function boot()
{
Route::bind('article', function ($value) {
return Article::where('slug', $value)->firstOrFail();
});
}
to learn more about it read this section in the Laravel docs
https://laravel.com/docs/9.x/routing#customizing-the-resolution-logic
I am getting a "404 | Not Found" error when i try to access a specific item from my database. The items with the specific ID's do exist in the database, but i am not even sure if that even has any influence on the problem.
My routing looks likes this:
Route::prefix('departments')->group(function() {
Route::get('/{id}', [DepartmentController::class, 'showDepartment']);
});
And the related controller looks like this:
public function showDepartment() {
return '';
}
}
I haven't yet finished the function. I just wanted to check if the routing even worked by returning an empty string.
So what am i doing wrong? Is it the routing or the controller?
According to the Laravel documentation, you have to define the parameter in the route then use it in the controller as a parameter.
in your controller:
public function showDepartment($id) {
return 'Hello';
}
The id is not bound to any model to fetch from the database to do that you can use Laravel route model binding
for example when you have a model named Department you write your route like this:
Route::get('/{department}', [DepartmentController::class, 'showDepartment']);
and in the controller:
public function showDepartment(Department $department) {
return 'Hello from depratment';
}
When your department exists it returns the response otherwise return 404.
You may need a Department model class. Then you can find the item from database by id $department = Department::findOrFail($id);
you are send parameter in route and this function without any parameter
route :
Route::prefix('departments')->group(function() {
Route::get('/{id}', [DepartmentController::class, 'showDepartment']);
});
your function in controller should be
public function showDepartment($id) {
$department = Department::findOrFail($id);
}
}
In my web.php file, I specify the following route:
Route::get('/{project}', 'ProjectsController#index');
In my ProjectsController, I define the public function index as follows:
use App\Project;
// ... Here is the class declaration etc.
public function index(Project $project) {
dd($project->name);
}
Currently, I have one entry in my projects table, which I can call without any problems over my eloquent model. This is my entry:
Name: sampleproject
Description: This is a test.
ID: 1
// And the timestamps...
When calling /sampleproject, it returns a 404 error page.
[...]
UPDATE: When calling /1, which is the project id, everything works as expected. How can I modify my code so I can call my Controller over the project name, not the id?
in your model:
public function getRouteKeyName()
{
return 'yourcolumn';
}
I'm building my first laravel app.
I'm trying to display all posts in x category.
My routes:
Route::get('/', 'PostsController#index')->name('home');
Route::get('/{id}/{slug?}', 'PostsController#show')->name('show');
Route::get('/categories/{category}', 'CategoriesController#index')->name('category');
My category model:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
public function getRouteKeyName()
{
return 'slug';
}
}
My category controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Category;
class CategoriesController extends Controller
{
public function index(Category $category)
{
$posts = $category->posts;
return view('index', compact('posts'));
}
}
Getting: "Sorry, the page you are looking for could not be found."
Works if I change:
Route::get('/{id}/{slug?}', 'PostsController#show')->name('show');
To:
Route::get('/{post}', 'PostsController#show')->name('show');
Thank you in advance!
Your route /{id}/{slug?} regex is capturing the word categories of your other route and preventing it to work as expected. You have 2 options here:
Move the categories/{category} up to the post route. Laravel routes stops on first match.
Define what {id} can be
Route::get('/{id}/{slug?}', 'PostsController#show')->name('show')->where('id', '[0-9]*');
Anyway, if that post id route is a backend route, I shall recommend to you to prefix it like posts/{id}/{slug?}. If it's a frontend, choose one of the previous solutions (or even both).
This sounds like it's the route that's configured incorrectly, sometimes the order that you define the routes can cause issues.
try to define the routes in theis order instead to see if it makes a difference:
Route::get('/{id}/{slug?}', 'PostsController#show')->name('show');
Route::get('/', 'PostsController#index')->name('home');
Route::get('/categories/{category}', 'CategoriesController#index')->name('category');
İf you have many to many or one to many relationships between categories and posts, you can do that.
Route::get('categories/{category_slug?}',['as'=>'category.show','uses'=>'CategoriesController#Show'})
and in your controller;
public function Show($category_slug){
$category = Category::where('category_slug',$category_slug)->first();
return view('index',compact('category'));
}
and in your blade;
#foreach($category->posts as $post)
$post->title
$post->content
#endforeach
Suppose I have these routes :
$api->group(['prefix' => 'Course'], function ($api) {
$api->group(['prefix' => '/{course}'], function ($api) {
$api->post('/', ['uses' => 'CourseController#course_details']);
$api->post('Register', ['uses' => 'CourseController#course_register']);
$api->post('Lessons', ['uses' => 'CourseController#course_lessons']);
});
});
As you can see all / , Register and Lessons route prefixed by a course required parameter.
course parameter is a ID of a Course model that I want to use for route model binding.
But In the other hand when I want use course parameter for example in course_details function, it returns null. like this :
public function course_details (\App\Course $course)
{
dd($course);
}
But if I use below, all things worked fine :
public function course_details ($course)
{
$course = Course::findOrFail($course);
return $course;
}
Seems that it can not bind model properly.
What is Problem ?
Update :
In fact I'm using dingo-api laravel package to create an API. all routes defined based it's configuration.
But there is an issue about route model binding where to support route model binding we must to add a middleware named binding to each route that need model binding. HERE is described it.
A bigger problem that exists is when I want to add binding middleware to a route group, it does not work and I must add it to each of routes.
In this case I do not know how can I solve the problem.
Solution:
After many Googling I found that :
I found that must to add bindings middleware in the same route group that added auth.api middleware instead adding it to each sub routes separately.
means like this :
$api->group(['middleware' => 'api.auth|bindings'], function ($api) {
});
add in kernel.php
use Illuminate\Routing\Middleware\SubstituteBindings;
protected $routeMiddleware = [
...
'bindings' => SubstituteBindings::class,
];
and in your group route:
Route::middleware(['auth:sanctum', 'bindings'])->group(function(){
... you routes here ...
});
this worked for me. thanks
As you said
course parameter is a ID of a Course
You can use Request to get id, try like this
public function course_details (Request $request)
{
return dd($request->course);
}
I came across a similar issue. I think you need to use the 'bindings' middleware on your routes.
See my answer here:
https://stackoverflow.com/a/55949930/2867894
Take a close look on:
// Here $course is the id of the Course
public function course_details ($course)
{
$course = Course::findOrFail($course);
return $course;
}
But here:
// Here $course is the object of the model \App\Course
public function course_details (\App\Course $course)
{
dd($course);
}
that should be
public function course_details ($course, \App\Course $_course)
{
// add your model here with object $_course
// now $course return the id in your route
dd($course);
}
After searching for 2 hours I got the issue details
For route binding to work, your type-hinted variable name must match the route placeholder name
For example my edit method
Here is my route URI for the edit
user/role/{role}/edit
As you can see there is {role} placeholder in the route definition, so the corresponding variable must be called $role.
public function edit(Role $role)
{
return view('role.edit',compact('role'));
}