diff --git a/.gitignore b/.gitignore index e46b126..f95b139 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /bin composer.phar composer.lock -.DS_Store \ No newline at end of file +.DS_Store +.idea \ No newline at end of file diff --git a/src/Abstractor/Eloquent/Model.php b/src/Abstractor/Eloquent/Model.php index 7355482..f873d61 100644 --- a/src/Abstractor/Eloquent/Model.php +++ b/src/Abstractor/Eloquent/Model.php @@ -7,6 +7,7 @@ use ANavallaSuiza\Laravel\Database\Contracts\Dbal\AbstractionLayer; use Illuminate\Database\Eloquent\Model as LaravelModel; use App; +use ANavallaSuiza\Crudoado\Contracts\Form\Generator as FormGenerator; class Model implements ModelAbstractorContract { @@ -14,6 +15,7 @@ class Model implements ModelAbstractorContract protected $dbal; protected $relationFactory; + protected $generator; protected $model; protected $config; @@ -22,7 +24,7 @@ class Model implements ModelAbstractorContract protected $name; protected $instance; - public function __construct($config, AbstractionLayer $dbal, RelationFactory $relationFactory) + public function __construct($config, AbstractionLayer $dbal, RelationFactory $relationFactory, FormGenerator $generator) { if (is_array($config)) { $this->model = $config['model']; @@ -34,6 +36,7 @@ public function __construct($config, AbstractionLayer $dbal, RelationFactory $re $this->dbal = $dbal; $this->relationFactory = $relationFactory; + $this->generator = $generator; } public function setSlug($slug) diff --git a/src/Abstractor/Eloquent/ModelFactory.php b/src/Abstractor/Eloquent/ModelFactory.php index 81fdd08..c2ab602 100644 --- a/src/Abstractor/Eloquent/ModelFactory.php +++ b/src/Abstractor/Eloquent/ModelFactory.php @@ -5,6 +5,7 @@ use ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory as RelationAbstractorFactoryContract; use ANavallaSuiza\Laravel\Database\Contracts\Manager\ModelManager; use EasySlugger\Slugger; +use ANavallaSuiza\Crudoado\Contracts\Form\Generator as FormGenerator; class ModelFactory implements ModelAbstractorFactoryContract { @@ -13,13 +14,18 @@ class ModelFactory implements ModelAbstractorFactoryContract protected $slugger; protected $allConfiguredModels; + /** + * @var FormGenerator + */ + private $generator; - public function __construct(array $allConfiguredModels, ModelManager $modelManager, RelationAbstractorFactoryContract $relationFactory) + public function __construct(array $allConfiguredModels, ModelManager $modelManager, RelationAbstractorFactoryContract $relationFactory, FormGenerator $generator) { $this->allConfiguredModels = $allConfiguredModels; $this->modelManager = $modelManager; $this->relationFactory = $relationFactory; $this->slugger = new Slugger(); + $this->generator = $generator; } /** @@ -42,7 +48,7 @@ public function getBySlug($slug, $id = null) $modelNamespace = $config; } - $model = new Model($config, $this->modelManager->getAbstractionLayer($modelNamespace), $this->relationFactory); + $model = new Model($config, $this->modelManager->getAbstractionLayer($modelNamespace), $this->relationFactory, $this->generator); $model->setSlug($modelSlug) ->setName($modelName); @@ -69,4 +75,11 @@ public function getByName($name, $id = null) { return $this->getBySlug($this->slugger->slugify($name)); } + + public function getByClassName($classname, $id = null) + { + $model = new Model(['model' => $classname], $this->modelManager->getAbstractionLayer($classname), $this->relationFactory, $this->generator); + + return $model; + } } diff --git a/src/Abstractor/Eloquent/Relation/Translation.php b/src/Abstractor/Eloquent/Relation/Translation.php index 5e7ca5f..6578fdf 100644 --- a/src/Abstractor/Eloquent/Relation/Translation.php +++ b/src/Abstractor/Eloquent/Relation/Translation.php @@ -2,6 +2,7 @@ namespace ANavallaSuiza\Crudoado\Abstractor\Eloquent\Relation; use ANavallaSuiza\Crudoado\Abstractor\Eloquent\Model; +use App; class Translation extends Relation { @@ -25,11 +26,10 @@ public function checkEloquentRelationCompatibility() */ public function getEditFields() { - $modelAbstractor = new Model( - get_class($this->eloquentRelation->getRelated()), - $this->modelManager->getAbstractionLayer(get_class($this->eloquentRelation->getRelated())), - \App::make('ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory', array($this->modelManager)) - ); + /** @var \ANavallaSuiza\Crudoado\Contracts\Abstractor\ModelFactory $modelFactory */ + $modelFactory = App::make('ANavallaSuiza\Crudoado\Contracts\Abstractor\ModelFactory'); + + $modelAbstractor = $modelFactory->getByClassName(get_class($this->eloquentRelation->getRelated())); $fields = $modelAbstractor->getEditFields(); diff --git a/src/Contracts/Abstractor/ModelFactory.php b/src/Contracts/Abstractor/ModelFactory.php index 8eca06f..cff37e8 100644 --- a/src/Contracts/Abstractor/ModelFactory.php +++ b/src/Contracts/Abstractor/ModelFactory.php @@ -14,4 +14,6 @@ public function getBySlug($slug, $id = null); * @return Model */ public function getByName($name, $id = null); + + public function getByClassName($classname, $id = null); } diff --git a/tests/Abstractor/Eloquent/ModelFactoryTest.php b/tests/Abstractor/Eloquent/ModelFactoryTest.php index 1b2dacf..6e00331 100644 --- a/tests/Abstractor/Eloquent/ModelFactoryTest.php +++ b/tests/Abstractor/Eloquent/ModelFactoryTest.php @@ -15,6 +15,8 @@ class ModelFactoryTest extends TestBase protected $modelManagerMock; /** @var Mock */ protected $relationMock; + /** @var Mock */ + protected $generatorMock; public function setUp() { @@ -24,8 +26,9 @@ public function setUp() $this->modelManagerMock = $this->mock('ANavallaSuiza\Laravel\Database\Contracts\Manager\ModelManager'); $this->relationMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory'); + $this->generatorMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Form\Generator'); - $this->sut = new ModelFactory($config, $this->modelManagerMock, $this->relationMock); + $this->sut = new ModelFactory($config, $this->modelManagerMock, $this->relationMock, $this->generatorMock); } public function test_implements_model__factory_interface() @@ -63,4 +66,13 @@ public function test_gets_model_by_slug_and_id() $this->assertInstanceOf('ANavallaSuiza\Crudoado\Contracts\Abstractor\Model', $model); } + + public function test_gets_model_by_classname() + { + $this->modelManagerMock->shouldReceive('getAbstractionLayer')->once()->andReturn($this->mock('ANavallaSuiza\Laravel\Database\Contracts\Dbal\AbstractionLayer')); + + $model = $this->sut->getByClassName('Crudoado\Tests\Models\User'); + + $this->assertInstanceOf('ANavallaSuiza\Crudoado\Contracts\Abstractor\Model', $model); + } } diff --git a/tests/Abstractor/Eloquent/ModelTest.php b/tests/Abstractor/Eloquent/ModelTest.php index efa3ff1..2786706 100644 --- a/tests/Abstractor/Eloquent/ModelTest.php +++ b/tests/Abstractor/Eloquent/ModelTest.php @@ -18,6 +18,8 @@ class ModelTest extends TestBase protected $columnMock; /** @var Mock */ protected $relationMock; + /** @var Mock */ + protected $generatorMock; public function setUp() { @@ -28,8 +30,9 @@ public function setUp() $this->dbalMock = $this->mock('ANavallaSuiza\Laravel\Database\Contracts\Dbal\AbstractionLayer'); $this->relationMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory'); $this->columnMock = $this->mock('Doctrine\DBAL\Schema\Column'); + $this->generatorMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Form\Generator'); - $this->sut = new Model($config['Users'], $this->dbalMock, $this->relationMock); + $this->sut = new Model($config['Users'], $this->dbalMock, $this->relationMock, $this->generatorMock); } public function test_implements_model_interface() diff --git a/tests/Abstractor/Eloquent/TranslationTest.php b/tests/Abstractor/Eloquent/TranslationTest.php index 9428da3..e6648d9 100644 --- a/tests/Abstractor/Eloquent/TranslationTest.php +++ b/tests/Abstractor/Eloquent/TranslationTest.php @@ -43,31 +43,21 @@ public function test_implements_relation_interface() public function test_get_edit_fields_returns_array_of_fields_with_proper_key() { $relationFactoryMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory'); + $modelFactoryMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Abstractor\ModelFactory'); $columnMock = $this->mock('Doctrine\DBAL\Schema\Column'); \App::instance('ANavallaSuiza\Crudoado\Contracts\Abstractor\RelationFactory', $relationFactoryMock); + \App::instance('ANavallaSuiza\Crudoado\Contracts\Abstractor\ModelFactory', $modelFactoryMock); - $this->modelManagerMock->shouldReceive('getAbstractionLayer') - ->andReturn($dbalMock = $this->mock('ANavallaSuiza\Laravel\Database\Contracts\Dbal\AbstractionLayer')); + $modelFactoryMock->shouldReceive('getByClassName') + ->andReturn($this->modelManagerMock); - $dbalMock->shouldReceive('getTableColumns') - ->once() - ->andReturn([ - 'id' => $columnMock, - 'username' => $columnMock, - 'password' => $columnMock, - ]); - $dbalMock->shouldReceive('getModel') - ->andReturn($dbalMock); - - $dbalMock->shouldReceive('getKeyName') - ->andReturn(LaravelModel::CREATED_AT, LaravelModel::UPDATED_AT); - - $dbalMock->shouldReceive('getEditFields')->atLeast()->once() + $this->modelManagerMock->shouldReceive('getEditFields')->atLeast()->once() ->andReturn([$fieldMock = $this->mock('ANavallaSuiza\Crudoado\Contracts\Abstractor\Field')]); + $fieldMock->shouldReceive('getName')->atLeast()->once()->andReturn($fieldName = 'chompy'); - $fieldMock->shouldReceive('setName')->atLeast()->once()->with("translations[][{$fieldName}]"); + $fieldMock->shouldReceive('setName')->atLeast()->once()->with(matchesPattern("/^translations\[[\d]\]\[chompy\]/")); $fields = $this->sut->getEditFields();