DevGang
Авторизоваться

Добавление пользовательских настроек в приложение Laravel 

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

Так много возможностей

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

Самый простой способ решить эту проблему - с помощью настроек на уровне пользователя, однако используемая реализация может значительно различаться. Мы можем просто добавить столбец настроек в таблицу «User» или использовать таблицу настроек и прикрепить их к пользователю с помощью внешнего ключа.

Хотя добавление новой таблици дает вам больше возможностей, она требует выполнения второго запроса, чтобы получить настройки пользователя. И поскольку Laravel уже загружает запись пользователя для аутентифицированного, добавление дополнительного столбца избавляет нас от выполнения второго запроса.

Добавление функциональности пользователям

Первое, что нам нужно сделать, это добавить столбец настроек в таблицу пользователей:

// Users migration
$table -> text("settings");

Вы также можете выбрать больший текстовый формат, если вам нужно, но в большинстве случаев стандартный текстовый формат должен обеспечивать достаточно места для всех ваших данных.

Далее, мы должны сказать Laravel, что этот атрибут является массивом и должен быть закодирован / декодирован JSON при доступе / настройке его содержимого. Мы можем легко сделать это, добавив столбец в массив $casts на модели User, например так:

// User model
protected $casts = ["settings" => "array"];

Получение настройки для пользователя

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

/**
* Получить настройку с заданным именем или вернуться к значениям по умолчанию. 
*
*/
public function setting(string $name, $default = null)
{
   if (array_key_exists($name, $this->settings)) {
       return $this->settings[$name];
   }
   return $default;
}

Если вы хотите получить все настройки пользователя одновременно, вы можете просто получить доступ к свойству настроек в самой модели пользователя, например, так:

$settings = $user->settings;

Запись настроек в базу данных

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

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

Мы также добавим логический параметр $save, который установлен по умолчанию в true. Таким образом, вызов метода автоматически сохранит изменения, однако, если вы хотите выполнить дальнейшие операции с моделью User до сохранения, у вас есть возможность отключить функцию сохранения. Мы будем называть этот метод «settings», поскольку мы потенциально работаем с более чем одной настройкой:

/**
* Обновите одну или несколько настроек, а затем при необходимости сохраните модель.
*
*/
public function settings(array $revisions, bool $save = true) : self
{
   $this->settings = array_merge($this->settings, $revisions);
   if ($save) {
       $this->save();
   }
   return $this;
}

Тестирование

Давайте закончим, добавив несколько модульных тестов, которые подтверждают, что методы настройки работают так, как ожидалось. Мы проверим, что мы можем получить доступ к настройке, что мы можем вернуться к значению по умолчанию, и что мы можем сохранить пересмотренные настройки в базе данных:

/** @test */
public function a_user_can_get_a_setting()
{
   $settings = ["settings" => ["foo" => "bar"]];
   $user = factory(User::class, 1)->create($settings);
   $this->assertEquals("bar", $user->setting("foo"));
   $this->assertNull($user->setting("baz"));
   $this->assertEquals(5, $user->setting("baz", 5));
}
/** @test */
public function a_user_can_change_settings()
{
   $settings = ["settings" => ["foo" => "bar"]];
   $user = factory(User::class, 1)->create($settings);
   $this->assertEquals(
       "world", 
       $user->settings(["foo" => "world"], false)->setting("foo")
   );
   $this->assertEquals(
       "hello", 
       $user->settings(["baz" => "hello"], false)->setting("baz")
   );
   $this->assertEquals(
       ["foo" => "bar"], $user->refresh()->settings
   );
}
/** @test */
public function a_user_can_change_and_save_settings()
{
   $settings = ["settings" => ["foo" => "bar"]];
   $user = factory(User::class, 1)->create($settings);
   $this->assertEquals(
       "world", 
       $user->settings(["foo" => "world"])->setting("foo")
   );
   $this->assertEquals(
       ["foo" => "world"], $user->refresh()->settings
   );
}
#PHP #Laravel
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу