Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"phayes/geophp": "^1.2"
},
"require-dev": {
"doctrine/dbal": "^3.4",
"friendsofphp/php-cs-fixer": "^3.0",
"jubeki/laravel-code-style": "^1.0",
"nunomaduro/larastan": "^1.0|^2.0",
Expand Down Expand Up @@ -48,5 +49,12 @@
}
},
"minimum-stability": "dev",
"prefer-stable": true
"prefer-stable": true,
"extra": {
"laravel": {
"providers": [
"MatanYadaev\\EloquentSpatial\\EloquentSpatialServiceProvider"
]
}
}
}
3 changes: 3 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ parameters:
-
message: '#^Access to an undefined property Pest\\Expectation\|Pest\\Support\\Extendable\:\:\$.+\.$#'
path: tests/*.php
-
message: '#^Call to an undefined method Pest\\Expectation\:\:.+\(\)\.$#'
path: tests/*.php
excludePaths:
- ./src/Factory.php
checkMissingIterableValueType: true
Expand Down
4 changes: 4 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,8 @@
<logging>
<junit outputFile="build/report.junit.xml"/>
</logging>
<php>
<env name="DB_DATABASE" value="laravel_eloquent_spatial_test"/>
<env name="DB_USERNAME" value="root"/>
</php>
</phpunit>
23 changes: 23 additions & 0 deletions src/Doctrine/GeometryCollectionType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class GeometryCollectionType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'geometrycollection';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'geometrycollection';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/LineStringType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class LineStringType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'linestring';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'linestring';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/MultiLineStringType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class MultiLineStringType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'multilinestring';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'multilinestring';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/MultiPointType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class MultiPointType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'multipoint';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'multipoint';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/MultiPolygonType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class MultiPolygonType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'multipolygon';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'multipolygon';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/PointType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class PointType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'point';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'point';
}
}
23 changes: 23 additions & 0 deletions src/Doctrine/PolygonType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial\Doctrine;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class PolygonType extends Type
{
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
// @codeCoverageIgnoreStart
return 'polygon';
// @codeCoverageIgnoreEnd
}

public function getName(): string
{
return 'polygon';
}
}
48 changes: 48 additions & 0 deletions src/EloquentSpatialServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace MatanYadaev\EloquentSpatial;

use Illuminate\Database\Connection;
use Illuminate\Database\DatabaseServiceProvider;
use Illuminate\Support\Facades\DB;
use MatanYadaev\EloquentSpatial\Doctrine\GeometryCollectionType;
use MatanYadaev\EloquentSpatial\Doctrine\LineStringType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiLineStringType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiPointType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiPolygonType;
use MatanYadaev\EloquentSpatial\Doctrine\PointType;
use MatanYadaev\EloquentSpatial\Doctrine\PolygonType;

class EloquentSpatialServiceProvider extends DatabaseServiceProvider
{
public function boot(): void
{
/** @var Connection $connection */
$connection = DB::connection();

if ($connection->isDoctrineAvailable()) {
$this->registerDoctrineTypes($connection);
}
}

protected function registerDoctrineTypes(Connection $connection): void
{
$geometries = [
'point' => PointType::class,
'linestring' => LineStringType::class,
'multipoint' => MultiPointType::class,
'polygon' => PolygonType::class,
'multilinestring' => MultiLineStringType::class,
'multipolygon' => MultiPolygonType::class,
'geometrycollection' => GeometryCollectionType::class,
'geomcollection' => GeometryCollectionType::class,
];

foreach ($geometries as $type => $class) {
DB::registerDoctrineType($class, $type, $type);
$connection->registerDoctrineType($class, $type, $type);
}
}
}
44 changes: 44 additions & 0 deletions tests/DoctrineTypesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

use Illuminate\Support\Facades\DB;
use MatanYadaev\EloquentSpatial\Doctrine\GeometryCollectionType;
use MatanYadaev\EloquentSpatial\Doctrine\LineStringType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiLineStringType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiPointType;
use MatanYadaev\EloquentSpatial\Doctrine\MultiPolygonType;
use MatanYadaev\EloquentSpatial\Doctrine\PointType;
use MatanYadaev\EloquentSpatial\Doctrine\PolygonType;

it('uses custom Doctrine types for spatial columns', function (): void {
$doctrineSchemaManager = DB::connection()->getDoctrineSchemaManager();

$columns = $doctrineSchemaManager->listTableColumns('test_places');

expect($columns['point']->getType())
->toBeInstanceOf(PointType::class)
->getName()->toBe('point');

expect($columns['line_string']->getType())
->toBeInstanceOf(LineStringType::class)
->getName()->toBe('linestring');

expect($columns['multi_point']->getType())
->toBeInstanceOf(MultiPointType::class)
->getName()->toBe('multipoint');

expect($columns['polygon']->getType())
->toBeInstanceOf(PolygonType::class)
->getName()->toBe('polygon');

expect($columns['multi_line_string']->getType())
->toBeInstanceOf(MultiLineStringType::class)
->getName()->toBe('multilinestring');

expect($columns['multi_polygon']->getType())
->toBeInstanceOf(MultiPolygonType::class)
->getName()->toBe('multipolygon');

expect($columns['geometry_collection']->getType())
->toBeInstanceOf(GeometryCollectionType::class)
->getName()->toBe('geometrycollection');
});
20 changes: 10 additions & 10 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

namespace MatanYadaev\EloquentSpatial\Tests;

use Illuminate\Support\Facades\Config;
use Illuminate\Support\ServiceProvider;
use MatanYadaev\EloquentSpatial\EloquentSpatialServiceProvider;
use Orchestra\Testbench\TestCase as Orchestra;

class TestCase extends Orchestra
Expand All @@ -14,15 +15,14 @@ protected function setUp(): void
$this->loadMigrationsFrom(__DIR__.'/database/migrations');
}

public function getEnvironmentSetUp($app): void
/**
* @param $app
* @return class-string<ServiceProvider>[]
*/
protected function getPackageProviders($app): array
{
Config::set('database.default', 'mysql');
Config::set('database.connections.mysql', [
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => env('DB_PORT', 3306),
'database' => 'laravel_eloquent_spatial_test',
'username' => 'root',
]);
return [
EloquentSpatialServiceProvider::class,
];
}
}