Phpstan 主义数据库连接错误
Phpstan doctrine database connection error
我在一个项目中使用 doctrine(不是 symfony)。在这个项目中我也使用 phpstan,我安装了 phpstan/phpstan-doctrine
和 phpstan/extension-installer
。
我的phpstan.neon是这样的:
parameters:
level: 8
paths:
- src/
doctrine:
objectManagerLoader: tests/object-manager.php
在 tests/object-manager.php 内部,它 return 调用函数的结果,return 实体管理器。
这是创建实体管理器的代码
$database_url = $_ENV['DATABASE_URL'];
$isDevMode = $this->isDevMode();
$proxyDir = null;
$cache = null;
$useSimpleAnnotationReader = false;
$config = Setup::createAnnotationMetadataConfiguration(
[$this->getProjectDirectory() . '/src'],
$isDevMode,
$proxyDir,
$cache,
$useSimpleAnnotationReader
);
// database configuration parameters
$conn = [
'url' => $database_url,
];
// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);
当我 运行 vendor/bin/phpstan analyze
我得到这个错误:
Internal error: An exception occurred in the driver: SQLSTATE[08006] [7] could not translate host name "postgres_db" to address: nodename nor servname provided, or not known
出现这个是因为我正在使用 docker 并且我的数据库 url 是 postgres://user:password@postgres_db/database
postgres_db
是我的数据库容器的名称所以主机名在docker 容器。
当我 运行 phpstan 在容器内时,我没有错误。
那么有没有办法让运行php站在外面docker?因为我很确定当我推送我的代码时,github 工作流程会因此而失败
phpstan 需要尝试访问数据库吗?
我在 phpstan-doctrine 的 github 上开了一个问题,我有一个 answer by @jlherren 解释了:
The problem is that Doctrine needs to know what version of the DB server it is working with in order to instantiate the correct AbstractPlatform implementation, of which there are several available for the same DB vendor (e.g. PostgreSQL94Platform or PostgreSQL100Platform for postgres, and similarly for other DB drivers). To auto-detect this information, it will simply connect to the DB and query the version.
我刚刚更改了我的数据库 url 来自:
DATABASE_URL=postgres://user:password@database_ip/database
收件人:
DATABASE_URL=postgres://user:password@database_ip/database?serverVersion=14.2
我在一个项目中使用 doctrine(不是 symfony)。在这个项目中我也使用 phpstan,我安装了 phpstan/phpstan-doctrine
和 phpstan/extension-installer
。
我的phpstan.neon是这样的:
parameters:
level: 8
paths:
- src/
doctrine:
objectManagerLoader: tests/object-manager.php
在 tests/object-manager.php 内部,它 return 调用函数的结果,return 实体管理器。
这是创建实体管理器的代码
$database_url = $_ENV['DATABASE_URL'];
$isDevMode = $this->isDevMode();
$proxyDir = null;
$cache = null;
$useSimpleAnnotationReader = false;
$config = Setup::createAnnotationMetadataConfiguration(
[$this->getProjectDirectory() . '/src'],
$isDevMode,
$proxyDir,
$cache,
$useSimpleAnnotationReader
);
// database configuration parameters
$conn = [
'url' => $database_url,
];
// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);
当我 运行 vendor/bin/phpstan analyze
我得到这个错误:
Internal error: An exception occurred in the driver: SQLSTATE[08006] [7] could not translate host name "postgres_db" to address: nodename nor servname provided, or not known
出现这个是因为我正在使用 docker 并且我的数据库 url 是 postgres://user:password@postgres_db/database
postgres_db
是我的数据库容器的名称所以主机名在docker 容器。
当我 运行 phpstan 在容器内时,我没有错误。
那么有没有办法让运行php站在外面docker?因为我很确定当我推送我的代码时,github 工作流程会因此而失败
phpstan 需要尝试访问数据库吗?
我在 phpstan-doctrine 的 github 上开了一个问题,我有一个 answer by @jlherren 解释了:
The problem is that Doctrine needs to know what version of the DB server it is working with in order to instantiate the correct AbstractPlatform implementation, of which there are several available for the same DB vendor (e.g. PostgreSQL94Platform or PostgreSQL100Platform for postgres, and similarly for other DB drivers). To auto-detect this information, it will simply connect to the DB and query the version.
我刚刚更改了我的数据库 url 来自:
DATABASE_URL=postgres://user:password@database_ip/database
收件人:
DATABASE_URL=postgres://user:password@database_ip/database?serverVersion=14.2