фона:CodeIgniter Модели против Symfony/Doctrine Модели
У меня есть построить мой веб-приложения с помощью CodeIgniter, потому что она была единственной основой я мог понять достаточно легко, чтобы идти быстро. Теперь, увидев невероятно расширенную функциональность Symfony и стандарты PSR, я разобрался, чтобы разобраться во всем этом.
Dialemma
Я не уверен, как подходить к модели слоя с симфони/доктриной. Как я понимаю: доктрина создает класс сущностей для таблицы базы данных, как так ...
Этот класс содержит кучу функций сеттер/добытчика.
В настоящий момент мой ментальный блок состоит в том, что я не понимаю, как я должен добавить функциональность к моему модельному слою.
Чтобы понять, откуда я родом, взгляните на типичную модель 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);
Простой, сделано и посыпанный ... к сожалению, я не знаю, как реализовать такую функциональность с симфони/доктриной ,
Должен ли я создать новый класс отдельно от объекта и добавить дополнительные функции к этому классу? Или я должен добавить дополнительные функции в класс сущностей?
Возьмем, например, мою простую функцию, которая генерирует код купона:
/**
* 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 и чувствую, что я приближаюсь к этому неправильно.
Что вы ищете, я считаю, является репозиторием: они позволят вам определять пользовательские запросы. См. Http://symfony.com/doc/current/doctrine/repository.html – SolarBear
согласен с Solarbear. Репозитории - это ключевое слово для вашей проблемы. –
CodeIgniter> Symfony ... – Hackerman