majid_shoorabi
majid_shoorabi

Reputation: 129

Not found for some routes

I have a problem with some of my routes in Laravel. this my code in web.php file:

Route::group(['namespace' => 'Admin', 'middleware' => ['auth:web']], function () {
    Route::get('/admin/audio/create/{audio?}', 'AdminAudioController@create')->name('admin.audioCreate');
    Route::get('/admin/article/create/{article?}', 'AdminArticleController@create')->name('admin.articleCreate');
}

and this my link in blade

<a href="{{ route('admin.audioCreate' , ['audio' => $audio->audioId]) }}"><i class="fa fa-edit"></i></a>    
<a href="{{ route('admin.articleCreate' , ['article' => $article->articleId]) }}"><i class="fa fa-edit"></i></a>

and this are my Controllers: AdminAudioController

<?php

namespace App\Http\Controllers\Admin;

use App\Article;
use App\Http\Requests\ArticleRequest;

class AdminArticleController extends AdminController
{
    public function index()
    {
        $articleList = Article::where('removed', false)->latest()->paginate(10);
        return view('admin.article.archive', compact('articleList'));
    }

    public function create(Article $article = null)
    {
        return view('admin.article.create', compact('article'));
    }
}

AdminArticleController

<?php

namespace App\Http\Controllers\Admin;

use App\Article;
use App\Http\Requests\ArticleRequest;

class AdminArticleController extends AdminController
{
    public function index()
    {
        $articleList = Article::where('removed', false)->latest()->paginate(10);
        return view('admin.article.archive', compact('articleList'));
    }

    public function create(Article $article = null)
    {
        return view('admin.article.create', compact('article'));
    }
}

but my second link with name "admin.articleCreate" doesn't work and get "404 not found" what should I do?

and this is my article model

class Article extends Model
{
protected $primaryKey = 'articleId';

use Sluggable;

protected $fillable = [
    'title',
    'subTitle1', 'subTitle2',
    'image',
    'description',
    'body',
    'enable',
];

protected $casts = [
    'image' => 'array'
];

/**
 * Return the sluggable configuration array for this model.
 *
 * @return array
 */
public function sluggable(): array
{
    return [
        'slug' => [
            'source' => 'title'
        ]
    ];
}

public function getRouteKeyName()
{
    return 'slug';
}
}

Upvotes: 1

Views: 59

Answers (3)

Cl&#233;ment Baconnier
Cl&#233;ment Baconnier

Reputation: 6058

When you call the method create(Article $article = null) on your controller, Laravel uses Model Binding to resolve your model and the model binding uses the method you have added to your model

public function getRouteKeyName()
{
    return 'slug'; // by default it will be $primaryKey which is 'id'
}

In short, Laravel will try to use slug to find your model while your giving him articleId

So to fix it you have few options

  • Using the slug in the URL (the one I would recommend)
// blade.php
<a href="{{ route('admin.articleCreate' , ['article' => $article->slug]) }}"><i class="fa fa-edit"></i></a>
  • Using the primary articleId in the URL
// blade.php
<a href="{{ route('admin.articleCreate' , ['article' => $article->articleId]) }}"><i class="fa fa-edit"></i></a>

// Article.php.php
public function getRouteKeyName()
{
    return 'articleId'; 
}
  • Using a query

// blade.php
<a href="{{ route('admin.articleCreate' , ['article' => $article->YOUR_FIELD]) }}"><i class="fa fa-edit"></i></a>

//Controller.php
public function create($article = null)
{
    $article = Article::where('YOUR_FIELD', $article)->firstOrFail();
    return view('admin.article.create', compact('article'));
}

Upvotes: 1

Shiv Kumar Singh
Shiv Kumar Singh

Reputation: 107

I can see you have mentioned $article in side compact.

Can you please check once, I think the create method should look like this:

public function create(Article $article = null)
{
    return view('admin.article.create', compact('article'));
}

Upvotes: 0

Maxim Abdalov
Maxim Abdalov

Reputation: 559

you have code

return view('admin.article.create', compact('$article'));

but need

return view('admin.article.create', compact('article'));

Upvotes: 0

Related Questions