我正在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;非对象。
我需要做些什么?谢谢:))!
答案 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_-]+');
创建,更新,销毁新单词效果很好。最终有一个小问题。当我想更新某个特定单词并更改其名称时,保存该单词后,我就会
抱歉,找不到您要查找的页面。
如果我查看网址,我会看到旧名称而不是新名称。 这与我的更新方法有关,我该如何解决??