diff --git a/README.md b/README.md index 60f8ec26..647b8d4a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ This bundle offers various utility functionality for the Contao CMS. ## Utils +### Models `huh.utils.model` + +Method | Description +----------------------|------------ +findModelInstanceByPk | Returns a model instance if for a given table and id or null if not exist. + ### Routing `huh.utils.routing` Method | Description diff --git a/src/Model/ModelUtil.php b/src/Model/ModelUtil.php index 36f5dd24..684e29a5 100644 --- a/src/Model/ModelUtil.php +++ b/src/Model/ModelUtil.php @@ -22,6 +22,9 @@ public function __construct(ContaoFrameworkInterface $framework) } /** + * Returns a model instance if for a given table and id(primary key). + * Return null, if model type or model instance with given id not exist. + * * @param string $table * @param mixed $pk * @param array $options @@ -30,7 +33,7 @@ public function __construct(ContaoFrameworkInterface $framework) */ public function findModelInstanceByPk(string $table, $pk, array $options = []) { - if (!($modelClass = Model::getClassFromTable($table))) { + if (!($modelClass = $this->framework->getAdapter(Model::class)->getClassFromTable($table))) { return null; } diff --git a/tests/ModelUtilTest.php b/tests/ModelUtilTest.php new file mode 100644 index 00000000..77afd935 --- /dev/null +++ b/tests/ModelUtilTest.php @@ -0,0 +1,82 @@ +mockContaoFramework()); + $this->assertInstanceOf(ModelUtil::class, $util); + } + + public function testFindModelInstanceByPk() + { + $util = new ModelUtil($this->prepareFramework()); + $this->assertNull($util->findModelInstanceByPk('tl_null', 5)); + $this->assertNull($util->findModelInstanceByPk('tl_null_class', 5)); + $this->assertNull($util->findModelInstanceByPk('tl_content', 4)); + $this->assertNull($util->findModelInstanceByPk('tl_content', 'content_null')); + $this->assertSame(5, $util->findModelInstanceByPk('tl_content', 5)->id); + $this->assertSame('alias', $util->findModelInstanceByPk('tl_content', 'alias')->alias); + } + + public function prepareFramework() + { + $modelAdapter = $this->mockAdapter([ + 'getClassFromTable', + ]); + $modelAdapter + ->method('getClassFromTable') + ->with($this->anything())->willReturnCallback(function ($table) { + switch ($table) { + case 'tl_content': + return ContentModel::class; + case 'tl_null_class': + return 'Huh\Null\Class\Nullclass'; + default: + return null; + } + }) + ; + + $newsModel = $this->mockClassWithProperties(ContentModel::class, [ + 'id' => 5, + 'alias' => 'alias', + ]); + + $contentModelAdapter = $this->mockAdapter(['findByPk']); + $contentModelAdapter + ->method('findByPk') + ->with($this->anything(), $this->anything()) + ->willReturnCallback(function ($pk, $option) use ($newsModel) { + switch ($pk) { + case 'alias': + return $newsModel; + case 5: + return $newsModel; + default: + return null; + } + }) + ; + + $framework = $this->mockContaoFramework([ + Model::class => $modelAdapter, + ContentModel::class => $contentModelAdapter, + ]); + + return $framework; + } +}