• Laravel как зарегистрировать свой service?

    miraage
    @miraage
    Старый прогер
    Read The Following Manual.

    // app/providers/AppServiceProvider.php
    
    use App\Services\Coupon\CreateCoupon;
    use App\Services\Notification;
    
    class AppServiceProvider
    {
      public function register()
      {
        // for regular services
        $this->app->bind(CreateCoupon::class);
    
        // for singletons
        $this->app->singleton(Notification::class);
      }
    }
    
    // app/http/controllers/CouponController
    
    use App\Services\Coupon\CreateCoupon;
    
    class CouponController
    {
      public function create(Request $request, CreateCoupon $service)
      {
        $service->create($request->input());
      }
    }


    // EDIT

    Доп ответ для Станислав Почепко

    Вот я в данный момент пишу сервис. И есть такой вопрос. Если у меня сервис зависит от объекта? Я его передаю в construct в сервис. Как в данном случае его подключать в контроллере?
    И насколько плохо, если внутри сервиса используется другой сервис? Это грубое нарушение слоёв?


    Полная свобода действий, однако не переборщите.

    1) использование вспомогательного (читай - приватного) сервиса, который нужен только этому классу
    namespace App\Services\Insurance\Ally;
    
    use App\Contracts\InsuranceProvider;
    
    class Provider implements InsuranceProvider
    {
      public function __construct()
      {
        // Api === App\Services\Insurance\Ally\Api, совпадает namespace
        // Сервис Api нужен исключительно этому провайдеру
        $this->api = new Api();
      }
    
      public function getTerms($invoice)
      {
        // получаем данные с api и отдаем их
        return $this->api->getTerms($invoice);
      }
    }


    2) использование и
    namespace App\Services\FormBuilder;
    
    // AppServiceProvider::register()
    // $this->app->bind(HtmlRenderer::class);
    use App\Services\Renderer\HtmlRenderer;
    
    class Builder
    {
      public function __construct(HtmlRenderer $renderer)
      {
        $this->inputFactory = new InputFactory();
        $this->renderer = $renderer;
        $this->inputs = [];
      }
    
      public function addInput($type, $className, $placeholder)
      {
        $this->inputs[] = $this->inputFactory->create($type, $className, $placeholder);
      }
    
      public function render()
      {
        return $this->renderer->render($this->inputs);
      }
    }


    3) service factory
    // appserviceprovider
    use App\Contracts\Renderer;
    
    public function register()
    {
      $this->app->register(Renderer::class, function ($params) {
        switch ($params['type']) {
          case 'html':
            return new HtmlRenderer();
          case 'xml':
            return new XmlRenderer();
        }
      });
    }
    
    // some service
    use App\Contracts\Renderer;
    
    class FormBuilder
    {
       public function __construct($rendererType)
      {
        $this->renderer = app()->make(Renderer::class, ['type' => $rendererType]);
      }
    }
    Ответ написан
    9 комментариев
  • Быстрый LIKE по 1 миллиону строк, как быть?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    sphinx использовать.
    или https://dadata.ru/
    Ответ написан
    6 комментариев
  • Ошибка при создании социальной авторизации?

    Denormalization
    @Denormalization
    Use of undefined constant ‘user_social_account’ - assumed '‘user_social_account’'

    Очевидно ошибка в этом. Нужно видеть код где это используется.
    Но судя по всему просто скопипастили код из статьи, а там кривые ковычки...
    Ответ написан
    7 комментариев
  • Можно ли сохранять в git папку vendor после composer update?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если одни разработчик обновил библиотеки, другие должны как то об этом узнать, чтобы обновится у себя

    Если другие разработчики делают git pull и не обращают внимания на изменения - это их проблемы. Хорошим тоном является уведомление от автора правок в composer.json, что остальным стоит его обновить.

    Список библиотек и версии обновляются не очень часто, а при каждом релизе, приходится выкачивать одни и те же либы

    Вообще говоря композер умеет в кэш и одни и те же версии либ тянутся с кэша.

    В проекте могут быть заняты люди, которые не умеют (или не могут в данный момент) работать с консолью: верстальщики, технические писатели, ревьюер кода (безопасности), сюда же и вопрос оплаты специалиста, которые умеет всё

    Если нужно именно поднять окружение с проектом - настройте vagrant и пропишите в README как им пользоваться конкретно для вашего проекта.
    Что касается людей:
    * верстальщики - vagrant
    * технические писатели - я конечно не в курсе вашего проекта, но я бы доступ даже к репозиторию не дал, максимум - завел отдельный репозиторий для них.
    * ревьюер кода (безопасности) - ревьюер, который не может в composer / консоль?? Шутка не удачная.
    * сюда же и вопрос оплаты специалиста - лолшто? Это вообще не связано с окружением вашего проекта, ну вот ни капли.

    Нет возможности просто и быстро передать кому-то код, просто расшарив ссылку на гит

    Если у вас проект НЕ opensource - то такого делать в принципе нельзя. Доступ к репозиторию должны иметь специалисты, которые работают с кодом этого проекта и ни кто другой, а composer тут вот ни капли ни при чем!

    Вопрос в том, можно ли сохранять папку vendor в git

    НЕТ! Вы придумали НЕ существующую проблему и пытаетесь героически ее решить, только от этого решения будет еще хуже.

    насколько это противоречит принятому стилю

    на полностью

    какие могут быть проблемы с этим (сейчас самый жирный минус от такого подхода вижу в распухании репозитория) ?

    1. Вы становитесь вендором кода, который взяли где-то, как следствие вы следите за его обновлением, у изначального вендора и вы проводите аналогичные правки в своем проекте. Если так не делать - баги, найденные в этой зависимости сами себя не пофиксят и этот код будет быстро устаревать.
    2. В код зависимости появляется соблаз провести собственные наработки - это то, что делать нельзя, иначе процесс обновления будет сложнее на порядки.
    3. Ваш репозиторий разбухнет.
    4. Композер вашу зависимость придется явно прописать иначе автолоад может ее не подтянуть.

    Использует ли кто-нибудь такую практику в своих проектах ?

    Пару лет назад работал на крупном проекте, который начинался до появления композера. Когда зависимостей тьма и ты не знаешь, какие из них содержат артефакты собственных наработок, какие обновляются синхронно с официальными вендорами, а какие тянутся из вне приходится тратить кучу времени на выяснение. Это просранное время.
    Ответ написан
    1 комментарий
  • Можно ли сохранять в git папку vendor после composer update?

    @aol-nnov
    > другие должны как то об этом узнать, чтобы обновится у себя
    ну, ты же гитом пользуешься, да? прям пользуешься-пользуешься?
    git fetch origin
    git diff --name-only <yourbranch>..origin/<yourbranch> -- composer.json или как он там
    Ответ написан
    7 комментариев
  • Как оформлять подтаски в GIT?

    GavriKos
    @GavriKos
    Связь задач/подзадач и веток - сугубо внутренняя политика каждой конторы/программиста. И советовать в данном случае сложно - неизвестен дальнейший воркфлоу задач/подзадач. Например, если у вас подзадача проходит отдельно тестирование - то для нее по идее нужна отдельная ветка.
    Ответ написан
    Комментировать
  • Как правильно в Laravel хранить свои собственные контроллеры и функции?

    Denormalization
    @Denormalization
    Сам Laravel использует для этих целей отдельный файл helpers.php
    Ничто не мешает создать свой похожий файл, и добавить его в autoload, тогда все эти функции будут доступны из любого места проекта.
    Ответ написан
    Комментировать
  • Как правильно в Laravel хранить свои собственные контроллеры и функции?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    То, что вы хотите сделать, не имеет никакого отношения к контроллерам.
    Это обычный класс: положите его в корень src или в любую поддиректорию (главное, чтобы namespace был корректный).
    Можно создать ServiceProvider, но в данном случае, я думаю, это overkill.
    Ответ написан
    Комментировать
  • Правильно ли я понял, как работает токен?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Да. Все верно.

    Единственное что добавлю, пересылать токен лучше в заголовках. Причем желательно, поскольку механизм аутентификации нестандартный, в заголовке X-Authorization. Если вы решите хранить токен в куках и передавать его, это желательно должны быть http-only куки (хотя в случае JWT не обязательно) и на сервере должна быть защита от CSRF атак.

    Так же поскольку у нас по сети гуляют по сути креденшелы, важно использовать SSL. Благо сегодня есть lets-encrypt что бы бесплатно получить сертификаты.

    И последнее, что бы обезопасить себя еще, используйте refresh-токены. То есть наш уникальный токен который гуляет в каждом запросе будет иметь ограничение по времени жизни (скажем 5 минут) и для его обновления мы будем использовать refresh-токен. При получении refresh токена клиенту уходит новая пара токен + refresh-токен.

    Таким образом у злоумышленника который перехватил токен пользователя будет окно всего в 5 минут что бы что-то сделать.
    Ответ написан
    13 комментариев
  • Как правильно реализовать загрузку файла в Laravel?

    Adamos
    @Adamos
    1. Шаблон с инпутом и его обвязкой (если у вас анимированная мультизагрузка - соответственно, блок, в котором будет отображаться прогресс и подключение скрипта, который все это делает).
    2. Класс, который разбирает $_FILES с определенным именем и возвращает его данные в виде массива. С опциональной проверкой опасного содержимого.

    В общем, посмотреть, какой код повторяется каждый раз, и собрать его в отдельный класс. Обычный рефакторинг, фреймворк тут - дело десятое.
    Ответ написан
    Комментировать
  • Рабочее окружение современного разработчика. Мобильное, быстроразворачиваемое, вандалоустойчивое?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    храним все важные документы в облаке, а серсы у нас и так в GIT.
    Ответ написан
    Комментировать
  • Как добавить вычисляемое поле в выборку eloquent в Laravel?

    @Kraky
    $projects = Project::with(['user' => function ($query) {
        return $query->selectRaw('users.*, CONCAT(users.f_name, users.f_name) as name');
    }])->all();
    Ответ написан
    3 комментария
  • Как усовершенствовать поиск на сайте?

    Denormalization
    @Denormalization
    Использовать специализированное решение для полнотекстового поиска: Elastic, Sphinx
    Ответ написан
    Комментировать
  • Blade(Laravel) как убрать лишние пробелы?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    @else Category Name @Endiff 
         ^             ^
    Ответ написан
    3 комментария
  • Как хранить наследуемые модели Laravel в БД?

    AmdY
    @AmdY
    PHP и прочие вебштучки
    Не надо БД и модели рассматривать как что-то совместное. Это нормальная ситуация, когда несколько моделей ссылаются на одни и те же таблицы и их колонки в зависимости от контекста поведение может быть разным. martinfowler.com/bliki/BoundedContext.html
    При этом модели не обязательно должны (но могут) наследоваться друг от друга, лучшим заменять наследование композицией, тоесть у Admin/Person/Organization будет метод который возвращает User. С учётом Eloquent самый простой и топорный способ, это связь 1-1, что-то вроде
    Admin/Person/Organization {
          function user() {  return $this->hasOne('User', 'id', 'id'); }
    }
    Ответ написан
    Комментировать
  • Laravel Socialite, провайдер Google - как получить возраст юзера?

    Ознакомьтесь с представлением ресурсов пользователя возвращаемых Google. Особое внимание обратите на ageRange.min и ageRange.max.

    На сколько я понимаю - необходимо изменить метод mapUserToObject Вашего провайдера в Socialite, извлекая дополнительную информацию. :-)

    'age' => (integer) (array_get($user, 'ageRange')['min'] + array_get($user, 'ageRange')['max']) / 2,
    Ответ написан
    1 комментарий
  • Как проверить наличие последовательности символов в строке?

    alsopub
    @alsopub
    Если не найдете подходящее регулярное выражение и если его наличие критично то вот решение "влоб":
    $password = 'acDfe5678fg';
    
    if (preg_match('/(abcd|bcde|cdef|defg|efgh|fghi|ghij|hijk|ijkl|jklm|klmn|lmno|mnop|nopq|opqr|pqrs|qrst|rstu|stuv|tuvw|uvwx|vwxy|wxyz|0123|1234|2345|3456|4567|5678|6789)/i', $password)) {
      echo('Very easy password');
    } else {
      echo('Good password');	
    }
    Ответ написан
    1 комментарий