Enforce unique slugs

closes flarum/core#393
This commit is contained in:
Toby Zerner 2015-10-19 16:50:19 +10:30
parent 244b8fd132
commit bf04dba33e
6 changed files with 54 additions and 9 deletions

View File

@ -27,8 +27,4 @@ return function (Dispatcher $events) {
$events->subscribe(Access\DiscussionPolicy::class);
$events->subscribe(Access\TagPolicy::class);
$events->subscribe(Access\FlagPolicy::class);
Tag::saving(function ($model) {
$this->app->make('Flarum\Tags\TagValidator')->assertValid($model);
});
};

View File

@ -101,9 +101,9 @@ export default class EditTagModal extends Modal {
isHidden: this.isHidden()
}).then(
() => this.hide(),
() => {
response => {
this.loading = false;
m.redraw();
this.handleErrors(response);
}
);
}

View File

@ -0,0 +1,23 @@
<?php
namespace Flarum\Tags\Migration;
use Flarum\Database\AbstractMigration;
use Illuminate\Database\Schema\Blueprint;
class MakeSlugUnique extends AbstractMigration
{
public function up()
{
$this->schema->table('tags', function (Blueprint $table) {
$table->unique('slug');
});
}
public function down()
{
$this->schema->table('tags', function (Blueprint $table) {
$table->dropUnique('tags_slug_unique');
});
}
}

View File

@ -12,11 +12,25 @@ namespace Flarum\Tags\Command;
use Flarum\Core\Access\AssertPermissionTrait;
use Flarum\Tags\Tag;
use Flarum\Tags\TagValidator;
class CreateTagHandler
{
use AssertPermissionTrait;
/**
* @var TagValidator
*/
protected $validator;
/**
* @param TagValidator $validator
*/
public function __construct(TagValidator $validator)
{
$this->validator = $validator;
}
/**
* @param CreateTag $command
* @return Tag
@ -36,6 +50,8 @@ class CreateTagHandler
array_get($data, 'attributes.isHidden')
);
$this->validator->assertValid($tag->getAttributes());
$tag->save();
return $tag;

View File

@ -12,6 +12,7 @@ namespace Flarum\Tags\Command;
use Flarum\Core\Access\AssertPermissionTrait;
use Flarum\Tags\TagRepository;
use Flarum\Tags\TagValidator;
class EditTagHandler
{
@ -23,11 +24,18 @@ class EditTagHandler
protected $tags;
/**
* @param TagRepository $tags
* @var TagValidator
*/
public function __construct(TagRepository $tags)
protected $validator;
/**
* @param TagRepository $tags
* @param TagValidator $validator
*/
public function __construct(TagRepository $tags, TagValidator $validator)
{
$this->tags = $tags;
$this->validator = $validator;
}
/**
@ -70,6 +78,8 @@ class EditTagHandler
$tag->is_restricted = (bool) $attributes['isRestricted'];
}
$this->validator->assertValid($tag->getDirty());
$tag->save();
return $tag;

View File

@ -19,6 +19,6 @@ class TagValidator extends AbstractValidator
*/
protected $rules = [
'name' => ['required'],
'slug' => ['required', 'unique:slug']
'slug' => ['required', 'unique:tags']
];
}