Jump to content
php.lv forumi

mvc datubāzes konekcija


abc

Recommended Posts

Mēģinu izveidot kaut ko līdzīgu primitīvam mvc frameworkam, bet saskāros ar problēmu.

 

abstract class Model{
protected $db;

public function __construct(){
   	// izveidojam datubāzes konekciju
   	$this->db = new Database(array(
       	'host' => 'localhost',
       	'user' => 'test',
       	'pass' => 'pass',
       	'name' => 'test',
   	));

   	echo "connecting to db\n";
}
}
class News_Model extends Model{
public function getNewsList(){

}
}
class Page_Model extends Model{
public function getPageList(){

}
}
new News_Model();
new Page_Model();

 

Pēc šī koda izpildes sanāk, ka tiek taisītas divas konekcijas datubāzei, jo Model klases konsrtuktors tiek izpildīts divas reizes. Ja ir vajadzība piekļūt tikai vienam modelim, tad viss ir kārtībā, bet ar vairākiem modeļiem sākās problēmas.

 

Varētu katram modelim padot atsevišķi to datubāzes objektu, bet varbūt ir citi varianti?

Link to comment
Share on other sites

Vienkāršākais variants - uztaisi, ka datobāzes instanci iegūsti no Db klases singletona, savukārt klases lādē ar autoload.

Tad model klasēs varēsi izmantot:

DB::instance()->query(...);

un nebūs ne problēmas ar inicializāciju, ne piekļuvi instancei.

Link to comment
Share on other sites

Cita starpā es attiecīgās metodes tavā piemērā sauktu getList():

 

class News_Model extends Model{
   public function getList(){
   }
}
class Page_Model extends Model{
   public function getList(){
   }
}

Tad pēc tam nebūtu jādomā par to, kāds nu kurai metodei nosaukums, jo objekta nosaukums jau ir klases nosaukumā - News/Page:

 

$pages = new Pages_Model();
var_dump($pages -> getList());

Link to comment
Share on other sites

Pietam, kāpēc metodes ir camelCase, bet klašu nosaukumi - under_score? Būtu labi pieturēties pie viena standarta un arī tad to izmantot. :)

 

**Labojums:**

 

Arī **codez** minētais singlton patterns nav tas labākais veids. Varbūt apskati kā darbojas dependency-injection.

Te pat ir piemērs! http://stackoverflow.com/questions/7975174/php-multiple-different-databases-dependency-injected-class

Link to comment
Share on other sites

daGrevis, dependancy injection, ne veic tās darbības, kuras veic singletona paterns, ne aizstāj to. Tie ir divi dažādi paterni, kas veic dažādas funkcijas un var tikt izmantoti kā atsevišķi, tā kopā. Bet šijā gadījumā sigletona paterna izmantošana pret dependancy-injection ar tavu norādīto piemēru ir labāka, jo:

 

1) var izmantot lazy loading un lazy inicialization, kas nozīmē, ka DB klase tik ielādēta tikai un vienīgi, ja tā tiks izmantota un tāpat arī iniciazlizēta tā tiks tikai un vienīgi tad, ja tā tiks izmantota. Kamēr tavā piedāvātajā variantā vai inicializācija pašam ir manuāli katriez jāveic, vai arī tā notiek arī tad, kad tā nav vajadzīga.

2) Nav jāraksta lieks abstrakcijas slānis kā depenendancy-injection, jo 99% gadījumu visi izmanto viena veida datubāzi, kas lielākoties ir mysql.

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...