在url中显示名称而不是id?

时间:2018-01-07 21:38:21

标签: php laravel-5.5

我正在Laravel中构建一个小应用程序,但我需要使用一些帮助。我读过类似的任务,但我不知道它们与我的相关。

我正在制作的应用是一本字典,我真的没有在网址中找到 id 显示字词的部分。我试图恢复凝固的逻辑(存储,更新,删除,显示),以便他们使用单词名称执行操作,而不是单词id < / em>的。那很有效。在操作确实有效后,重定向到路由 app / {name}

现在,我认为当curds没有对 id 采取行动时,这不是它需要做的事情吗?

我也读过关于slu ,,但是因为我正在建立一本字典,所以不要理解为什么我需要用&#34; - &#34; ?它只是一个单词,而不是帖子。为什么我需要在我的表单中有一个额外的字段用于slug,因为 slug 必须等于名称?我在这里遇到错误: slug-&gt; unique()字段必须为空

如果有人有时间,请向我说明在网址中显示名称的最佳方法是什么。谢谢,我很感激。

修改

以下是我更新crud的代码:

public function update(UpdateWordRequest $request, $name)
{
    Word::query()->where('name', $name)->firstOrFail()->update($request->input());
    return redirect()->route('dictionary.show', ['name' => $name])->with('success', 'Edited successfully!');
}

它工作正常,但是当我重新编辑单词并将其更改为word2时,我会收到一个错误:尝试获取属性&#39; name&#39;非对象

我需要做些什么?谢谢:))!

2 个答案:

答案 0 :(得分:2)

我认为您应该可以使用特征来解决此问题。

我会创建一个特征调用hasSlug并具有以下代码:

<?php

namespace App\Traits;

trait HasSlug
{

protected static function bootHasSlug()
{
    static::creating(function ($model) {

        $columnName = static::getSlugColumn();

        $model->$columnName = str_slug($model->name); //convert your name to slug
    });
}


public function getSlugAttribute()
{
    $columnName = static::getSlugColumn();

    return (string) $this->attributes[$columnName];
}

protected static function getSlugColumn()
{
    if (isset(static::$slugColumn)) {
        return static::$slugColumn;
    }

    return 'slug';
}
}

所以现在,如果你每次创建一个记录时都使用HasSlug trait到你的模型,那么它将从模型中寻找名称字段并从中创建一个slug。

如果需要,请务必对您的姓名字段应用唯一约束。

为了更加健壮,请查看spatie slug包https://github.com/spatie/laravel-sluggable

答案 1 :(得分:0)

这是我最终想出来的。

<强> Word.php

我用@usrNotFound建议spatie/laravel-sluggable

<?php

namespace App;

use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;

class Word extends Model
{
    use HasSlug;

    /**
    * @return SlugOptions
    */
    public function getSlugOptions(): SlugOptions
    {
        return SlugOptions::create()
            ->generateSlugsFrom('name')
            ->saveSlugsTo('slug')
            ->slugsShouldBeNoLongerThan(20);
    }

    /**
    * @param $query
    * @param $slug
    * @return mixed
    */
    public function scopeFindBySlug($query, $slug)
    {
        return $query->where('slug', $slug)
            ->get();
    }
}

<强> WordController.php

<?php

namespace App\Http\Controllers;

use App\Word;
use App\Http\Requests\CreateWordRequest;
use App\Http\Requests\UpdateWordRequest;

class WordController extends Controller
{

    /**
     * Store a newly created resource in storage.
     * @param CreateWordRequest $request
     * @return mixed
     */
    public function store(CreateWordRequest $request)
    {
        $word = Word::query()
            ->create($request->input());
        return redirect()
            ->route('dictionary.show', $word->slug)
            ->with('success', 'Created successfully!');
    }

    /**
     * Display the specified resource.
     * @param $slug
     * @return mixed
     */
    public function show($slug)
    {
        $word = Word::whereSlug($slug)
            ->firstOrFail();
        return view('word.show')
            ->with('word', $word);
    }

    /**
    * Update the specified resource in storage.
    * @param UpdateWordRequest $request
    * @param $slug
    * @return mixed
    */
    public function update(UpdateWordRequest $request, $slug)
    {
        Word::whereSlug($slug)
            ->firstOrFail()
            ->update($request->input());
        return redirect()
            ->route('dictionary.show', $slug)
            ->with('success', 'Edited successfylly!');
    }

    /**
    * Remove the specified resource from storage.
    * @param $slug
    * @return mixed
    */
    public function destroy($slug)
    {
        Word::whereSlug($slug)
            ->delete();
        return redirect()
            ->route('dictionary.index')
            ->with('success', 'Deleted successfully');
    }
}

<强> Route.php

Route::get('/dictionary/{slug}', 'WordController@show')
    ->name('dictionary.show')
    ->where('slug', '[-A-Za-z0-9_-]+');

创建,更新,销毁新单词效果很好。最终有一个小问题。当我想更新某个特定单词并更改其名称时,保存该单词后,我就会

  

抱歉,找不到您要查找的页面。

如果我查看网址,我会看到旧名称而不是新名称。 这与我的更新方法有关,我该如何解决?