Задать вопрос
  • Какие англоязычные аналоги «Хабрахабра» существуют?

    icc
    @icc
    по программированию очень хороший ресурс www.codeproject.com/
    Ответ написан
    Комментировать
  • Какие англоязычные аналоги «Хабрахабра» существуют?

    3ds
    @3ds
    Больше по веб и дизайну но все таки smashingmagazine.com
    Ответ написан
    Комментировать
  • Как правильно использовать middleware в Laravel?

    @grinat
    Нет. Хз в ларавел, но если там mvc, то данные запроса обратываются в контроллере, а middlaware там будет тем что стоит перед твоей обработкой в контролере. То есть например авторизация, мы в middlaware проверяем авторизован ли пользователь, если да, то передаем данные дальше на обработку в контролер. На практике их есть смысл заюзать если например пришел аналитик и сказал что если мы обрабатываем овощ, то надо выводить человеку сообщение: ты помидор, а у тебя куча контролер: картофанконтрлер, капустаконтролер, луккнотролер и т.п., и ты вместо того чтобы в них все вставлять сообщение ты помидор, добавляешь middlaware и в нем смотришь овощ ли это, и если да, то выводишь сообщение ты помидор.
    Ответ написан
    Комментировать
  • Как правильно реализовать авторизацию пользователя в Laravel?

    @jazzus
    Создаете промежуточные таблицы
    user_roles с ключами user_id role_id для связи ролей с юзерами
    role_perms с role_id perm_id для связи ролей с правилами

    Отношение в user на role
    public function roles() {
      return $this->belongsToMany('App\Models\Role', 'user_roles', 'user_id', 'role_id')
                    ->withPivot('active');
    }

    В role на perm
    public function perms() {
     return $this->belongsToMany('App\Models\Perm', 'role_perms', 'role_id', 'perm_id');
    }

    Добавляете необходимые правила в perm (таблица id name) типа
    CREATE_PROJECT
    Разрешение для создания проектов.

    Пишете проверку правил в модели user. Метод перебирает роли и правила ролей. Если находит передаваемое из провайдера правило, возвращает тру.
    public function hasPerm($perm_id) {
          foreach ($this->roles as $role) {
            foreach ($role->perms as $perm) {
              if ($perm_id==$perm->id) {
                return true; }}}
        }

    Добавляете в AuthServiceProvider.php в boot. Проверка делается по названию правила (напр. CREATE_PROJECT). Поиск по id в методе hasPerm
    $perms = Perm::get();
    foreach ($perms as $perm) {
       Gate::define($perm->name, function($user) use($perm) {
       return $user->hasPerm($perm->id);
       });
    }

    Заранее связываете правила и роли через attach
    При регистрации (или в другой момент например руками в админке) через attach назначаете роль юзеру.

    В итоге.
    В blade шаблонах можете ограничивать доступ к любым элементам через директиву can
    @can ('CREATE_PROJECT')
    <input type="button" value="Создать проект">
    @endcan

    В контроллерах доступ к методам через Gate
    public function store (ProjectRequest $request) {
        //доступ к методу
        if (Gate::denies('CREATE_PROJECT')) {
               abort(404);
         }
    }

    Создаете Middleware для ограничения доступа к роутам. Там проверка
    if($user->hasRole($roleId)){
       return $next($request);
    }
    return redirect('/');

    Если у юзера есть роль то пускает дальше, если нет то редирект на главную. Метод hasRole возвращает true/false в user, проверяя есть ли у юзера роль.
    public function hasRole($id) {
        return $this->roles->contains('id',$id);
    }
    Ответ написан
    Комментировать
  • Как правильно использовать middleware в Laravel?

    @jazzus
    Валидация полей форм
    Создаешь форму.
    Создаешь Реквест файл.
    Прописываешь там правила и сообщения.
    Подключаешь в контроллере, в метод куда идет пост-запрос и данный файл будет валидировать поля.
    Middleware не валидирует поля. Используют, чтобы фильтровать запросы. Например, разрешить доступ к определенным роутам только пользователям, которые отвечают условиям. Плюс провести действия в процессе проверки. Например, заблокированных разлогинить и редирекнуть на главную.
    Ответ написан
    Комментировать