From b54f608508b4bb9b045b4b92bb21d10751e03e35 Mon Sep 17 00:00:00 2001 From: therselman Date: Wed, 23 Aug 2017 20:31:11 +0200 Subject: [PATCH] --- src/ORM/ActiveRecord.php | 131 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/ORM/ActiveRecord.php diff --git a/src/ORM/ActiveRecord.php b/src/ORM/ActiveRecord.php new file mode 100644 index 0000000..66720df --- /dev/null +++ b/src/ORM/ActiveRecord.php @@ -0,0 +1,131 @@ + + */ +class ActiveRecord +{ + /** + * The database connection used by the EntityManager. + * + * @var \Doctrine\DBAL\Connection + */ + protected $em = null; + + + public function __construct(Container $c) + { + $this->conn = $c->db; + } + + + /** + * {@inheritDoc} + */ + public function getConnection() + { + return $this->conn; + } + + + /** + * {@inheritDoc} + */ + public function getRepository($entityName) + { + static $repos = null; + if ( ! isset($repos[$entityName])) { + $repoName = $entityName . 'Repository'; +echo 'loading: ' . $repoName; + $repos[$entityName] = new $repoName($this); + } + return $repos[$entityName]; + } + + + /** + * {@inheritDoc} + */ + public function beginTransaction() + { + $this->conn->beginTransaction(); + } + + + /** + * {@inheritDoc} + */ + public function transaction($func) // AKA `transactional` in Doctrine + { + if (!is_callable($func)) { + throw new \InvalidArgumentException('Expected argument of type "callable", got "' . gettype($func) . '"'); + } + $this->conn->beginTransaction(); + try { + $return = call_user_func($func, $this); + $this->flush(); + $this->conn->commit(); + return $return ?: true; + } catch (Exception $e) { + $this->close(); + $this->conn->rollBack(); + throw $e; + } + } + + + /** + * {@inheritDoc} + */ + public function commit() + { + $this->conn->commit(); + } + + + /** + * {@inheritDoc} + */ + public function rollback() + { + $this->conn->rollBack(); + } + + + /** + * Adds support for magic method calls. + * + * @param string $method + * @param array $args + * + * @return mixed The returned value from the resolved method. + * + * @throws ORMException + * @throws \BadMethodCallException If the method called is invalid + */ + public function __call($method, $args) + { + if (0 === strpos($method, 'findBy')) { + return $this->resolveMagicCall('findBy', substr($method, 6), $args); + } + if (0 === strpos($method, 'findOneBy')) { + return $this->resolveMagicCall('findOneBy', substr($method, 9), $args); + } + if (0 === strpos($method, 'countBy')) { + return $this->resolveMagicCall('count', substr($method, 7), $args); + } + throw new \BadMethodCallException( + "Undefined method '$method'. The method name must start with ". + "either findBy, findOneBy or countBy!" + ); + } + +}