所以我使用这个将PDO粘贴到我的SLIM中:
$container['dbh'] = function($container) {
$config = $container->get('settings')['pdo'];
$dsn = "{$config['engine']}:host={$config['host']};dbname={$config['database']};charset={$config['charset']}";
$username = $config['username'];
$password = $config['password'];
return new PDO($dsn, $username, $password, $config['options']);
};
但是,每次我使用$this->dbh->execute()
(或其他一些PDO方法)时,PhpStorm都会警告我method 'execute' not found in class
实际上它并没有什么不同,但我希望我的PhpStorm不再向我发出不需要的事情的警告。
答案 0 :(得分:1)
这主要是回答@ rickdenhaan的评论。
我注意到您正在使用$this
,这意味着您在某个地方有一个班级。
您可以在类中输入提示动态/虚假属性:
/**
* @property PDO $dbh
*/
class MyApp {
}
如需更多帮助,请阅读PHPDoc文档,例如here。
在某些情况下,您可能无法影响正在实例化的原始类。在这种情况下,您可以拥有存根文件;基本上只用于类型提示的类:
// Let's assume you cannot modify this class.
class App {}
// This is the stub class, we declare it as abstract to avoid instantiation by mistake.
// We make it extend `App` to get metadata from there.
abstract class AppStub extends App {
/** @var PDO */
public $dbh;
}
// ...later on in your code..
/** @var AppStub $this */
// tada!
$this->dbh->execute();
控制器类方法
您的主应用+路由:
$app = new \Slim\App();
$app->get('/', \YourController::class . ':home');
$app->get('/contact', \YourController::class . ':contact');
你的控制器:
class YourController
{
protected $container;
// constructor receives container instance
public function __construct(ContainerInterface $container) {
$this->container = $container;
}
public function home($request, $response, $args) {
$this->getDb()->execute(); // no IDE errors anymore!
return $response;
}
public function contact($request, $response, $args) {
return $response;
}
/**
* @return PDO
*/
protected function getDb()
{
return $this->container->get('dbh');
}
}
答案 1 :(得分:1)
如果您的类位于命名空间中,则应使用\PDO
表示您指的是根命名空间中的类。