Skip to content

Commit c1f72e7

Browse files
Merge pull request #34 from guiwoda/sluggable-validate-on-build
Validate if slug field exists on build instead of on construction
2 parents feb6471 + bd5d5c1 commit c1f72e7

File tree

3 files changed

+49
-15
lines changed

3 files changed

+49
-15
lines changed

src/Extensions/Gedmo/Sluggable.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace LaravelDoctrine\Fluent\Extensions\Gedmo;
44

5-
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
5+
use Doctrine\ORM\Mapping\ClassMetadataInfo;
66
use Gedmo\Exception\InvalidArgumentException;
77
use Gedmo\Sluggable\Mapping\Driver\Fluent as FluentDriver;
88
use LaravelDoctrine\Fluent\Buildable;
@@ -95,8 +95,6 @@ class Sluggable implements Buildable, Extension
9595
*/
9696
public function __construct(ExtensibleClassMetadata $classMetadata, $fieldName, $fields)
9797
{
98-
$this->isValidField($classMetadata, $fieldName);
99-
10098
$this->classMetadata = $classMetadata;
10199
$this->fieldName = $fieldName;
102100
$this->baseOn($fields);
@@ -127,6 +125,8 @@ public static function enable()
127125
*/
128126
public function build()
129127
{
128+
$this->isValidField($this->classMetadata, $this->fieldName);
129+
130130
$this->classMetadata->appendExtension($this->getExtensionName(), [
131131
'slugs' => [
132132
$this->fieldName => $this->makeConfiguration()
@@ -247,13 +247,13 @@ public function suffix($suffix)
247247
/**
248248
* Checks if $field type is valid as Sluggable field
249249
*
250-
* @param ClassMetadata $meta
251-
* @param string $field
250+
* @param ClassMetadataInfo $meta
251+
* @param string $field
252252
*
253253
* @throws InvalidArgumentException
254254
* @return bool
255255
*/
256-
protected function isValidField(ClassMetadata $meta, $field)
256+
protected function isValidField(ClassMetadataInfo $meta, $field)
257257
{
258258
$mapping = $meta->getFieldMapping($field);
259259

tests/Extensions/Gedmo/SluggableTest.php

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@
33

44
use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
55
use Gedmo\Exception\InvalidArgumentException;
6+
use LaravelDoctrine\Fluent\Builders\Builder;
67
use LaravelDoctrine\Fluent\Builders\Field;
78
use LaravelDoctrine\Fluent\Extensions\ExtensibleClassMetadata;
89
use Gedmo\Sluggable\Mapping\Driver\Fluent as SluggableDriver;
910
use LaravelDoctrine\Fluent\Extensions\Gedmo\Sluggable;
11+
use Tests\Stubs\Entities\StubEntity;
1012

1113
/**
1214
* @mixin \PHPUnit_Framework_TestCase
1315
*/
1416
class SluggableTest extends \PHPUnit_Framework_TestCase
1517
{
18+
/**
19+
* @var ClassMetadataBuilder
20+
*/
21+
private $classMetadataBuilder;
22+
1623
/**
1724
* @var string
1825
*/
@@ -30,18 +37,16 @@ class SluggableTest extends \PHPUnit_Framework_TestCase
3037

3138
protected function setUp()
3239
{
33-
$this->fieldName = 'slug';
34-
$this->classMetadata = new ExtensibleClassMetadata('foo');
35-
Field::make(new ClassMetadataBuilder($this->classMetadata), 'string', 'slug')->build();
36-
37-
$this->extension = new Sluggable($this->classMetadata, $this->fieldName, 'name');
40+
$this->fieldName = 'slug';
41+
$this->classMetadata = new ExtensibleClassMetadata(StubEntity::class);
42+
$this->classMetadataBuilder = new ClassMetadataBuilder($this->classMetadata);
3843
}
3944

4045
public function test_it_should_add_itself_as_a_field_macro()
4146
{
4247
Sluggable::enable();
4348

44-
$field = Field::make(new ClassMetadataBuilder(new ExtensibleClassMetadata('Foo')), 'string', $this->fieldName)->build();
49+
$field = Field::make(new ClassMetadataBuilder($this->classMetadata), 'string', $this->fieldName)->build();
4550

4651
$this->assertInstanceOf(
4752
Sluggable::class,
@@ -55,13 +60,40 @@ public function test_can_only_make_a_valid_field_sluggable()
5560

5661
Sluggable::enable();
5762

58-
$field = Field::make(new ClassMetadataBuilder(new ExtensibleClassMetadata('Foo')), 'smallint', $this->fieldName)->build();
63+
$field = Field::make($this->classMetadataBuilder, 'bigint', $this->fieldName);
5964
call_user_func([$field, Sluggable::MACRO_METHOD], 'name');
65+
$field->build();
6066
}
6167

68+
public function test_it_queues_when_used_as_field_macro_so_that_the_field_gets_built_before_the_extension()
69+
{
70+
Sluggable::enable();
71+
72+
$builder = new Builder($this->classMetadataBuilder);
73+
74+
$builder->string('title');
75+
$builder->string('slug')->sluggable('title');
76+
77+
$builder->build();
78+
79+
$this->assertBuildResultIs([
80+
'fields' => ['title'],
81+
'handlers' => [],
82+
'slug' => $this->fieldName,
83+
'style' => 'default',
84+
'dateFormat' => 'Y-m-d-H:i',
85+
'updatable' => true,
86+
'unique' => true,
87+
'unique_base' => null,
88+
'separator' => '-',
89+
'prefix' => '',
90+
'suffix' => ''
91+
]);
92+
}
6293

6394
public function test_it_should_add_sluggable_to_the_given_field()
6495
{
96+
$this->classMetadataBuilder->addField('slug', 'string');
6597
$this->getExtension()->build();
6698

6799
$this->assertBuildResultIs([
@@ -81,6 +113,8 @@ public function test_it_should_add_sluggable_to_the_given_field()
81113

82114
public function test_can_set_custom_settingss()
83115
{
116+
$this->classMetadataBuilder->addField('slug', 'string');
117+
84118
$this->getExtension()
85119
->baseOn('custom')
86120
->handlers('Handler')
@@ -146,7 +180,7 @@ protected function assertBuildResultIs(array $expected)
146180
*/
147181
protected function getExtension()
148182
{
149-
return $this->extension;
183+
return new Sluggable($this->classMetadata, $this->fieldName, 'name');
150184
}
151185

152186
/**

tests/Stubs/Entities/StubEntity.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44

55
class StubEntity
66
{
7-
protected $id, $name, $parent, $children, $one, $many;
7+
protected $id, $name, $parent, $children, $one, $many, $slug;
88
}

0 commit comments

Comments
 (0)