2015-06-10 4 views
1

Я создаю приложение PHP с использованием Laravel 4.2. Приложение позволяет пользователю посещать веб-сайт и отправлять уникальный код. Когда код отправляется, они получают вознаграждение, которое они заработали. Награды могут отличаться от таких вещей, как «10% от вашей следующей покупки», «Бесплатная футболка», «Бесплатная доставка при следующей покупке» и т. Д.Хранение данных в базе данных по классу

У меня есть модель Code в моей заявке, которая является модель для уникального кода, который пользователь изначально представляет. Итак, первым шагом в приложении является проверка кода, который они отправили, убедитесь, что он существует в базе данных, и затем ответьте на список возможных вознаграждений, на которые они имеют право.

Моя первая мысль состоит в том, чтобы иметь Reward и таблицу rewards для хранения доступных вознаграждений в базе данных, а затем просто представлять соответствующие данные пользователю после отправки их уникального кода. Нечто подобное в моем шаблоне:

<ul> 
    @foreach($rewards as $reward) 
     <li>{{ $reward->name }}</li> 
     <li>{{ $reward->value }}</li> 
     <li>{{ $reward->redemption_instructions }}</li> 
    @endforeach 
</ul> 

Однако, сейчас я думая, что это будет на самом деле быть более удобным для меня, чтобы каждая награда создана как его собственный класс. Таким образом, я могу создать как можно больше пользовательских функций для каждого типа вознаграждения, сколько мне нужно. Так, например, каждый класс вознаграждения должен иметь метод, называемый display(), который выводит необходимый html для отображения вознаграждения пользователю. В этом случае, мои шаблоны будет выглядеть примерно так:

<ul> 
    @foreach($rewards as $reward) 
     <li>{{ $reward->display() }}</li> 
    @endforeach 
</ul> 

Я пытаюсь выяснить, как настроить систему так, что они функционируют таким образом. Я планирую создать классы для хранения информации, необходимой для каждой награды. Например, это может выглядеть так:

class TenPercentOffNextOrderReward { 
    private $name = '10% Off Your Next Order'; 

    private $description = 'Take 10% off your next order on our website!'; 

    public function createCoupon() { 
     // create a coupon for this reward 
    } 
} 

class FreeShirtReward { 
    private $name = 'Free T-Shirt'; 

    private $description = 'Get a free t-shirt!'; 

    public function sendShirt() { 
     // send tshirt to customer 
    } 
} 

Итак, как вы можете видеть, каждый тип вознаграждения будет иметь разную функциональность. Это лучший способ справиться с этим типом настройки? Должна ли моя таблица rewards просто хранить разные имена классов для всех наград? Мне даже нужна таблица rewards?

+0

Старайтесь избегать этих вопросов, основанных на мнениях; они считаются вне темы для переполнения стека. При этом я хотел бы использовать для этого одну таблицу/модель, присоединить таблицу к коду, чтобы один код мог иметь много наград. –

ответ

0

По моему опыту, наличие таблицы, содержащей данные для чего-либо избыточного (например, имя, описание и т. Д.), Является более эффективной практикой, поскольку это также облегчает возможность ввода новых вознаграждений с использованием веб-интерфейса по линии. Затем определенные правила отображения вознаграждения должны быть указаны с использованием какой-либо логики на стороне сервера (например, вы делаете в своих классах выше) или просто используете какой-то механизм шаблонов и ссылаетесь на них с помощью шаблона_ид, который вы будете хранить в своем. Фактически даже шаблон_id может храниться вместе с шаблоном соответствия в таблице поиска в вашей базе данных, что делает его также редактируемым в будущем.

Таким образом, я не только оставил бы его в базе данных, но, если вы хотите настроить шаблоны отображения, вы можете подумать о том, чтобы улучшить вашу базу данных, чтобы она соответствовала этому, а не уменьшала ее.

Вообще говоря, таблицы баз данных хороши для хранения нескольких экземпляров того, что имеет похожие свойства (например, возможные вознаграждения), а классы хороши для определения поведения (как они отображаются), поэтому вы не идете по неправильному пути рассмотреть использование классов, но я бы просто должен был хранить данные об этих наградах в базе данных и обрабатывать их поведение только в коде программирования, а не в самих данных.

0

Если у наград может быть своя бизнес-логика (например, отправка рубашки), лучше будет использовать классы.

interface RewardInterface 
{ 
    public function getName(); 

    public function getDescription(); 

    public function reward(); 
} 

class NextOrderReward implements RewardInterface 
{ 
    private $percent; 

    public function __construct($percent = 10) 
    { 
     $this->percent = $percent; 
    } 

    public function getName() 
    { 
     return $this->percent.'% Off Your Next Order'; 
    } 

    public function getDescription() 
    { 
     return 'Take '.$this->percent.'% off your next order on our website!'; 
    } 

    public function reward() 
    { 
     // create coupon 
    } 
} 

class FreeShirtReward implements RewardInterface 
{ 
    public function getName() 
    { 
     return 'Free T-Shirt'; 
    } 

    public function getDescription() 
    { 
     return 'Get a free t-shirt!'; 
    } 

    public function reward() 
    { 
     // send tshirt to customer 
    } 
} 

Использование.

$rewards = [new NextOrderReward(), new NextOrderReward(20), new FreeShirtReward()]; 

<ul> 
    @foreach($rewards as $reward) 
     <li>{{ $reward->getName() }} <span>{{ $reward->getDescription() }}</span></li> 
    @endforeach 
</ul> 

Создание всего RewardInterface классов одновременно. Конечно, все конструкторы не должны иметь никаких параметров.

$rewards = []; 
foreach (get_declared_classes() as $className) { 
    if (in_array('RewardInterface', class_implements($className))) { 
     $rewards[] = new $className(); 
    } 
} 

Обратите внимание: если нет особых бизнес-логик для вознаграждений, использование классов может быть чрезмерно сложным.

+0

Спасибо, это полезно. Что, если «Код» имеет только определенные награды, связанные с ним? В этом случае мне необходимо программно получить вознаграждение. Поэтому я бы создал таблицу, которая объединяет коды для вознаграждений, а затем моей модели «Code» потребуется метод getRewards(). В этом случае я не должен хранить связанные имена классов вознаграждений в базе данных, поэтому, когда я вызываю 'getRewards()', я могу их пропустить и создать экземпляр соответствующих объектов? – flyingL123

+0

Я не думаю, что сохранение имен классов в БД имеет смысл. БД не должна знать ничего о вашем PHP-коде. Я обновил ответ, чтобы показать экземпляр всех классов, реализованных с помощью данного интерфейса сразу. –

Смежные вопросы