Ответы пользователя по тегу Laravel
  • Как сделать аутентификацию на несколько типов пользователей в laravel5.2?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Лучше используйте проверенный Entrust.
    В нем все из коробки (роли, права ролей, и т.д.).
    Работает плотно со встроенным Auth.

    Конечно, можно все реализовать стандартными возможностями Laravel, но выйдет это в лишних 500 строк кода. И не факт, что вы напишите этот код правильно :)
    Ответ написан
    Комментировать
  • Конструкция ->with() вызывает утечку памяти в Laravel?

    wielski
    @wielski Автор вопроса
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Переписал таким образом:

    public function scopeGetCategories($query){
          $categories = clone $query;
          return $categories->joinRelations('categories')
                ->selectRaw('*, count(`product_category_values`.`product_id`) as products_count')
                ->whereNotNull('category_id')->groupBy('category_id')
                ->getCache(['product_categories.*']);
        }


    Для определения количества товаров в категории использовал selectRaw.
    Соответственно, вместо подсчета связей сразу беру значение products_count.

    Результат, как говорится, на лицо. Потребление памяти в районе нормы.
    5f9cb85d591641fd934c318dd0708e6d.png
    Ответ написан
    4 комментария
  • Form multiple, если при submit оставить поле пустым, то вываливается ошибка, кто подскажет почему?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    if($request->hasFile('cover')){
     //тут обрабатывай файл
    }


    Если файлов много - name инпута все равно должен быть cover (а не cover[]).
    Обработка нескольких файлов в Laravel:
    if($request->hasFile('cover')){
      foreach($request->file('cover') as $file){
        // $file
      }
    }
    Ответ написан
  • Как формировать URL в laravel используя Laravel Localization?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Вы уверены что задали роуту верное имя?

    Route::get('/route', ['as' => 'news.index', 'uses' => 'NewsController@index', 'middleware' => ['web']]);
    Ответ написан
  • Laravel условия для выборки with?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    $users = User::with(['posts' => function($query)
    {
        $query->where('title', 'like', '%первое%');
    },
    'foo',
    'bar' => function($query){
        // bar query
    }])->get();


    Передавайте как элементы массива.
    Думаю вам так же подойдет whereHas:

    Category::with('params.values')->whereHas('params', function($query){
       $query->where('something', 'foobar');
    })->get();
    Ответ написан
    4 комментария
  • Как вызвать функцию с Request из под контроллера?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    public function get(Request $request)
    Уберите Request $request, ибо он у вас нигде не используется.
    Если используется - принимайте его в index(), и передавайте экземпляр в функцию get.
    Если же нет возможности получать его в index(), а в get() он обязателен - создавайте новый экземпляр класса Request, заполняйте его нужными либо фиктивными данными, и передавайте.

    Вариантов куча. Все зависит от реализации и вашего кода.
    Если части кода в вопросе не фиктивные, а реальные - первый вариант вам подойдет. Убирайте Request.
    Ответ написан
  • Какая часть приложения ответственная за фильтрацию входных данных?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Что именно вы имеете в виду под термином "менеджер"? Такого понятия в Laravel ни разу не встречал.

    Laravel основан на архитектуре MVC. Расшифровка - Model View Controller.
    Логика по работе с данными такова:

    В view выводим все данные, и форму для заполнения данных.
    View отправляет POST запрос, route обрабатывает его, Request получает, контроллер обрабатывает валидацию.
    Если проблем нет - контроллер формирует запрос к модели (создавая новый объект), подстраивая входящие данные так, как нужно.

    Как только данные сохранены - мы выводим их на нужной странице из модели.
    В модели кроме связи с БД настраиваются связи (hasOne/Many, belongsToMany, полиморфические связи), назначаются scope функции (функции для обработки и приведения в порядок данных из модели), и на этом собственно все.

    Конечно же, модель играет чуть большую роль при использовании различного рода пакетов (slugable, sortable, searchable, и т.д.) - но основная функция связь с БД, и формирование данных для view.
    Ответ написан
    3 комментария
  • Как сделать мультиязычный сайт на laravel 5?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Как правильно реализовать локализацию БД в laravel?
    Вот про локализацию БД.

    https://laravel.ru/docs/v5/localization
    Вот про локализацию самого сайта (строк).
    Ответ написан
  • Ошибка JavaScript в PhpMyAdmin?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Обновите phpmyadmin.
    Попробуйте сменить язык на Английский - обычно такая проблема возникает из-за локализации.
    Вроде бы в последних версиях решено.
    Ответ написан
    Комментировать
  • Как правильно реализовать локализацию БД в laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    На мой взгляд использование пакетов для этой цели нецелесообразно.
    Обычная полиморфическая связь подойдет.

    И так, давайте представим что основной контент статьи на русском языке.
    Во первых, создадим модель нашей локализации:
    php artisan make:model Localization

    Укажем что это полиморфическая связь:
    protected $table = 'localization';
    
    public function lozalizable()
      {
          return $this->morphTo();
      }


    В нашей модели статей привяжем свежесозданную модель в качестве связи:
    public function lozalization(){
    	    return $this->morphOne('App\Localization', 'lozalizable');
    	}


    И создадим миграцию для модели Lozalizable:
    Schema::create('localization', function (Blueprint $table) {
            $table->increments('id');
            $table->string('field');
            $table->string('language');
            $table->string('value');
            $table->string('lozalizable_type');
            $table->integer('lozalizable_id');
            $table->timestamps();
          });


    Теперь, для создания локализации статьи с языком en выполним следующий код:
    $article = Article::create($Atricle);
    
    $localization = new Localization;
    $localization->language = 'en';
    $localization->field = 'content';
    $localization->value = 'Znachenye na english yazike';
    $article->localization()->save($localization); //привязываем к свежесозданному объекту Article новую локализацию


    С помощью scope функций в модели можно без особых проблем реализовать более удобное выдергивание нужного значения и языка:
    public function scopeGetLocalize($language, $field){
         return $this->localization()->where(['language' => $language, 'field' => $field])-> firstOrFail()->value;
    }


    В таком случае, скажем, поле title для локализации en можно выдергивать так:
    $article->getLocalize('en', 'title')
    Ответ написан
    19 комментариев
  • Как узнать тип объекта в полиморфической связи?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    К примеру, модель ваших картинок:
    class Image extends Model
    {
        public function imageable()
        {
            return $this->morphTo();
        }
    }


    И какой-то пост с картинками:
    class Post extends Model
    {
        public function images()
        {
            return $this->morphMany('App\Image', 'imageable');
        }
    }


    В таком случае в таблице связей тип ссылаемого объекта (скажем, App\Post) будет в ячейке imageable_type.

    В данный момент не могу проверить, но логично предположить, что такая связка - то, что вам нужно:
    class Post extends Model
    {
        public function images()
        {
            return $this->morphMany('App\Image', 'imageable')->withPivot('imageable_type');
        }
    }


    public function getNameAttribute() {
        switch($this->pivot->imageable_type){
            case 'App\Post':
                // что вы хотите сделать с $this->name если тип - App\Post
            break;
        }
    }
    Ответ написан
  • Как реализовать прослушивание событий или каким вообще образом решить задачу?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Ивенты.

    В helpers.php у меня такой код:
    function listen($event, $fire){
      Event::listen($event, $fire);
    }


    Там где код должен исполняться:
    event('entity.news.add');

    При каком-либо условии создаем для этого event листенер:
    listen('entity.news.add', function(){
       //тут код
    });

    Учтите, что для одного события (event) может быть создан 1 и более listen.
    Ответ написан
    Комментировать
  • Как вставить яндекс метрику в Laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Может быть, в view?
    Зачем писать что-то на ларавеле, если вы не понимаете куда вставлять банальный javascript код?
    Ответ написан
    2 комментария
  • Как корректно вернуть 404 код вместе со вьюхой?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Не знаю что у вас там не получается, но не надо разводить говнокод хелперами и прочей ересью.
    return response(view('test'), 404);
    Все решается одной строкой.
    Ответ написан
    Комментировать
  • Laravel 5 почему не работает авторизация?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Насколько я понял вы используете Laravel 5.2
    В последней версии надо подключать к роутам middleware web, чтобы работали сессии, CSRF проверка (на что и ругается), и прочее.

    Route::group(['middleware' => ['web']], function () {
        // тут храните все ваши роуты, которым нужны формы (GET, POST)
    });


    UPD: Чтобы не было в дальнейшем проблем просто выполните команду php artisan make:auth
    Ларавел сам создаст все роуты, view, и подключит все правильно.
    Ответ написан
    Комментировать
  • Стоит заморачиваться с ролями?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Ставьте Entrust, максимально удобно настраиваемый, и гибкий.
    Ответ написан
    Комментировать
  • Laravel / Blade - как экранировать только часть?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    {!! isset($name) ? htmlspecialchars($name) : '<span class="class-a">без имени</span>' !!}

    Не Laravel-стайл, но все-же.
    Либо условием, но так кода больше.
    Ответ написан
    Комментировать
  • Почему авторизация удаляется после перезагрузки?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Давайте разберемся поподробнее.
    И так, у вас в каком-либо контроллере примерно такой код:

    if(Auth::attempt([
      'username' => $request->login,
      'password' => $request->password
    ], $request->remember)){
      return ['message' => 'success'];
    }
    return ['message' => 'error'];


    Вы передаете с помощью post данной функции токен, логин, и пароль.
    После чего сверяете, и если message -равно success, то перезагружаете страницу.
    В данном случае при перезагрузке пользователь так и остается неавторизован?
    Ответ написан
  • Как настроить XAMPP под laravel 5.1?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Ларавел ориентирован на nginx
    Если хотите апач - закиньте файл .htaccess из папки public в корень, и переименуйте server.php в index.php
    Но это колхозное решение.
    Ответ написан
    2 комментария
  • Как сделать вход по логину и email Laravel 5.2?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Во первых, при валидации сделайте поле имени пользователя обязательным, и латиницей. Думаю, это логично.
    Далее, в AuthController добавьте функцию:

    public function postLogin(Request $request)
        {
            $this->validate($request, [
                $this->loginUsername() => 'required', 'password' => 'required',
            ]);
    
            // If the class is using the ThrottlesLogins trait, we can automatically throttle
            // the login attempts for this application. We'll key this by the username and
            // the IP address of the client making these requests into this application.
            $throttles = $this->isUsingThrottlesLoginsTrait();
    
            if ($throttles && $this->hasTooManyLoginAttempts($request)) {
                return $this->sendLockoutResponse($request);
            }
    
            $credentials = $this->getCredentials($request);
            $login = $request->input($this->loginUsername());
            $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email':'username';
    
            $request->merge([$field => $login]);
            $credentials = $request->only($field, 'password');
    
            if (Auth::attempt($credentials, $request->has('remember'))) {
                return $this->handleUserWasAuthenticated($request, $throttles);
            }
    
            // If the login attempt was unsuccessful we will increment the number of attempts
            // to login and redirect the user back to the login form. Of course, when this
            // user surpasses their maximum number of attempts they will get locked out.
            if ($throttles) {
                $this->incrementLoginAttempts($request);
            }
    
            return redirect($this->loginPath())
                ->withInput($request->only($this->loginUsername(), 'remember'))
                ->withErrors([
                    $this->loginUsername() => $this->getFailedLoginMessage(),
                ]);
        }


    UPD: Сделал более актуальный и правильный вариант благодаря ответу JhaoDa
    Ответ написан
    Комментировать