Skip to content

Commit ef40a9a

Browse files
authored
Merge pull request #88 from UseMuffin/endpoint-default-conn-name
Improve error message for missing connection.
2 parents 801c58d + b068dfc commit ef40a9a

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/Model/EndpointLocator.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
use Cake\Core\App;
77
use Cake\Datasource\ConnectionManager;
8+
use Cake\Datasource\Exception\MissingDatasourceConfigException;
89
use Cake\Utility\Inflector;
10+
use Muffin\Webservice\Datasource\Connection;
911
use RuntimeException;
1012

1113
/**
@@ -99,9 +101,9 @@ public function get(string $alias, array $options = []): Endpoint
99101
$connectionName = Inflector::underscore(end($pluginParts));
100102
}
101103

102-
$options['connection'] = ConnectionManager::get($connectionName);
104+
$options['connection'] = $this->getConnection($connectionName);
103105
} elseif (is_string($options['connection'])) {
104-
$options['connection'] = ConnectionManager::get($options['connection']);
106+
$options['connection'] = $this->getConnection($options['connection']);
105107
}
106108

107109
$options['registryAlias'] = $alias;
@@ -111,6 +113,26 @@ public function get(string $alias, array $options = []): Endpoint
111113
return $this->_instances[$alias];
112114
}
113115

116+
/**
117+
* Get connection instance.
118+
*
119+
* @param string $connectionName Connection name.
120+
* @return \Muffin\Webservice\Datasource\Connection
121+
*/
122+
protected function getConnection(string $connectionName): Connection
123+
{
124+
try {
125+
/** @var \Muffin\Webservice\Datasource\Connection */
126+
return ConnectionManager::get($connectionName);
127+
} catch (MissingDatasourceConfigException $e) {
128+
$message = $e->getMessage()
129+
. ' You can override Endpoint::defaultConnectionName() to return the connection name you want.';
130+
131+
/** @psalm-suppress PossiblyInvalidArgument */
132+
throw new MissingDatasourceConfigException($message, $e->getCode(), $e->getPrevious());
133+
}
134+
}
135+
114136
/**
115137
* Check to see if an instance exists in the locator.
116138
*

tests/TestCase/Model/EndpointLocatorTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33

44
namespace Muffin\Webservice\Model;
55

6+
use Cake\Datasource\Exception\MissingDatasourceConfigException;
67
use Cake\TestSuite\TestCase;
78
use RuntimeException;
9+
use TestApp\Model\Endpoint\TestEndpoint;
810

911
class EndpointLocatorTest extends TestCase
1012
{
@@ -115,6 +117,18 @@ public function testGet()
115117
$this->assertSame($first, $result);
116118
}
117119

120+
public function testGetException()
121+
{
122+
$this->expectException(MissingDatasourceConfigException::class);
123+
$this->expectExceptionMessage(
124+
'The datasource configuration "non-existent" was not found.'
125+
. ' You can override Endpoint::defaultConnectionName() to return the connection name you want.'
126+
);
127+
128+
$locator = new EndpointLocator();
129+
$locator->get('Foo', ['className' => TestEndpoint::class, 'connection' => 'non-existent']);
130+
}
131+
118132
public function testGetWithExistingObject()
119133
{
120134
$this->expectException(RuntimeException::class);

0 commit comments

Comments
 (0)