These are chat archives for LaravelRUS/chat

25th
Jun 2016
Ahmed
@HeartProgrammer
Jun 25 2016 06:09
На сайте сделал добавления новостей. Так вот при добавлении новости сделал поля такие как "Название", "Описание", "Полное описание", "Автор" а так же сделал инпут для добавлении картинки. Все правильно добавляется. Но вот при изменение одной картинки на другую, тут уже проблема, картинка просто не меняется. Возможно где-то есть ошибка в коде
public function update($id, PublishNewsRequest $requestData)
    {
        $news = News::find($id);

        $news->title = $requestData['title'];
        $news->description = $requestData['description'];
        $news->full_description = $requestData['full_description'];
        $news->author = $requestData['author'];
        $news->file_path = $requestData['file_path'];

        if($requestData->hasFile('image'))
        {
            $file = $requestData->file('image');
            $timestamp = str_replace([' ', ':'], '-', Carbon::now()->toDateTimeString());
            $name = $timestamp . '-' . $file->getClientOriginalName();
            $news->file_path = $name;
            $file->move(public_path() . '/images/', $name);
        }

        $news->save();

        return redirect()->route('news.index');
    }
KarmaBot
@KarmaBot
Jun 25 2016 06:09
@HeartProgrammer, чтобы показать длинный листинг кода желательно использовать pastebin-сервис, например gist.github.com или laravel.io/bin.
JhaoDa
@jhaoda
Jun 25 2016 06:28
@HeartProgrammer ты до сих пор не знаешь про массовое присвоение атрибутов моделям?
Ahmed
@HeartProgrammer
Jun 25 2016 06:41
@jhaoda первый раз такое слышу
Aleksandr Ayvazov
@mefist1990
Jun 25 2016 07:45
Доброе утро, как мигрировать определенную таблицу с данными из БД? в доках не нашел
nocaut
@dikiypac
Jun 25 2016 08:09
как удалить елемент из виборки $smtp = $this->get()
  foreach ($smtp as $i => $data){
    f (!Route::has($url)){
            $data->delete();
            }
        }
Так он удаляется из БД тоже
Andrey Evdokimov
@sharpeenko
Jun 25 2016 08:52
Доброго всем!

А знает кто-нибудь такое дело, я правильно понимаю, что это годится, только если используется коробочная тема аутентификации?

$user = new User(array('name' => 'John'));

$this->be($user);

А кто-нибудь сталкивался, если о Sentinel речь идет?

Вот такая ошибка в юнит-тесте

ErrorException: Argument 1 passed to Illuminate\Foundation\Testing\TestCase::be() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\User given, called in /home/developer/www/fitness.com.dev/www/tests/UserControllerTest.php on line 17 and defined

Aleksandr Ayvazov
@mefist1990
Jun 25 2016 09:45

Помоги с ошибкой одной странной
Есть роут

Route::post('importExcel', 'MaatwebsiteDemoController@importExcel');

Есть кусок контролера

public function importExcel()
    {
        if(Input::hasFile('import_file')){
            $path = Input::file('import_file')->getRealPath();
            $data = Excel::load($path, function($reader) {
            })->get();
            if(!empty($data) && $data->count()){
                foreach ($data as $key => $value) {
                    $insert[] = ['title' => $value->title, 'description' => $value->description];
                }
                if(!empty($insert)){
                    DB::table('items')->insert($insert);
                    dd('Insert Record successfully.');
                }
            }
        }
        return back();

есть форма Импорта файла

<form style="border: 4px solid #a1a1a1;margin-top: 15px;padding: 10px;" action="{{ URL::to('importExcel') }}" class="form-horizontal" method="post" enctype="multipart/form-data">
            <input type="file" name="import_file" />
            <button class="btn btn-primary">Import File</button>

И есть ошибка

TokenMismatchException in VerifyCsrfToken.php line 67:

Выгрузка из БД в виде файла работает, а вот импорт нет(

Aleksandr Ayvazov
@mefist1990
Jun 25 2016 09:52
п.с решилось в форму вставил
 <input type="hidden" name="_token" value="{{ csrf_token() }}">
Aleksandr Ayvazov
@mefist1990
Jun 25 2016 10:58
Решил все проблемы
censoredgit
@censoredgit
Jun 25 2016 11:07
@mefist1990 {{ csrf_field() }} еще так можно)
Aleksandr Ayvazov
@mefist1990
Jun 25 2016 11:16
@censoredgit а сможешь копирнуть для блейда, как правильно вывод всей таблицы сделать на страницу
Uladzislau Danilchyk
@danilchican
Jun 25 2016 12:12
Ребята, привет. развернул проект на ларе, пытаюсь вывести ошибки после валидации, но ничего не выводит, даже old('name').
KarmaBot
@KarmaBot
Jun 25 2016 12:12
@danilchican, ну рассказывай. Как жизнь? :)
Uladzislau Danilchyk
@danilchican
Jun 25 2016 12:12
Правила валидации устанавливал в собственном реквесте
вывожу пока просто {{ var_dump($errors) }}
роуты находятся в группе ['web', 'auth']
Aleksandr Ayvazov
@mefist1990
Jun 25 2016 12:46
Ура починил я этот компонент и сделал импорт-экспорт из файла https://packagist.org/packages/maatwebsite/excel
Alexander
@Dualse
Jun 25 2016 12:49
@danilchican Версия лары? web - в Kernel.php не подключен?
Uladzislau Danilchyk
@danilchican
Jun 25 2016 12:51
@Dualse 5.2.* (последняя). удалил из группы мидлварей 'web', оставил auth - заработало.. что это могло бы значить?
Alexander
@Dualse
Jun 25 2016 12:52
@danilchican 2 web было
Uladzislau Danilchyk
@danilchican
Jun 25 2016 13:23
@Dualse одна
Alexander
@Dualse
Jun 25 2016 14:10
@danilchican Ты же сам написал, что роуты находятся в группе web. Кстати, я соврал насчет Kernel.php. Он в RouteServiceProvider подключается.
dihalt
@dihalt
Jun 25 2016 14:43

Ребята, подскажите,

<div id="filters">
    {% for filter in filters %}
        {{ filter.render() }}
    {% endfor %}
</div>

почему Twig при вызове filter.render() вставляет полученный шаблон как текст с тегами?

Arsen Soroka
@arsen-s
Jun 25 2016 14:44
This message was deleted
dihalt
@dihalt
Jun 25 2016 14:45
@arsen-s это в блейде так, а в твиге?
Arsen Soroka
@arsen-s
Jun 25 2016 14:48
@dihalt сорри, завтыкал
dihalt
@dihalt
Jun 25 2016 15:14
@arsen-s {{ filter.render()|raw }}
вот оно как оказывается
NelinD
@NelinD
Jun 25 2016 16:06
Есть инструкция как выводить выводить меню страниц на сайте? вижу в видео и текстах упоминание виджета меню, но не вижу его в стандартной поставке
Aleksandr Ayvazov
@mefist1990
Jun 25 2016 16:27
как сделать выбор из Таблицы Мускл, с второй строки
Arsen Soroka
@arsen-s
Jun 25 2016 16:44
@mefist1990
->skip(1)
Steve Juney
@uppermanis
Jun 25 2016 17:09
Приветик всем, я туплю, это наверное вопрос больше по пхп нежели по laravel но все же. Есть такая штука как внизу..
Мне нужно каждый такой вывод обернуть в ссылку но инфа для ссылки тоже берется из такой выборки.. суть в том что при выборке получаеться каша если делать так как делаю сейчас я.. я не очень понимаю как мне его обернуть если данные берутся оттуда же.
@foreach($data as $item)
            <a href="?sel={{ $item->c_id . "_" . Auth::id() . $item->uid }}" class="no-link">
              <div class="user">
                  <img class="uphoto fl" src="{{ asset("/{$item->u_photo}") }}">
                  <div class="abt">
                      <p class="uname"><a href="/uid{{ $item->uid }}">{{ $item->first_name . " " . $item->last_name }}</a></p>
                      <p class="uprof">{{ $item->profession_status }}</p>
                      <p class="reply">{{ 1245 }}</p>
                  </div>
              </div>
            </a>
          @endforeach
KarmaBot
@KarmaBot
Jun 25 2016 17:09
Привет, @uppermanis! Проходи, присаживайся. В ногах правды нет :)
Dmitriy
@foRsxs
Jun 25 2016 17:12
@uppermanis не понятно что ты хочешь сделать
Nuzsk
@Nuzsk
Jun 25 2016 17:14
@uppermanis у тебя <a> внутри <a>
айайай так делать
Steve Juney
@uppermanis
Jun 25 2016 17:14
@foRsxs обернуть блок user в ссылку, данные для которой берутся из той же выборки что и весь блок user
@Nuzsk да, знаю, но я хз как подругому сделать ссылку на пост в которой может быть ссылка... хотя да, ты прав, в моем блоке толком ссылка то и не нужна, спасибо что подметил, это я ща поправлю. Но ошибку не уберет
@Nuzsk лол, странно, но когда я убрал вложеную ссылку все стало норм.. что-то я не очень понимаю как так получилось
censoredgit
@censoredgit
Jun 25 2016 18:01
Всем привет. Ребят что не так с этой строкой dj%20mak%20solo%20%B7%B7%B7 ? лара ее нормально не может переварить. request->get() возвращает пустую строку , очередь кидает исключение, dd выводит http://images.devs-on.net/Image/jVFBrRro0k6mM7sK-.png wtf?)
KarmaBot
@KarmaBot
Jun 25 2016 18:01
Приветствую тебя, @censoredgit!
JhaoDa
@jhaoda
Jun 25 2016 18:04
@censoredgit видишь прекфикс b у строки?
censoredgit
@censoredgit
Jun 25 2016 18:05
@jhaoda да, если просто var_dump делать то нет префикса
censoredgit
@censoredgit
Jun 25 2016 18:10
@jhaoda не подскажешь ?
JhaoDa
@jhaoda
Jun 25 2016 18:11
@censoredgit я только вижу, что это бинарная строка. Как ты её такую получил — хз. Что не нравится ларавель — хз.
censoredgit
@censoredgit
Jun 25 2016 18:22
@jhaoda написать бы в англ чате laravel, но мой англ не позволяет...
"Как ты её такую получил — хз" http://www.baidu.com/search/spider.html этот робот такие запросы отправляет. http://images.devs-on.net/Image/p6Gdnd6jQ2Jatnjo-.png да и пользователи могут ввести)
censoredgit
@censoredgit
Jun 25 2016 18:28
http://laravel.su/users?query=dj%20mak%20solo%20%B7%B7%B7 инпут пустой. Чет прям не айс
Nepster
@nepster-web
Jun 25 2016 19:55
всем привет. Такой вопрос, если идет выборка с реляциями и ее поместить в коллекцию, то внутри будет тупо многомерный массив. Можно ли сделать так, чтобы все элементы тоже были коллекциями ?
KarmaBot
@KarmaBot
Jun 25 2016 19:55
Hello, @nepster-web!
mtereschenko
@mtereschenko
Jun 25 2016 19:59
всем привет
KarmaBot
@KarmaBot
Jun 25 2016 19:59
Будь как дома, @mtereschenko, я ни в чем не откажу. Много мануалов, коль желаешь, покажу :)
mtereschenko
@mtereschenko
Jun 25 2016 20:00
Решил поделиться радостью
)
на работе все проекты пишутся на базе самописного фремворка который был написан на идеологии первой симфонии очень давно. В виду разных факторов большинство функционала пишется силами команды и стековерфлоу(да хранит его %подставить нужное%).
Вчера решил перенести все это дело на ларавель 5
сегодня закончил писать скрипты-парсеры всего до чего дотянулся для создания "исходника" который уже легче адаптировать к ларе
скрипты по ходу работы исправили КУЧУ ошибок из-за которых эта куча оказалась бы просто пожирателем времени на рутинное их исправление
mtereschenko
@mtereschenko
Jun 25 2016 20:06
так же нагенерировал миграций ко всему до чего дотянулся(хотя часть из свежесгенерированого кода пойдет под нож ввиду тупо ненадобности)
нигде не встречал еще в нете статей на тему как перенести приложение с одного фреймворка на другой. Решил сделать все самому
Пока 1-й день иде
т
впереди 2 недели отпуска
полет нормальный
надеюсь что эксперимент пройдет успешно
цель експеримента - попробовать свои силы в рефакторе и адаптации кучи кода под новое окружение и по возможности не потерять в функционале
а так же познакомится поближе с ларавелью
ибо надоело время от времени пилить одно и то же (табличка, инсерт апдейт делет + авторизация)
ДА! Вопрос! Я покопался в недрах лары и я че-то не понял. В таблице где хранятся авторизационные данные пользователя поле password ОБЯЗАТЕЛЬНО?
mtereschenko
@mtereschenko
Jun 25 2016 20:11
Ибо (не вспомню в каком классе) идет обращение к полю массива password
что-то вроде $parameters['password'].
JhaoDa
@jhaoda
Jun 25 2016 20:21
@mtereschenko создавай новый драйвер для механизма аутентификации и выкидывай это поле, если мешает
Arsen Soroka
@arsen-s
Jun 25 2016 20:21
@nepster-web релейшны и так по дефолту коллекции
mtereschenko
@mtereschenko
Jun 25 2016 20:22
до авторизации на "новосёле" думаю через 4-5 дней добраться
хочу сначала это все запустить, но спасибо. буду копать туда
JhaoDa
@jhaoda
Jun 25 2016 20:22
@mtereschenko а-у-тен-ти-фи-ка-ци-я
mtereschenko
@mtereschenko
Jun 25 2016 20:22
да
аутентификацию
)
ибо структуру бд менять категорически не хочу
нравится она мне очень)
самый прикол будет с блейдом)
JhaoDa
@jhaoda
Jun 25 2016 20:24
@mtereschenko а ты можешь всегда писать по несколько слов в сообщении?
mtereschenko
@mtereschenko
Jun 25 2016 20:25
Да, прошу прощения.
@jhaoda отсутствие верстки в проэтах - норма) Все делается хелперами. пока самые большие вопросы вызывают модели. Вот их переобучить будет сложно. Точнее не столько сложно сколько муторно. Часть выкинуть, часть переписать. И хорошо подумать над тем что оставить
mtereschenko
@mtereschenko
Jun 25 2016 20:31
но и это еще не все. все что будет сделано - уйдет в небытие( Оно никому не надо кроме моего интереса к подобного рода наркомании
Anton Vorontsov
@symbios-zi
Jun 25 2016 20:35

A repository doesn't need to be restricted to a single table, which is what I thought initially. There should be a repository per aggregate root, and that repository should take care of storing data to all of the underlying, related tables
что в данном предложении означает?

should be a repository per aggregate root

mtereschenko
@mtereschenko
Jun 25 2016 20:38
@symbios-zi могу ошибаться, в контексте всего текста я бы воспринял как "корневой репозиторий должен быть состаным" или как-то так
JhaoDa
@jhaoda
Jun 25 2016 20:44
@symbios-zi aggregate root — некая логическая единица данных, если без умных слов (я их забыл :) )
@symbios-zi например, если при создании юзера надо что-то писать в три таблицы, ну там, users, socials, options, то репа юзеров должна это делать сама, не вызывая ещё две репы для socials и options
т.е. если я хочу сложный объект записать со связями, то 1 репозиторий может это делать и писать в несколько таблиц. и не верно делать для исключительно для каждой таблицы свой репозиторий. 1 репозиторий может управлять несколькими таблицами
Nuzsk
@Nuzsk
Jun 25 2016 20:52
если корень агрегата из DDD - просто центральная модель
JhaoDa
@jhaoda
Jun 25 2016 20:52
@symbios-zi ага
Anton Vorontsov
@symbios-zi
Jun 25 2016 20:55
тогда вопрос. на каком уровне делается кеш данных? я например хочу закешировать таблицу регионов и обнулять кеш тогда когда в таблице данные обновлятся. Я могу сделать обсервер который будет чистить кеш. Но где кеш этот пораждать. Думаю это не репозитории
Nuzsk
@Nuzsk
Jun 25 2016 20:58
@symbios-zi кеш-декоратор репозитария?
Anton Vorontsov
@symbios-zi
Jun 25 2016 21:02
@Nuzsk на каждый метод репозитория свой декоратор?
Nuzsk
@Nuzsk
Jun 25 2016 21:06
@symbios-zi на каждый репо свой декоратор
который уже перекроет некоторые методы у оригинального репо и будет подсовывать данные из кеша
Sergey Protko
@fesor
Jun 25 2016 21:09
@symbios-zi что в этом такого?
@symbios-zi как минимум некоторые репосы не требуют кеширования а некоторые требуют различных стратегий по инвалидации кэша
Anton Vorontsov
@symbios-zi
Jun 25 2016 21:11
@fesor ну есть вариант сделал в декораторе такие же методы. или же разделить на несколько декораторов
Sergey Protko
@fesor
Jun 25 2016 21:12

или же разделить на несколько декораторов

эм.... ну как хочешь

точнее как удобно так и делай)
Anton Vorontsov
@symbios-zi
Jun 25 2016 21:16
и еще вопрос. Правильно ли я понимаю что не стоит упарываться в IOC, ведь иногда мне нужен объект с определынными параметрами? нет ведь ничего криминально в том чтобы создать объект через new BonusManager($orderItemsPrice, $userDTO)?
Sergey Protko
@fesor
Jun 25 2016 21:17
если этот объект используется как значение - то норм
даже не так
если объект используется как значение - то его не должно быть в ioc
в ioc не должно быть объектов содержащих состояние (конечно же есть исключения)
Anton Vorontsov
@symbios-zi
Jun 25 2016 21:19
@fesor мой класс содержит состояние и бизнес логику?
Sergey Protko
@fesor
Jun 25 2016 21:20
@symbios-zi норм
@symbios-zi ну мол сущности, объекты значений - этого не должно быть в IoC так как это... то с чем ты работает. Аргументы
короч почитай зачем нужен IoC и прикинь надо тебе туда объекты ложить или нет))
Anton Vorontsov
@symbios-zi
Jun 25 2016 21:22
@fesor ну вот мой класс DiscountManager в конструкторе принимает цену заказа и доп данные о пользователе и его скидках, и потом проверяет каким классам скидки сосуществуют эти данные и считает скидки. Он хранит состояние?
путаница постоянно с этими понятиями
Sergey Protko
@fesor
Jun 25 2016 21:59
@symbios-zi у тебя вышла каша)
классы "менеджеры" не должны принимать "цены" в конструктор
либо это параметр, и тогда пусть себе лежит в ioc
либо это надо было вынести в метод объекта
Nuzsk
@Nuzsk
Jun 25 2016 22:07

либо это надо было вынести в метод объекта

@fesor как и зачем?

Sergey Protko
@fesor
Jun 25 2016 22:08
This message was deleted
@Nuzsk логика простая. В конструктор передается то, что нужно объекту для его существования. Точнее без чего его существование не имеет смысла.
Nuzsk
@Nuzsk
Jun 25 2016 22:09
@fesor я понимаю, но ты 2 способа описал...я не понимаю, чем они отличаются
Sergey Protko
@fesor
Jun 25 2016 22:10
@Nuzsk ну смотри, бывают параметры инициализации объекта, они у одного объекта одни и те же на весь цикл его жизни. конфигурация если хочешь. А бывают аргументы - то что нужно @symbios-zi ибо иначе он бы просто забрал свой "менеджер" из контейнера и просто бы передал то что меняется как аргумент какого-то метода
хотя какая разница если всеравно выйдет нифига не ООП
Nuzsk
@Nuzsk
Jun 25 2016 22:11
@fesor
либо это параметр, и тогда пусть себе лежит в ioc
либо это надо было вынести в метод объекта
Sergey Protko
@fesor
Jun 25 2016 22:11
классы менеджеры, работа с публичными пропертями других объектов...
@Nuzsk параметр в контексте контейнера зависимостей, ок?
@Nuzsk ну мол есть сервисы, а есть параметры для сервисов
Nuzsk
@Nuzsk
Jun 25 2016 22:12
@fesor контейнер его в публичное поле\конструктор сервиса загонит?
Sergey Protko
@fesor
Jun 25 2016 22:12
ну да, ему сложно что-ли?)
описать только в конфиге контейнера нужно
Nuzsk
@Nuzsk
Jun 25 2016 22:12
все, теперь совсем понял )
Sergey Protko
@fesor
Jun 25 2016 22:12
вот простой пример
Nuzsk
@Nuzsk
Jun 25 2016 22:13
лучше другой пример давай, как работает инициализация в DI я понимаю (и зачем нужна)
Sergey Protko
@fesor
Jun 25 2016 22:13
class FileUploader{
    public function __construct(string $uploadDir);
}
вот тут логично uploadDir через ioc пробрасывать
а вот с ценами
Nuzsk
@Nuzsk
Jun 25 2016 22:14

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

вот это интересно, как бы ты сделал?

Sergey Protko
@fesor
Jun 25 2016 22:14
@Nuzsk взял бы доктрину
@Nuzsk )))
@Nuzsk но в целом тебе никто не мешает менять состояние моделек в самих модельках
и дергать на мутацию состояния один метод
а не кучу пропертей сетить
и save пусть моделька внутри вызывает
сама же у себя
но не буду рекомендовать ибо хз как элоквент на такой расклад отреагирует
все ж AR как раз для того и придумано что бы стэйт был в отдельном объекте
просто можно перед ним объект-обертку с бизнес правилами впихнуть
Nuzsk
@Nuzsk
Jun 25 2016 22:16

@Nuzsk взял бы доктрину

ок, а как бы это в контексте доктрин выглядело?

Sergey Protko
@fesor
Jun 25 2016 22:16
и тогда вся остальная система про AR ничего знать не будет
@Nuzsk ну просто как метод объекта
@Nuzsk хочешь обновить что-то - вызываешь один метод и передаешь туда все что меняется... списком аргументов
Nuzsk
@Nuzsk
Jun 25 2016 22:17
сегодня какой-то сложный день )
Sergey Protko
@fesor
Jun 25 2016 22:17
public function updateProfile(string $firstName, string $lastName, FileReference $avatar, \DateTime $birthDate)
Nuzsk
@Nuzsk
Jun 25 2016 22:17
ты про сеттер или про метод бизнес логики?
Sergey Protko
@fesor
Jun 25 2016 22:17
@Nuzsk сеттеры не лучше публичных свойств
сеттеры дают тебе один и тот же результат. У тебя есь один объект с состояниеми и другой с поведением.... то есть состояние + процедуры...
никакого ООП
процедурщина на классах
Nuzsk
@Nuzsk
Jun 25 2016 22:18
ок, а можешь подробнее?
в плане того: для установки оптимальной цены сделаю метод updatePrice(PriceStrategy $strategy) туда передам объект класса HolidayPriceStrategy, который поможет расчитать оптимальную цену на данный момен
Sergey Protko
@fesor
Jun 25 2016 22:23
тип дабл диспатч?
ну и как-то странно что у тебя метод карренси меняет а на самом деле меняет цену
Nuzsk
@Nuzsk
Jun 25 2016 22:23
там price должен быть )
Sergey Protko
@fesor
Jun 25 2016 22:24
updatePrice(PriceStrategy?
Nuzsk
@Nuzsk
Jun 25 2016 22:24
ага
Sergey Protko
@fesor
Jun 25 2016 22:24
ну короч не вникая в домен сложно
мне PriceStrategy ничего не говорит что оно делать должно
HolidayPriceStrategy
мне тут кажется это больше на скидки похоже
не?
Nuzsk
@Nuzsk
Jun 25 2016 22:25
это абстрактный пример так то )
Sergey Protko
@fesor
Jun 25 2016 22:25
ну короч... вопросы цены решаются легко и просто - мы меняем только цену продукта не взирая на любые "переменные" вроде "какой сегодня день
Nuzsk
@Nuzsk
Jun 25 2016 22:26
окей, значит updatePrice($price), теперь вопрос, что бы ты делал вместо PriceManager?
Sergey Protko
@fesor
Jun 25 2016 22:26
а вот эти HolydayDiscountPolicy (я бы так назвал) я бы применял уже на уровне того обекта, которому цена понадобилась

что бы ты делал вместо PriceManager?

а ничего

он становится ненужным
просто лишняя прослойка
хоть из контроллера делай вызов - у тебя для мутации состояния будет ровно один вызов метода
Nuzsk
@Nuzsk
Jun 25 2016 22:28
а тебе не придется ли на каждый чих менять внутренности Product, если оптимальная цена вычисляется внутри?
Sergey Protko
@fesor
Jun 25 2016 22:28
эм.....
а что есть "оптимальная цена"?

на каждый чих менять внутренности Product

это лучше чем на каждый чих менять нутро какого-то ProductManager-а

Nuzsk
@Nuzsk
Jun 25 2016 22:29
@fesor ну вот мой класс DiscountManager в конструкторе принимает цену заказа и доп данные о пользователе и его скидках, и потом проверяет каким классам скидки сосуществуют эти данные и считает скидки. Он хранит состояние?
Sergey Protko
@fesor
Jun 25 2016 22:29
.........что такое DiscountManager и зачем он нужен?)
Nuzsk
@Nuzsk
Jun 25 2016 22:29
смотри, у него тут в том и дело, что цена вычисляется чуть ли не по фазам луны
Sergey Protko
@fesor
Jun 25 2016 22:29
и причем тут продукты?)
ему нужен DiscountCalculator который не мутирует состояние а вычисляет новое

что цена вычисляется чуть ли не по фазам луны

ну зависит от бизнес логики. Если это скидки мы можем сверху НАД продуктом реализовать

продукт о скидках знать не должен
он же продукт
а так у нас будет что-то вроде
class PriceCalculator
{
     private DiscountCalculator $discount;

     public function getPrice(Product $product) {
           return $this->discount->calculate($product);
     }
}
ну пример тоже упоротый
проще всего нарисовать все объекты и прикинуть кто о чем должен знать а кто не особо
изолировать возможные изменения
Nuzsk
@Nuzsk
Jun 25 2016 22:33
по сути это то же самое, но с другой стороны
Sergey Protko
@fesor
Jun 25 2016 22:33
@Nuzsk что именно "то же самое"?)
тоже самое что забить на инверсию зависимостей?
Nuzsk
@Nuzsk
Jun 25 2016 22:35
классы менеджеры, работа с публичными пропертями других объектов...
@fesor от менеджера это только названием отличается
Sergey Protko
@fesor
Jun 25 2016 22:35
названия должны передавать что делают объекты
Nuzsk
@Nuzsk
Jun 25 2016 22:36
ну я думал что ты что-то совершенно иное предложишь )
Sergey Protko
@fesor
Jun 25 2016 22:36
ять
Nuzsk
@Nuzsk
Jun 25 2016 22:36
а это переименованный менеджер с исключением доступа к паблику
Sergey Protko
@fesor
Jun 25 2016 22:36
это один из критериев говнокода
когда ты видишь название метода/класса а он делает совсем блин не то или просто непонятно что
менеджеры - менеджат, а тебе считать надо
Nuzsk
@Nuzsk
Jun 25 2016 22:37
согласен. просто думал, у тебя возникли идеи, как это делать СОВЕРШЕННО иначе
Sergey Protko
@fesor
Jun 25 2016 22:37
менеджеры - мутируют состояния, калькуляторы - вычисляют
Nuzsk
@Nuzsk
Jun 25 2016 22:37
сложный день (c)
Sergey Protko
@fesor
Jun 25 2016 22:37
жарко просто)
ну хз как у вас а у меня жаркова-то
Nuzsk
@Nuzsk
Jun 25 2016 22:38
у нас тоже
но я оборудовался кондером и счастлив
Sergey Protko
@fesor
Jun 25 2016 22:38
сча сижу и перевожу php контейнеры на alpine линукс
клево... почистил докерфайлы
Nuzsk
@Nuzsk
Jun 25 2016 22:39
он deb?
Sergey Protko
@fesor
Jun 25 2016 22:39
неа
образы похудели на 250 метров
Anton Vorontsov
@symbios-zi
Jun 25 2016 22:59
почитал, что то понял а что то видимо придет в процессе эксплуатации. Придется в будущем реффакторить
сразу сложно все осилить и сделать идеальный код. :) приобрету опыт использования, тогда и придут идеи как организовать правильно. Пока видимо на полупроцедурном коде всё будет
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:05
@fesor что то много классов в таком случае получается. OrderController->OrderService->PriceCalculator->DiscountCalculator->Discount
Sergey Protko
@fesor
Jun 25 2016 23:05
@symbios-zi много маленьких объектов это лучше чем мало и они жирные
проще менять... ну конечно нужно еще знать что делаешь
))

OrderController->OrderService->PriceCalculator->DiscountCalculator->Discount

ну тут уже по другому

Anton Vorontsov
@symbios-zi
Jun 25 2016 23:06
@fesor это я нормальную цепочку описал? где Discount есть модель
Sergey Protko
@fesor
Jun 25 2016 23:06
OrderController -> Order -> getPrice
а внутри уже все что нужно есть, и скидосы, и еще чего
еще можно делать так
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:07
@fesor Не получается все в класс Order запихнуть. Слишком монструозно и неудобно получается. поэтому и создал OrderService
Sergey Protko
@fesor
Jun 25 2016 23:07
что бы был монструозный OrderService?)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:08
@fesor ну он запускает нужные процессы: инвентаризация, отправка письма и т.д.
Sergey Protko
@fesor
Jun 25 2016 23:08
getPrice(DiscountCalculator $discounts) {
     $price = 0;
     foreach ($this->orderItems as $orderItem) {
          $price += $orderItem->getPrice();
     }
}

инвентаризация, отправка письма и т.д.

принцип единой ответственности короч для слабаков, понимаю

Anton Vorontsov
@symbios-zi
Jun 25 2016 23:08
@fesor ага
Sergey Protko
@fesor
Jun 25 2016 23:09
ну короч ебаш как хочешь)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:09
тут наверное нет ни одного такого кто соблюдает его
Sergey Protko
@fesor
Jun 25 2016 23:09
ну я стараюсь
изредка нарушаю в угоду скорости разработки, но оно обычно там не страшно
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:09
@fesor и я пытаюсь осознать. Просто опыта не хватает :)
хотя это и оправдание, но других вариантов нет пока :)
Sergey Protko
@fesor
Jun 25 2016 23:10
я для себя сформулировал "рекомендации" по размерам объектов:
  • не более одного публичного метода на сервис
  • не более 100 строк кода на класс
ну и поскольку это рекомендации - я всего-лишь стараюсь делать поближе к ним
ну то есть у меня есть сущности по 400 строк кода например... и норм
и куча объектов по 20 строк
в среднем выходит 100
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:11
@fesor в коде выше мы посчитали прайс оригинальный. А далее как DiscountCalculator?
Sergey Protko
@fesor
Jun 25 2016 23:11
@symbios-zi тут сильно зависит от логики. Можно что бы каждый ордер айтем сам дискаунт применял
а мы тогдав ордере подсчитаем общую сумму и забьем
в целом же.... в подавляющем большинстве случаев у тебя нужный объект со скидкой уже должен быть внутри ордера
или ордер айтемов если у тебя завязано все на конкретные продукты
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:14
@fesor DiscountCalculator $discounts мы получили этот объект и вызываем его метод передав туда $price?
@fesor бизнес логика такова что я беру общую сумму заказа, получаю все общую скидку и потом ее размазываю по OrderItems в зависимости от участия в общей сумме заказа каждого айтема. Пропорционально
Sergey Protko
@fesor
Jun 25 2016 23:18
@symbios-zi ты не находишь что "размазывать" по ордер айтемам как-то не ок?
проще что бы ордер айтемы сами решали все
или для скидки важна сумма общая заказа?
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:19
@fesor важна. Основные скидки идут от общей суммы заказа.
Примеры скидок
2.5% скидка на заказы от 5 000 рублей
5% скидка на заказы от 10 000 рублей
@fesor как тогда иначе посчитать?
Sergey Protko
@fesor
Jun 25 2016 23:20
погодь, ну так у тебя скидка то одна на всех
ну мол...
ордер айтемы тут непричем
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:21
@fesor могут быть еще скидки. Назначенная менеджером из своей админской формы процент/фикс, реферальная система планируется. Купоны
вообще много вариантов )
Kirill Nesmeyanov
@SerafimArts
Jun 25 2016 23:21
о, ночные традиционные чатики с фесором...
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:21
а еще и персональная
Sergey Protko
@fesor
Jun 25 2016 23:21
купоны это вообще отдельная шляпа
у меня вот в текущем проекте купоны идут вообще как валюта)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:21
@fesor да, пока они в будущем
@fesor ну т.е. не получается считать для каждого айтема заказа скидку. верно? мой первый магазин ))) до этого я брал битрикс и делал то что он умел
Sergey Protko
@fesor
Jun 25 2016 23:23
ну хз...
но в любом случае у ордера есть вся нужная инфа
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:23
@fesor ну как бы ордер айтем незнает какие могут скидки на него подействовать. Только сам ордер может окончательно знать
Sergey Protko
@fesor
Jun 25 2016 23:23
а у ордер айтема - нет
ну тип того
вообще занятная тема со скидками
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:24
@fesor поэтому я уже по факту посчитанных скидок размазываю по ордер айтемам
@fesor очень
Sergey Protko
@fesor
Jun 25 2016 23:24
есть еще клевая штука... правила вроде
с 10:00 - 17:00 - 30% на все
отдельные товары - 15% скидос (и при этом суммарная скидка не должна привышать максимальной)
ну короч... ордер сервис для этого отстой в любом случае)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:26
@fesor еще и бонусные товары есть, которые могут быть отправлены при достижении определенной суммы заказа. А некоторые бонусы кладутся в каждый заказ.
Sergey Protko
@fesor
Jun 25 2016 23:26
да да
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:26
@fesor возможно, сделал как умел. всегда будет возможность отрефакторить - кровью и потом. Было бы что реффакторить. :)
Sergey Protko
@fesor
Jun 25 2016 23:26
эх... екоммерс интересная штука... жаль что у меня все проекты связанные с этим не такие сложные
ну мол.... там сложности чисто технические в основном
вроде оффлайн платежей)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:27
@fesor одна из самых интересных сфер имхо в вебе. но по крайней мере мне. Как то приближен к реальному миру и помогаешь бизнесу реализовывать бизнес идеи
оперируешь реальными понятиями как товары, заказы, покупатели...
@fesor я принял решение что лучше сделал OrderService и использовать его публичные методы add, update чем делать все в контроллерах. Причем дважды: в публичных контроллерах и админских. Так хотя бы код не дублирую и смогу проще и менее болезненно перенести что то в модели и другие классы
Sergey Protko
@fesor
Jun 25 2016 23:36
не ну это да)
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:39
@fesor у меня прям самооценка падает каждый раз когда ты говоришь что всё гавно и сделано неправильно :D
Sergey Protko
@fesor
Jun 25 2016 23:39
@symbios-zi что поделать)
на самом деле пофигу
только тестами покрой и тогда все прощу
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:40
@fesor планирую. ага.
@fesor думаю когда тестами буду покрывать выявятся места для реффакторинга
Sergey Protko
@fesor
Jun 25 2016 23:40
не будет у тебя времени на тесты :(
эх
ну ты просто делай так, что бы каждое твое решение можно было быстро проверить
ну мол... не фигачить код пару часов а потом проверять а кусками минут по 10-15
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:42
@fesor понял, спасибо за советы
Sergey Protko
@fesor
Jun 25 2016 23:42
ну мол так тестами проще будет покрывать
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:42
@fesor вероятно время будет. так как у меня 1 проект долгосрочный
Sergey Protko
@fesor
Jun 25 2016 23:42
дели систему так что бы было по возможности один вход и один выход
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:43
но уже после запуска видимо только будет время на тесты :(
Sergey Protko
@fesor
Jun 25 2016 23:43
ну мол что бы тесты тестировали именно черный ящик и поменьше знали о нутрянке
Anton Vorontsov
@symbios-zi
Jun 25 2016 23:43
@fesor я тебя еще помучаю когда буду их писать. еще не раз поругаешь мой гавнокод ;)
Sergey Protko
@fesor
Jun 25 2016 23:43
))
мне б мой поругал кто
он только @SerafimArts может