【发布时间】:2016-12-29 15:55:44
【问题描述】:
背景:
我使用 CodeIgniter 构建了我的 Web 应用程序,因为它是唯一一个我可以轻松掌握并快速上手的框架。现在看到 symfony 令人难以置信的高级功能和 PSR 标准,我很高兴能够深入了解它。
困境
我不确定如何使用 symfony/doctrine 处理模型层。据我了解:教义为这样的数据库表生成一个实体类......
这个类包含一堆 setter/getter 函数。
目前我的心理障碍是我不明白我应该如何将功能添加到我的模型层。
要了解我的出发点,请查看我目前正在使用的典型 CodeIgniter 模型。这个处理折扣券。
<?php
/**
* This class handles all coupon codes
*/
class Coupon_Model extends CI_Model
{
/**
* gets a specific coupon
* @param string $coupon_code
* @return obj
*/
public function getCoupon($coupon_code)
{
$this->db->where('coupon_code', $coupon_code);
$query = $this->db->get('coupons');
return $query->row();
}
/**
* gets all coupons associated with a course
* @param int $course_id
* @return array
*/
public function getCourseCoupons($course_id)
{
$this->db->where('course_id', $course_id);
$query = $this->db->get('coupons');
return $query->result();
}
/**
* generates a string of 10 random alphanumeric numbers
* @return string
*/
public function generateCouponCode()
{
return strtoupper(substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 10));
}
/**
* creates a new active coupon
* @param array $data
* @param string $coupon_code
* @return bool
*/
public function createCoupon($data, $coupon_code = null)
{
if ($coupon_code !== '') {
$data['coupon_code'] = $coupon_code;
} else {
$data['coupon_code'] = $this->generateCouponCode();
}
return $this->db->insert('coupons', $data);
}
/**
* checks if a coupon is valid
* @param string $coupon_code
* @param int $course_id
* @return bool
*/
public function checkCoupon($coupon_code, $course_id = null)
{
$this->db->where('coupon_code', $coupon_code);
$query = $this->db->get('coupons');
$coupon = $query->row();
// if coupon code exists
if ($coupon === null) {
return false;
}
// if coupon is for the right course
if ($coupon->course_id !== $course_id && $course_id !== null) {
return false;
}
// if coupon code has not expired
if ($coupon->expiry_date <= $this->Time_Model->getCarbonNow()->timestamp) {
return false;
}
return true;
}
/**
* deletes a coupon record
* @param int coupon_id
* @return bool
*/
public function deleteCoupon($coupon_id)
{
$this->db->where('coupon_id', $coupon_id);
return $this->db->delete('coupons');
}
/**
* applys the coupon discount
* @param int $price
* @param float $discount (percentage)
*/
public function applyDiscount($price, $discount)
{
$price = $price - (($discount / 100) * $price);
return $price;
}
}
正如您所看到的,它非常简单,如果我想添加功能,我实际上只是创建一个新功能。
要使用这个模型,我只需像这样将它加载到控制器上:
$this->model->load('coupons/Coupon_Model');
$this->Coupon_Model->getCoupon($coupon_code);
简单,完成和尘埃落定......不幸的是,我不确定如何使用 symfony/doctrine 实现这种功能。
我是否需要创建一个与实体分开的新类并向该类添加额外的功能?还是应该给实体类增加更多的功能?
以我生成优惠券代码的简单函数为例:
/**
* generates a string of 10 random alphanumeric numbers
* @return string
*/
public function generateCouponCode()
{
return strtoupper(substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 10));
}
放置此功能的最佳位置是哪里?在 AppBundle/models/coupons 下?
我显然已经从 CodeIgniter 中养成了坏习惯,并且感觉我正在以错误的方式处理这个问题。
【问题讨论】:
-
我相信您正在寻找的是一个存储库:它们将允许您定义自定义查询。见symfony.com/doc/current/doctrine/repository.html
-
同意 Solarbear。存储库是您的问题的关键字。
-
CodeIgniter > Symfony...
-
我不知道怎么...这是 codeigniters 多语言实现的限制,这迫使我转向 Symfony。
标签: php codeigniter doctrine-orm symfony