2017-02-18 25 views
1

У меня есть приложение, которое использует CakePHP поле для хранения значений, как 0, 1, 2.Где определить значение поля для таблиц CakePHP

Таблица:

+----+--------+----------------+ 
| id | status | title   | 
+----+--------+----------------+ 
| 1 |  2 | something new | 
| 2 |  1 |   nsfw | 
| 3 |  1 |  a potato | 
| 5 |  0 | the real thing | 
+----+--------+----------------+ 

Entity/Массив:

$data = [ 
    0 => 'not published', 
    1 => 'published', 
    2 => 'draft', 
    9 => 'option', 
]; 

// Some public methods to get the data.. 

Шаблон Форма выпадающий:

+----+---------------+ 
| id | value   | 
+----+---------------+ 
| 0 | not published | 
| 1 |  published | 
| 2 |   draft | 
| 9 |  option | 
+----+---------------+ 

Что я использую в шаблоне:

echo $this->Form->input('status', ['options' => $article->getArticleStatusList()]); 

Пример: articles стол с status поле. Значения по умолчанию: 0 не публикуются, 1 публикуются и т. Д. Определение их в Объект/статья. Существует массив со значениями по умолчанию, поэтому в файле шаблона я вызываю метод Entity, который использует массив для ввода формы options.

Время от времени я использовал для этого конфигурационный массив. Это хороший способ выполнить задачу? Он должен храниться в файле ini? Или в разделе Таблица 0 Модельный ряд?

Все работает, но я хочу следовать шаблону MVC. Благодарю.

+0

Хранить в столовой - это хорошая идея, если эти записи также относятся к другим задачам. – urfusion

+0

Извините. Это торт, поэтому вы не можете следовать шаблону MVC, потому что он не был разработан таким образом. Если вы застряли в этой структуре, я бы рекомендовал вместо этого инвестировать некоторое время в изучение шаблона Active Record, –

+0

Считаете ли вы, что Yii2 может быть лучшей альтернативой? Я прочитал, что у него есть Active Record. –

ответ

2

Поместите их в src\Model\ArticleStatus.php. По крайней мере, для меня статус - это список одной или нескольких вещей, которые не меняются очень часто. Не нужно помещать их в таблицу DB. Эти списки являются данными и явно входят в модельный слой шаблона MVC.

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

Например, у нас есть таблица стран с большим количеством дополнительной информации по стране, но мы используем список констант наших ~ 18 наиболее используемых стран, которые мы должны выполнять условные проверки из-за нашего бизнеса. Итак, у нас есть src\Model\Table\CountriesTable.php, но также src\Model\Country.php. Причиной этого является то, что он становится намного читабельнее и легче понять, что входит в код, если вы можете написать Country::GERMANY вместо того, чтобы просто использовать идентификатор, например 5. Я лично считаю очень плохой практикой использовать жестко кодированный идентификатор везде в коде.

if ($country === 41 && $status === 3) 

против

if ($country === Country::GERMANY && $status === ArticleStatus::PUBLISHED) 

Я думаю, что мы можем договориться о том читаемый и легко понять код гораздо лучше, чем печатать несколько символов меньше. Честно говоря, люди, нытье о нескольких персонажах, должны научиться печатать быстрее. Я считаю это просто плохим оправданием. ;) Также использование IDE будет автоматически заполнять константы класса любым способом для вас. Он не будет делать этого для целого числа.

Вот пример того, что даже позволит вам создавать свой список с переведенными этикетками:

<?php 
namespace App\Model; 

class ArticleStatus { 

    const PUBLISHED = 'published'; 
    const DRAFT = 'draft'; 
    // Add more as you like 

    public static function getStatuses() { 
     return [ 
      static::PUBLISHED , 
      static::DRAFT 
     ]; 
    } 

    public static function getKeyValueList() { 
     return [ 
      static::PUBLISHED => __d('app', 'Published'), 
      static::DRAFT=> __d('app', 'Draft') 
     ]; 
    } 
} 

Используйте его в контроллер и установить его на ваш взгляд, или непосредственно использовать его в представлении.