use model observer to manage tagging of notes
This commit is contained in:
parent
14cba19903
commit
467b607774
3 changed files with 79 additions and 17 deletions
|
@ -462,7 +462,7 @@ class Note extends Model
|
||||||
$name = str_replace('#', '', $name);
|
$name = str_replace('#', '', $name);
|
||||||
$replacements[$name] =
|
$replacements[$name] =
|
||||||
'<a rel="tag" class="p-category" href="/notes/tagged/'
|
'<a rel="tag" class="p-category" href="/notes/tagged/'
|
||||||
. Tag::normalizeTag($name)
|
. Tag::normalize($name)
|
||||||
. '">#'
|
. '">#'
|
||||||
. $name
|
. $name
|
||||||
. '</a>';
|
. '</a>';
|
||||||
|
|
76
app/Observers/NoteObserver.php
Normal file
76
app/Observers/NoteObserver.php
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Observers;
|
||||||
|
|
||||||
|
use App\{Note, Tag};
|
||||||
|
|
||||||
|
class NoteObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Listen to the Note created event.
|
||||||
|
*
|
||||||
|
* @param \App\Note $note
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function created(Note $note)
|
||||||
|
{
|
||||||
|
$tags = $this->getTagsFromNote($note->getAttributes()['note']);
|
||||||
|
|
||||||
|
if (count($tags) === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tags->transform(function ($tag) {
|
||||||
|
return Tag::firstOrCreate(['tag' => $tag]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$note->tags()->attach($tags->map(function ($tag) {
|
||||||
|
return $tag->id;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen to the Note updated event.
|
||||||
|
*
|
||||||
|
* @param \App\Note $Note
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function updated(Note $note)
|
||||||
|
{
|
||||||
|
$tags = $this->getTagsFromNote($note->getAttributes()['note']);
|
||||||
|
if (count($tags) === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tags->transform(function ($tag) {
|
||||||
|
return Tag::firstOrCreate(['tag' => $tag]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$note->tags()->sync($tags->map(function ($tag) {
|
||||||
|
return $tag->id;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen to the Note deleting event.
|
||||||
|
*
|
||||||
|
* @param \App\Note $note
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleting(Note $note)
|
||||||
|
{
|
||||||
|
$note->tags()->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTagsFromNote($note)
|
||||||
|
{
|
||||||
|
preg_match_all('/#([^\s<>]+)\b/', $note, $tags);
|
||||||
|
if (array_get($tags, '1') === null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return collect($tags[1])->map(function ($tag) {
|
||||||
|
return Tag::normalize($tag);
|
||||||
|
})->unique();
|
||||||
|
}
|
||||||
|
}
|
18
app/Tag.php
18
app/Tag.php
|
@ -6,13 +6,6 @@ use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
class Tag extends Model
|
class Tag extends Model
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* The database table used by the model.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $table = 'tags';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the relationship with tags.
|
* Define the relationship with tags.
|
||||||
*
|
*
|
||||||
|
@ -31,13 +24,6 @@ class Tag extends Model
|
||||||
return $this->belongsToMany('App\Bookmark');
|
return $this->belongsToMany('App\Bookmark');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The attributes excluded from the model's JSON form.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $hidden = ['deleted'];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We shall set a blacklist of non-modifiable model attributes.
|
* We shall set a blacklist of non-modifiable model attributes.
|
||||||
*
|
*
|
||||||
|
@ -52,7 +38,7 @@ class Tag extends Model
|
||||||
*/
|
*/
|
||||||
public function setTagAttribute($value)
|
public function setTagAttribute($value)
|
||||||
{
|
{
|
||||||
$this->attributes['tag'] = $this->normalizeTag($value);
|
$this->attributes['tag'] = $this->normalize($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,7 +47,7 @@ class Tag extends Model
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
*/
|
*/
|
||||||
public static function normalizeTag($tag)
|
public static function normalize($tag)
|
||||||
{
|
{
|
||||||
return mb_strtolower(
|
return mb_strtolower(
|
||||||
preg_replace(
|
preg_replace(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue