
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Yii рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рддреЗрдЬ, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд▓рдЪреАрд▓рд╛ рд╣реИред рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ ActiveRecord рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ, рдФрд░, рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЛрдореЗрди рддрд░реНрдХ, рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, DataMapper рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЙрд╕реА рд╕рдордп, рдореБрдЭреЗ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдУрдЖрд░рдПрдо рдкрд╕рдВрдж рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде PHP рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА ORM рд╣реИред рд╣рд╛рдВ, рд╢рд╛рдпрдж рдпрд╣ "рднрд╛рд░реА" рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдирд╛, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐
"рд╕рдордп рд╕реЗ
рдкрд╣рд▓реЗ рдЕрдиреБрдХреВрд▓рди рд╕рднреА рдмреАрдорд╛рд░рд┐рдпреЛрдВ рдХреА рдЬрдбрд╝ рд╣реИ"рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рджрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрди рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ 2 рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
Doctrine рдФрд░ Yii рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП DoctrineComponent рдШрдЯрдХ рдмрдирд╛рдХрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ Doctrine рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдХреНрд░реЗрддрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдУрдЖрд░рдПрдо рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
GitHub Doctrine рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб / рдХреНрд▓реЛрди рдХрд░рдХреЗ рдЖрдк рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
редрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдУрдЖрд░рдПрдо рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
рдбреЙрдХреНрдЯреНрд░рд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдмреНрд╕реНрдЯреНрд░реЗрдХреНрд╢рди рд▓реЗрдпрд░ рдФрд░
рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЙрдорди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЬрдм рдХрдореНрдкреЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдУрдЖрд░рдПрдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпреЗ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреАрдВрдЪ рд▓реА рдЬрд╛рддреА рд╣реИрдВ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдУрдЖрд░рдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд┐рдореНрдлрдиреА рдШрдЯрдХ рдХреЗ рд╡рд┐рдХреНрд░реЗрддрд╛ 2 рдлрд╝реЛрд▓реНрдбрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ - рдпреЗ
рдХрдВрд╕реЛрд▓ (
рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░
рдпрдорд▓ (рдпрджрд┐ рдЖрдк рдпрдорд▓ рдкрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:

DoctrineComponent рдШрдЯрдХ рдмрдирд╛рдирд╛
рдЕрдм рдЖрдк DoctrineComponent рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдореИрдВ рд╕рдВрдкреВрд░реНрдг рдШрдЯрдХ рдХреЛрдб рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИред рдпрд╣ рдХреЛрдб DoctrineComponent.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд / рдШрдЯрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
DoctrineComponent.php рдлрд╝рд╛рдЗрд▓ рдХреЛрдбuse Doctrine\ORM\EntityManager; use Doctrine\ORM\Configuration; use Doctrine\ORM\Mapping\Driver\AnnotationDriver; use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\AnnotationRegistry; class DoctrineComponent extends CComponent { private $em = null; private $basePath; private $proxyPath; private $entityPath; private $driver; private $user; private $password; private $host; private $dbname; public function init() { $this->initDoctrine(); } public function initDoctrine() { Yii::setPathOfAlias('Doctrine', $this->getBasePath() . '/vendor/Doctrine'); $cache = new Doctrine\Common\Cache\FilesystemCache($this->getBasePath() . '/cache'); $config = new Configuration(); $config->setMetadataCacheImpl($cache); $driverImpl = new AnnotationDriver(new AnnotationReader(), $this->getEntityPath()); AnnotationRegistry::registerAutoloadNamespace('Doctrine\ORM\Mapping', $this->getBasePath() . '/vendor'); $config->setMetadataDriverImpl($driverImpl); $config->setQueryCacheImpl($cache); $config->setProxyDir($this->getProxyPath()); $config->setProxyNamespace('Proxies'); $config->setAutoGenerateProxyClasses(true); $connectionOptions = array( 'driver' => $this->getDriver(), 'user' => $this->getUser(), 'password' => $this->getPassword(), 'host' => $this->getHost(), 'dbname' => $this->getDbname() ); $this->em = EntityManager::create($connectionOptions, $config); } public function setBasePath($basePath) { $this->basePath = $basePath; } public function getBasePath() { return $this->basePath; } public function setEntityPath($entityPath) { $this->entityPath = $entityPath; } public function getEntityPath() { return $this->entityPath; } public function setProxyPath($proxyPath) { $this->proxyPath = $proxyPath; } public function getProxyPath() { return $this->proxyPath; } public function setDbname($dbname) { $this->dbname = $dbname; } public function getDbname() { return $this->dbname; } public function setDriver($driver) { $this->driver = $driver; } public function getDriver() { return $this->driver; } public function setHost($host) { $this->host = $host; } public function getHost() { return $this->host; } public function setPassword($password) { $this->password = $password; } public function getPassword() { return $this->password; } public function setUser($user) { $this->user = $user; } public function getUser() { return $this->user; } public function getEntityManager() { return $this->em; } }
рдШрдЯрдХ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ
initDoctrine
рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдЖрдЗрдП рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред
$cache = new Doctrine\Common\Cache\FilesystemCache($this->getBasePath() . '/cache'); $config = new Configuration(); $config->setMetadataCacheImpl($cache);
рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╣рдо Doctrine рд╕реЗ рдЗрдХрд╛рдИ рдЗрдХрд╛рдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
FilesystemCache
) рдХреЛ рдШрдЯрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╣рдо рдШрдЯрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
$driverImpl = new AnnotationDriver(new AnnotationReader(), $this->getEntityPath()); AnnotationRegistry::registerAutoloadNamespace('Doctrine\ORM\Mapping', $this->getBasePath() . '/vendor'); $config->setMetadataDriverImpl($driverImpl);
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдЪрд╛рд▓рдХ рдЗрдХрд╛рдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
$config->setQueryCacheImpl($cache); $config->setProxyDir($this->getProxyPath()); $config->setProxyNamespace('Proxies'); $config->setAutoGenerateProxyClasses(true);
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ (рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐) рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ Doctrine (рдкрде, рдирд╛рдо рд╕реНрдерд╛рди, рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА) рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ
$connectionOptions = array( 'driver' => $this->getDriver(), 'user' => $this->getUser(), 'password' => $this->getPassword(), 'host' => $this->getHost(), 'dbname' => $this->getDbname() ); $this->em = EntityManager::create($connectionOptions, $config);
рдКрдкрд░ рдХреЛрдб рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдШрдЯрдХ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдШрдЯрдХ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП)ред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ EntityManager рдкрд╣рд▓реЗ
$connectionOptions
рдФрд░
$config
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╣рдорд╛рд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
DoctrineComponent рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ?
рдЖрдЗрдП,
DoctrineComponent
рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ рдмрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдореБрдЦреНрдп рд╣реИред рдкреАрдПрдЪрдкреА)
return array( 'components' => array( 'doctrine'=>array( 'class' => 'DoctrineComponent', 'basePath' => __DIR__ . '/../', 'proxyPath' => __DIR__ . '/../proxies', 'entityPath' => array( __DIR__ . '/../entities' ), 'driver' => 'pdo_mysql', 'user' => 'dbuser', 'password' => 'dbpassword', 'host' => 'localhost', 'dbname' => 'somedb' ),
рдЕрдм рд╣рдорд╛рд░рд╛ рдШрдЯрдХ
Yii::app()->doctrine
рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдФрд░ рд╣рдо
Yii::app()->doctrine->getEntityManager()
рдорд╛рдзреНрдпрдо рд╕реЗ
EntityManager
рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдШрдЯрдХ рдХреЗ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде,
EntityManager
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд╕рдВрдХреЗрдд рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
lass MainController extends Controller { private $entityManager = null; public function getEntityManager() { if(is_null($this->entityManager)){ $this->entityManager = Yii::app()->doctrine->getEntityManager(); } return $this->entityManager; }
рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдЕрдм
MainController
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ
MainController
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдЖрдк рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
$this->getEntityManager()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
EntityManager
рд▓рд┐рдП
$this->getEntityManager()
рдЕрдм IDE рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рдкреНрд▓рд╕ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХрдВрд╕реЛрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд / рдХрдорд╛рдВрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд╛рд▓ рджреАред рдХрдВрд╕реЛрд▓ рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
doctrine
рдЖрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
Doctrine рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг
doctrine.php
рдлрд╝рд╛рдЗрд▓ред
Doctrine.php рдлрд╝рд╛рдЗрд▓ рдХреЛрдб рдбреЙрдХреНрдЯреНрд░рд┐рди рдХрдВрд╕реЛрд▓ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрдорд╛рдВрдб рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░
php doctrine.php
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
GridView рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рдореЙрдбрд▓ рд╕рддреНрдпрд╛рдкрди рдФрд░ рдЙрдкрдпреЛрдЧред
рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдУрдЖрд░рдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреА рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдХреЛрдИ рдореЙрдбрд▓ рдирд╣реАрдВ рд╣реИрдВ (рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд╕рдХреНрд╖рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдЗрддреНрдпрд╛рджрд┐), рдФрд░ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ -
Entity
рдФрд░
Repository
ред
Entity
рдЖрдорддреМрд░ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░
Repository
, рдбреАрдмреАрдПрдПрд▓ рдбреЙрдХреНрдЯреНрд░рд┐рди (рдпрд╛ рддреЛ рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдпрд╛ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗред
рдореЙрдбрд▓ рдорд╛рдиреНрдпрддрд╛
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред
User
рдЗрдХрд╛рдИ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐
CModel.
рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
CModel.
рд╡рд░реНрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдореЙрдбрд▓ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛
CModel.
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реАрдПрдордУрдбреЗрд▓ рд╡рд░реНрдЧ рд╕реЗ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдХрд╛рдИ рдХрд╛ рд╡рд╛рд░рд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЗрдХрд╛рдИ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ:
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдХрд╛рдИ рдХреЛрдб use Doctrine\ORM\Mapping as ORM; class User extends CModel { private $id; private $name; private $password; private $email; private $role; private $created; private $modified; public function rules(){ return array( array('name, password', 'required'),
рдЕрдм рдореИрдВ рдЗрд╕ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ (рдиреАрдЪреЗ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг)
public function actionCreate() { $user = new User(); $userData = $this->getRequest()->get('User'); $course->setAttributes($userData); if(!is_null($userData) && $user->validate()) { $user->setName($userData['name']);
рдПрдХ рдЧреНрд░рд┐рдб рд╡реНрдпреВ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
Yii рдХреЗ рдореБрдЦреНрдп рдЖрдХрд░реНрд╖рдг рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд┐рдЧреЗрдЯреНрд╕, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд┐рдб, рдЬреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ Yii рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдПрдХрдорд╛рддреНрд░ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ
ActiveRecord
рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ
GridView
рд╡рд┐рдЬреЗрдЯ)ред рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдбреЙрдХреНрдЯреНрд░рд┐рди рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП
Repository
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
GridView
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
GridView
2 рдЕрдбрд╝рдЪрдиреЗрдВ рд╣реЛрддреА рд╣реИрдВ -
dataProvider
рдФрд░
filter
рдЧреБрдгред рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ Yii рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП odes рдЧрд╛рддрд╛ рд╣реВрдВ -
GridView
ActiveRecord
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ
GridView
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐
dataProvider
рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ
IDataProvider
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣рдорд╛рд░реЗ
UserRepository
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) ), рдФрд░
filter
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╡рд╕реНрддреБ
CModel
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реА
User
рдЗрдХрд╛рдИ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╣рд╛рди рд╣реИ)ред
рдореИрдВ
UserRepository
рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реВрдБрдЧрд╛ред
BaseRepository рд╡рд░реНрдЧ рдХреЛрдб use Doctrine\ORM\EntityRepository; abstract class BaseRepository extends EntityRepository implements IDataProvider { protected $_id; private $_data; private $_keys; private $_totalItemCount; private $_sort; private $_pagination; public $modelClass; public $model; public $keyAttribute; private $_criteria; private $_countCriteria; public $data; abstract protected function fetchData(); abstract protected function calculateTotalItemCount(); public function getId(){
рдКрдкрд░ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рднрдВрдбрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ Yii рд╡рд░реНрдЧ
CActiveDataProvider
рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ
IDataProvider
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
UserRepository
рд╣рдореЗрдВ рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдиреАрдЪреЗ):
<?php class UserRepository extends BaseRepository { protected $_id = 'UserRepository'; protected function fetchData() {
рд╕рд╛рд░рд╛рдВрд╢
рдКрдкрд░, рдореИрдВрдиреЗ Yii + Doctrine 2 ORM рдмрдВрдбрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджрд┐рдпрд╛ред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Doctrine 2 ORM Yii рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдХрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓рд┐рдП рдХрд┐ Doctrine рдХреЗ рдкрд╛рд╕ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдФрд░ рдкреНрд▓реЙрдпрд░ рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдХреЛрдИ рднреА рдзреАрдореЗ рдпрд╛ рдЧрд╣рди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдРрд╕реЗ рдмрдВрдбрд▓ рдореЗрдВ рд╣рдо рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЬреАрддрддреЗ рд╣реИрдВ рдФрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЛрдб рдЗрд╕ рд╕реЗ рд╕рд╛рдл рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдпрджрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдиреЗ Yii рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╖рдп-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, Yii рдореЗрдВ ActiveRecord рдореЙрдбрд▓ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреА рд╡реГрджреНрдзрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛рдореИрдкрд░ рдкреИрдЯрд░реНрди, рд╡рд╛рдИрд╡рд╛рдИрдЖрдИ рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдУрдЖрд░рдПрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред