Задать вопрос
  • Нужна помощь с архитектурой в MVC?

    dmitriylanets
    @dmitriylanets
    Использую следущий подход для построение форм:
    $validation = new Symfony\Component\Validator\Validation; 
    
            $form = (new Simpleform('loginform', '/form/', $validation))
                            ->setTwig($twig);
    
    	$simpleform = $form
    		->addClass('login')
    		->setRequired_label(NULL);
    	
    	$simpleform->addField(
    		(new Input('userlogin'))
    		    ->setId("userlogin")
    		    ->addAttr('placeholder',"электронная почта")
    		,'Логин/email', 'email|required');
    	
    	$simpleform->addField(
    		(new Input('password'))
    		    ->addAttr("type", "password")
    		    ->addAttr('placeholder',"секретный код")
    		    ->setValue('')
    		,'Пароль', 'required');	
    	
    	$simpleform->addControl(
    		new \Core\Form\Control\Button("submit", "Войти в личный кабинет")
    		);
    
    echo $simpleform->render();
  • Нужна помощь с архитектурой в MVC?

    dmitriylanets
    @dmitriylanets
    каталоги в приложениях в основном используются следующей структуры:
    app - файлы приложения
    bootstrap - файлы конфига загрузки
    public - публичная директория

    пример https://github.com/dimaxz/frameworkless
    этот каркас работает на Activerecord Propel2 поэтому нет Domain

    если есть работа с домеными моделями без активрекодра, то тогда есть каталог
    app/Domain
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    Но по-хорошему, мне ведь нужно отдать данные об авторе, во View, тоже как объект? Т.е. свойство author_id должно быть объектом author в котором присутствует id, имя автора, аватар и т.д.. На каком этапе нужно получать с помощью author_id информацию об авторе поста?

    два варианта либо получить все иерархию объектов сразу либо lazy load лениво,
    1. вы получаете $post как объект, $post->getAuthor() //вытащит объект автора без доп.запроса
    2. линиво при обращении к методу $post->getAuthor() будет сделан запрос на получение объекта Author
    ОРМ умеют работать в двух вариантх

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

    я шел по вашему пути, задавал много вопросов, что то писал свое в итоге пришел к мнению что лучше брать готовый инструмент.
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    Entity это класс для работы с БД или другим хранилищем данных.

    перешел по ссылке, первое что написано про сущности (Entity)
    Сущности определяются бизнес-правилами предприятия.

    в вашем случае сущность завязана на работу с бд, зависит от инфраструктуры, в идеале сущности не важно с каким источником данных она связанна, седня БД, завтра мемкеш, сессия, сервис
    почитайте про DDD, code first
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    все что вы делаете уже есть в ORM, посмотрите Propel2
    просто вы наткнетесь на кучу проблем если будете реализовывать самостоятельно.
  • Как тестировать модули?

    dmitriylanets
    @dmitriylanets Автор вопроса
    т.е. юнит тестирование,
    без бд и интерфейса?
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    хотелось бы увидеть аналогичный алгоритм для сравнения в вашей архитектуре
    <?php
    //Entity
    class Entity{
        
        use ObjectToArrayTrait;
        
        protected $id;
        
        public function setId($id){
            $this->id = $id;
            return $this;
        }
        public function getId(){
            return $this->id;
        }
    }
    
    //Validation
    class UserValidation extend Validation{
        
        protected $user;
        
        public function __construct(User $user){
            $this->user = $user;
        }
        
        public function isValid(){
            //validation logic
            return true
        }
        
    }
    
    //User
    class User extends Entity
    {
        protected $email;
        protected $name;
        public function __construct(Email $email, $name)
        {
            $this
                ->setEmail($email)
                ->setName($name);
        }
        //даже если изменим через свойство другой класс не пройдет
        public function setEmail(Email $email){
            $this->email = $email;
            return $this;
        }
        public function setName($name){
            $this->name = $name;
            return $this;
        }
        public function getEmail(){
            return $this->email;
        }
        public function getName(){
            return $this->name;
        }    
    }
    //UserRepo
    class UserRepo{
        protected $db;
        function __construct(ActiveRecord $db){
            $this->db = $db;
        }
        //получаем User
        public function getUserById($id){
            $row = $this->db->getRow("users")->where("id",$id);
            $user 
                = (new User(new Email($row["email"])))
                ->setName($row["name"]);
            return $user;
        }
        //сохраняем
        public function save(User $user){
            if($user->getId()>0){
                $this->db->update("users",$user->toArray())->where("id",$user->getId());
            }
            else{
                $this->db->insert("users",$user->toArray());
            }
        }
    }
    
    
    //принимаем пост
    $post = $request->all();
    //создаем объект
    $user = (new User(new Email($post["email"])))->setName($post["name"]);
    //валидируем
    $validation = new UserValidation($user);
    //сохраняем
    if(!$validation->isValid()){
        throw new ValidationError($validation->getErrors());
    }
    else{
        $userRepo->save($user);
    }
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    причем тут valueObject я вам говорю валидацию значений для объекта, Вы же не будете создавать классы для всех данных модели
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    1. программисты пишут/изменяю код. пишут тесты для этого кода, но не всегда актуализируют документацию. Поэтому разработка ухудшается когда IDE вам подсказывает о наличие свойства а по факту его нет.
    2. Гетеры предоставляют скрытие реализации, наружу торчит метод getEmail() а внутри класса вы можете делать кучу пробразований, рефакторить код, но это останется внутри черного ящика.
    Внешний код как был настроен на getEmail() так и остался.
    я представляю код завязанный на $user->email не получится просто взять и отрефакторить
    3. через сеттеры, можно делать валидацию, как писали выше, это удобно https://stackoverflow.com/questions/15209511/best-...
    в вашем случае модель может ходить с некорректными данным по приложению
    4. вот давайте подсчитаем минусов который дает ваш подход, все из за чего что будут реализованы 100 не нужных сеттеров и геттеров, просто может пересмотреть дизайн класса если у него столько свойств?
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    за счет документирования кода да, можно обеспечить подсветку свойств, но документацию нужно поддерживать,
    также нельзя использовать валидацию и цепочку вызовов
    $user->setEmail($email)->setDateTime($date);
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    Модель - это понятие в рамках MVC
    модель можно разложить по классам Entity, Repository, Agregate, DataMapper и тд
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    Егор ваш IDE будет бесполезен, работа с таким кодом усложнится
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    например
    class User{
    protected $email;
    protected $lastAuthDate;
    function __construct($email){
    $this->email = $email;
    }
    }

    lastAuthDate - здесь не обязательное свойство для создания объекта, дата последней авторизации, то есть пользователь может быть зарегистрирован, но не воспользуется авторизации на сайте
    email - обязательность , нельзя создать объект без данного свойства

    п.с. id - кстати не является обязательным тоже, так как новый объект (не сохраненный) не имеет id в системе
  • Нужно ли создавать класс для объектов?

    dmitriylanets
    @dmitriylanets
    все свойства через консруктор? даже необязательные, ну вы даете?!
  • Почему не отправляется письмо Codegniter?

    dmitriylanets
    @dmitriylanets
    так попробуйте
    $config['protocol'] = 'smtp';
    $config['smtp_host'] = 'ssl://smtp.yandex.ru';
  • Как в codeigniter вызвать функцию контроллера из view?

    dmitriylanets
    @dmitriylanets
    не в модели ни в вьюехе это лучше не делать, можно воспользоваться хелпером для форм и формировать контролы в контроллере
  • Как правильно делать hotfix-ы для предыдущих релизов в рамках git flow?

    dmitriylanets
    @dmitriylanets
    Первый вариант, следущая версия выпущена, но до тестировщика не добралась

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