如何在SLIM框架中定义PDO,以便PhpStorm不会抛出'在类中找不到的方法'警告?

时间:2017-05-06 15:13:36

标签: php pdo phpstorm slim

所以我使用这个将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不再向我发出不需要的事情的警告。

2 个答案:

答案 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表示您指的是根命名空间中的类。