shoxabbos1994
@shoxabbos1994
Junior proger

Как сделать приватные поля в ларавеле?

Здравствуйте, сижу уже 4 часа голову севе ломаю помогите плиз.
Мне нужно сделать так чтоб некоторые поля в модели были приватными. но мне не помогает ни мутаторы ни магические методы типа __call и __set.

Обрадовался Думал нашел решение и написал Trait.
<?php namespace Shohabbos\Express\Traits;

use Exception;

trait Privatable
{
    /**
     * @var array List of attribute names which should be private.
     *
     * protected $private = [];
     */

    // public function __get($fieldName) {
    //     $this->isPrivate($fieldName);

    //     return parent::__get($fieldName);
    // }

    public function __set($fieldName, $value) {
        $this->isPrivate($fieldName);

        return parent::__set($fieldName, $value);
    }

    public function isPrivate($fieldName) {
        if (in_array($fieldName, $this->unsettable)) {
            throw new Exception('The '.$fieldName.' property is private');
        }
    }

}


И потом я понял что такой код все блокирует. Попробовал исключить внешние классы и это тоже не работает если только не через debug_backtrace. Хотелось бы получить контроль над динамическими полями. Сделать их `private,protected,public`
Есть чувства что копаю не в ту сторону. Но пока ничего не приходит на ум.

Проста количество кода растет и я вижу что теряю контроль над данными потому что можно записать / изменить в модель от куда угодно и кто угодно.

Нужен совет
Последние время уже не очень мне нравится удобства ОРМ ларавела потому что слишком много кода. сетторы, аксессоры, скопы, наблюдатели.......
Поделитесь опытом какой ОРМ поставить или же может есть какие шаблоны проектирование для этого.
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vism
Это потому что вы пытаетесь делать то, что не понимаете, но прочитали в умной книжке/статье, увидели на ютубе.
джедай режим / Не нужно поля приватными делать в модели твоей.

Не пытайтесь делать то, что не понимаете, через лет 5 будет понятно, а пока делайте как в доках написано, про простому.
А бизнес логику в отдельные классы выносите. Пока ПО для боингов писать не начнёте, вам хватит.

А если уж так важно всё тру вей писать, то лару сразу надо удалить, качать симфони и пытаться превозмогать там.
Ответ написан
neuotq
@neuotq
Прокрастинация
UPD Как правильно заметил товарищ vism я тут немного чуши написал по инерции. Не посмотрел куда дал ссылку. Там в примере главная проблема что человек из репозитория снова таки возвращает саму элокуент модель, а хорошо бы DTO - Data Transfer Object. Посмотрите пакет от Spatie https://github.com/spatie/data-transfer-object.

А в целом ответить на ваш вопрос легче было, если был бы ясен контекст. Зачем приватные поля? Возможно все проще перевести в данные у вас, и это логику "защиты" перенести на уровень валидации. Тогда и ставить ничего не нужно, просто в валидации, где нужно, проверяйте входящие данные и выкидывайте ошибку. Здесь будет и гибкость(где нужно разные влаидаторы) и "магия" Ларавел в целом сохраняется коробочная.
/---
Это потому, что Laravel в качестве ORM использует Eloquent, который сделан по паттерну ActiveRecord. Многие считают его антипаттерном. Оставим срачи за рамками.
Вам подойдёт внедрения подхода с паттерном репозитория .
Вот простой пример, будет понятно куда копать и как действовать:
https://www.twilio.com/blog/repository-pattern-in-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы