slim:プロジェクト応用(二)データベース

19026 ワード

プロジェクト応用(二)データベース
データベースはdoctrine ormを使用し、doctrineの依存には後で使用するsymfony/consoleコンポーネントが含まれています.
  • doctrine orm
  • をインストール
    composer require doctrine/orm
    
  • 新規cli構成
  • # config/cli-config.php
    
    
    use Doctrine\ORM\EntityManager;
    use Doctrine\ORM\Tools\Console\ConsoleRunner;
    use Slim\Container;
    
    /** @var Container $container */
    $container = require_once APP_ROOT . '/src/bootstrap.php';
    
    ConsoleRunner::run(
        ConsoleRunner::createHelperSet($container[EntityManager::class])
    );
    
    
  • 新規bootstrap
  • # src/bootstrap.php
    
    
    use Doctrine\Common\Annotations\AnnotationReader;
    use Doctrine\Common\Cache\FilesystemCache;
    use Doctrine\ORM\EntityManager;
    use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
    use Doctrine\ORM\Tools\Setup;
    use Slim\Container;
    
    require_once APP_ROOT . '/vendor/autoload.php';
    
    (new \Symfony\Component\Dotenv\Dotenv(false))->loadEnv(APP_ROOT . "/.env.local");
    
    $env = $_ENV['APP_ENV']??'local';
    
    $container = new Container(require APP_ROOT . "/config/config.$env.php");
    
    $container[EntityManager::class] = function (Container $container): EntityManager {
        $config = Setup::createAnnotationMetadataConfiguration(
            $container['settings']['doctrine']['metadata_dirs'],
            $container['settings']['doctrine']['dev_mode']
        );
    
        $config->setMetadataDriverImpl(
            new AnnotationDriver(
                new AnnotationReader,
                $container['settings']['doctrine']['metadata_dirs']
            )
        );
    
        $config->setMetadataCacheImpl(
            new FilesystemCache(
                $container['settings']['doctrine']['cache_dir']
            )
        );
    
        return EntityManager::create(
            $container['settings']['doctrine']['connection'],
            $config
        );
    };
    
    return $container;
    
  • 新規実行可能ファイル
  • # bin/doctrine
    
    
    define('APP_ROOT', dirname(__DIR__));
    
    @include APP_ROOT . "/vendor/bin/doctrine";
    
  • 新規entity
  • #         
    # src/Entity/Data.php
    #         ,  vendor/doctrine/annotations,  :https://github.com/doctrine/annotations
    
    /**
     * Created by PhpStorm.
     * Authon: akio 
     * Date: 7/31/19
     * Time: 11:26
     */
    
    namespace App\Entity;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Annotations\Annotation;
    
    /**
     * @author akio 
     * Class Data
     * @package App\Entity
     * CREATE TABLE `data` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `data` varchar(255) DEFAULT '',
        `age` tinyint(3) unsigned DEFAULT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;
     * @ORM\Entity()
     * @ORM\Table(name="data")
     */
    
    class Data
    {
    
        /**
         * @author akio 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         * @var int
         */
        protected $id;
    
        /**
         * @author akio 
         * @ORM\Column(type="string")
         * @var string
         */
        protected $data;
    
        /**
         * @author akio 
         * @ORM\Column(type="integer")
         * @var int
         */
        protected $age;
    
        /**
         * @author akio 
         * @return int
         */
        public function getId(): int
        {
            return $this->id;
        }
    
        /**
         * @author akio 
         * @return string
         */
        public function getData(): string
        {
            return $this->data;
        }
    
        /**
         * @author akio 
         * @param string $data
         */
        public function setData(string $data): void
        {
            $this->data = $data;
        }
    
        /**
         * @author akio 
         * @return int
         */
        public function getAge(): int
        {
            return $this->age;
        }
    
        /**
         * @author akio 
         * @param int $age
         */
        public function setAge(int $age): void
        {
            $this->age = $age;
        }
    
    }
    
  • を使用
    参考src/controller/TestDoctrine.php
    まずdoctrine ormの使用チュートリアルを理解することをお勧めします
  • PS
  •      'SQLSTATE[HY000] [2002] No such file or directory'   ,    php.ini   'pdo_mysql.default_socket'   
    

    code