之前一直搞Java开发,十几年了。所用框架Java开发者都比较熟悉,就是经典的Spring+struts2+Hibernate,也习惯了MVC这种模式下的开发。这两年,公司转型做互联网开发,就改用php了。php下的框架也是多如牛毛,都说好,但我只想找一个和SSH思路差不多的框架,对各种框架也进行过比较,最终选择了Symfony2。
下面就来进行一个比较。
1.M
SSH中,使用 Hibernate来做模型,通常的做法是创建POJO对象,通过Annotation进行标记(描述实体类与数据表的关系,字段的类型,类与类之间的关系:一对多,一对一,多对多)等。Symfony2呢,使用Doctrine2这个框架,上代码,javaer很容易看明白:
Address.class类
<?php namespace WxBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="wx_address") * @ORM\Entity(repositoryClass="WxBundle\Repository\AddressRepository") */ class Address { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; // 会员 /** * @ORM\ManyToOne(targetEntity="Member") */ private $member; //是否默认 /** * @ORM\Column(type="integer") */ protected $defo; //收货人 /** * @ORM\Column(type="string") */ protected $name; //手机 /** * @ORM\Column(type="string") */ protected $mobile; //电话 /** * @ORM\Column(type="string",nullable=true) */ protected $phone; //配送区域 /** * @ORM\Column(type="string",nullable=true) */ protected $area; //详细地址 /** * @ORM\Column(type="string") */ protected $address; /** * @ORM\Column(type="datetime") */ protected $created; public function __construct() { $this->created = new \DateTime(); $this->defo = 0; } }
Member.class 会员类
<?php // wf namespace WxBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="wx_member") * @ORM\Entity(repositoryClass="WxBundle\Repository\MemberRepository") */ class Member { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100,nullable=true) */ protected $name; // 微信号 /** * @ORM\Column(type="string", length=100,nullable=true) */ protected $openid; protected $verifyCode; /** * @ORM\Column(type="string", length=100) */ protected $mobile; //推荐者手机 /** * @ORM\Column(type="string", length=100,nullable=true) */ protected $recommenderMobile; //微信头像 /** * @ORM\Column(type="string", length=250,nullable=true) */ protected $headimgurl; //微信呢称 /** * @ORM\Column(type="string", length=100,nullable=true) */ protected $nickname; /** * @ORM\Column(type="string",nullable=true) */ protected $memo; /** * @ORM\Column(type="string",nullable=true) */ protected $password; /** * @ORM\Column(type="string",nullable=true) */ protected $mail; /** * @ORM\Column(type="string",nullable=true) */ protected $idNumber; // 消费金额 /** * @ORM\Column(type="float",nullable=true) */ protected $amount; // 积分 /** * @ORM\Column(type="float",nullable=true) */ protected $credit; // 米粒 /** * @ORM\Column(type="float",nullable=true) */ protected $coin; // autoLogin /** * @ORM\Column(type="integer",nullable=true) */ protected $autoLogin; // 所属等级 /** * @ORM\ManyToOne(targetEntity="MemberLevel") */ private $level; /** * @ORM\Column(type="datetime") */ protected $created; public function __construct() { $this->created=new \DateTime(); $this->credit = 0; $this->coin = 0; $this->amount = 0; } }
一个会员可能有多个地址,地址和会员是多对一的关系。熟悉Hibernate的朋友,是不是找到了hibernate的感觉。
repositoryClass="WxBundle\Repository\MemberRepository
这个是什么呢,symfony2会在相应的命名空间(相当于Java中的包)中生成这样一个类。默认具有find,findOne,findAll方法,基本的增删查改就不用再写代码了。这个类似于Hibernate中的Session,或者经spring封装后的HibernateTemplate。
我们来看复杂一点的查询:
//根据电话号码模糊查询会员
public function getMembersByMobile($mobile) { $em = $this->getEntityManager(); return $em->createQuery("select p from WxBundle:Member p where p.mobile like '%$mobile%'")->getResult(); }
//查询指定会员的默认地址,涉及到了对象之间的关系,这个写法没有hibernate中简洁,但比直接写SQL,还是简洁多了
public function getDefo($memberId) { $em = $this->getEntityManager(); $addresses = $em->createQuery("select p from WxBundle:Address p left join p.member m where m.id=$memberId and p.defo=1")->getResult(); if ($addresses) return $addresses[0]; return null; }
//保存地址
public function save($address) { $em = $this->getEntityManager(); $em->persist($address); $em->flush(); return true; }
这就是symfony2中的模型,是不是和Hibernate很象.....
未完待续,明天继续讲V,如果你喜欢,请留言鼓励,你的点赞,是我坚持下去的动力。