首页 文章

Slim 3控制器未连接到db容器

提问于
浏览
1

我是一个新的苗条框架,并使用路由的匿名功能来访问给定路由及其工作的数据库数据,但如果我尝试在控制器中传递它们我得到错误波纹管

超薄应用程序错误由于以下错误,应用程序无法运行:详细信息类型:错误消息:调用未定义的方法Slim \ Container :: prepare()文件:C:\ xampp \ htdocs \ drivingapp \ app \ src \ Controllers \ apiController.php行:22跟踪#0 [内部函数]:App \ Controllers \ apiController-> igice(对象(Slim \ Http \ Request),对象(Slim \ Http \ Response),数组)#1 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ Handlers \ Strategies \ RequestResponse.php(41):call_user_func(Array,Object(Slim \ Http \ Request),Object(Slim \ Http \ Response),Array)#2 C :\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ Route.php(344):Slim \ Handlers \ Strategies \ RequestResponse - > __ invoke(Array,Object(Slim \ Http \ Request),Object(Slim \ Http) \ Response),数组)#3 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ MiddlewareAwareTrait.php(116):Slim \ Route - > __ invoke(Object(Slim \ Http \ Request),Object( Slim \ Http \ Response))#4 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ Route.php(316):Slim \ Route-> callMiddlewareSt ack(Object(Slim \ Http \ Request),Object(Slim \ Http \ Response))#5 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ App.php(438):Slim \ Route- > run(Object(Slim \ Http \ Request),Object(Slim \ Http \ Response))#6 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ MiddlewareAwareTrait.php(116):Slim \ App - > __ invoke(Object(Slim \ Http \ Request),Object(Slim \ Http \ Response))#7 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ App.php(332):Slim \ App-> callMiddlewareStack(Object(Slim \ Http \ Request),Object(Slim \ Http \ Response))#8 C:\ xampp \ htdocs \ drivingapp \ vendor \ slim \ slim \ Slim \ App.php(293):Slim \ App-> process(Object(Slim \ Http \ Request),Object(Slim \ Http \ Response))#9 C:\ xampp \ htdocs \ drivingapp \ public \ index.php(30):Slim \ App-> run ()#10

下面是我的apiController.php:

<?php

namespace App\Controllers;

use Slim\Views\Twig;
use Psr\Log\LoggerInterface;
use Slim\Http\Request;
use Slim\Http\Response;


class apiController{

 private $db;

 public function __construct($db){
    $this->db = $db;

 }  

 public function igice($request, $response){

        $stmt = $this->db->prepare("SELECT * FROM igice ORDER BY igiceid");
        $stmt->execute();
        $dowork = $stmt->fetchAll();
        return $this->response->withJson($dowork);
}
}

吼一声,这是我的我的dependdencie.php

$container['db'] = function ($c) {
    $settings = $c->get('settings')['db'];
    $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'],
        $settings['user'], $settings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};


// -----------------------------------------------------------------------------
// Registering Controllers
// -----------------------------------------------------------------------------

$container[App\Action\HomeAction::class] = function ($c) {
    return new App\Action\HomeAction($c->get('view'), $c->get('logger'));
};

$container['apiController']=function($c){
    return new App\Controllers\apiController($c->get('db'));
};

在我的routes.php下面:

$app->get('/ibice','App\Controllers\apiController:igice');

2 回答

  • 0

    修改apiController.php

    <?php
    namespace App\apiController;
    
    use Slim\Views\Twig;
    use Psr\Log\LoggerInterface;
    use Slim\Http\Request;
    use Slim\Http\Response;
    use PDO;
    
    final class apiController{
    private $db;
    public function __construct($host, $dbname, $user, $password){
           try {
    
         $this->db = new PDO("mysql:host=" . $host . ";dbname=" . $dbname, $user, $password);
         $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
       }
    catch(PDOException $e)
            {
            echo $e->getMessage();
           }
    }
    public function getDb() {
    if ($this->db instanceof PDO) {
            return $this->db;
    }
    }
    }
    

    那么你应该为每条路线编写函数,我给你举个例子

    <?php
    namespace App\apiController;
    
    use Slim\Views\Twig;
    use Psr\Log\LoggerInterface;
    use Slim\Http\Request;
    use Slim\Http\Response;
    
    final class Hello
    {
        private $view;
        private $conn;
    
        public function __construct(Twig $view, $db)
        {
            $this->view = $view;
            $this->conn = $db->getDb();
        }
    
    public function __invoke(Request $request, Response $response, $args)
    {
        $this->logger->info("action dispatched");
    
    $stmt = $this->conn->prepare("SELECT * FROM igice ORDER BY igiceid");
    $stmt->execute();
    $dowork = $stmt->fetchAll();
    return $response->withJson($dowork,201);
    
    }
    }
    

    修改dependencies.php

    $container['apiController']=function($c){
        return new App\Controllers\apiController::class($c->get('db'));
    };
    
  • 1

    最好将容器添加到apiController构造函数中,以便轻松访问包括db在内的所有容器对象,这样您就可以像这样轻松地更改代码:

    只需将__get magic方法添加到控制器中,您就可以使用$ this-> dependency name;轻松访问控制器中的所有容器对象;)

    <?php
    
    namespace App\Controllers;
    
    use Slim\Views\Twig;
    use Psr\Log\LoggerInterface;
    use Slim\Http\Request;
    use Slim\Http\Response;
    
    
    class apiController{
    
     protected $container;
    
     public function __construct($container){
          $this->container = $container;
     }  
    
     public function __get($property)
     {
        if ($this->container->{$property}) {
            return $this->container->{$property};
        }
     }
    
     public function igice($request, $response){
    
        $stmt = $this->db->prepare("SELECT * FROM igice ORDER BY igiceid");
        $stmt->execute();
        $dowork = $stmt->fetchAll();
        return $this->response->withJson($dowork);
     }
    }
    

    在您的依赖项中:

    $container['apiController']=function($c){
        return new App\Controllers\apiController($c);
    };
    

    并为路线:

    $app->get('/ibice','App\Controllers\apiController:igice');
    

    和你的一样

相关问题