Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Pthreads, Laravel Commands и Closure. Помогите найти решение » 13.10.2016 12:09:40

Я знал, что получу такой ответ. Ничего нового.
А что вы можете предложить с решением вопроса?

Мне не подходит реализация этой задачи на очередях.

#2 Laravel 5.x » Pthreads, Laravel Commands и Closure. Помогите найти решение » 13.10.2016 11:48:53

Nik_Gubin
Ответов: 5

Добрый день, товарищи.

Есть необходимость выполнить определённый процесс в несколько потоков. Открыл для себя расширение для php - pthreads.
На примере простого скрипта вне Laravel всё работает замечательно и мне очень понравились результаты. Решил перенести в Laravel и столкнулся с проблемой. Конечно же я поискал в сети, отыскал несколько вопросов на stackoverflow, где отвечал сам автор расширения. Но мне не помогли его ответы, потому я прошу вас помочь мне.

Вопрос с ответом автора расширения.

Есть класс App\Commands\QuestionsParserCommand. Внутри я создаю экземпляр класса App\My\Questions\QuestionsParser и вызываю метод init. Дальше код метода init():

// Создадим пул
$pool = new Pool($this->threads, ParserWorkers::class);

// Создадим класс потока
$thread = new class extends Threaded
{
  public function run()
  {
    // Класс будет получать определённые данные из некого провайдера, который будет распределяться между потоками через ParserWorkers
    // Работать с API и сохранять данные в БД.
    // Необходима работа с потоками, ибо данных для обработки невероятно много

    echo '+';
  }
};

// Запустим потоки
for ($i = 0; $i < $this->threads; $i++) {
  $pool->submit($thread);
}

$pool->shutdown();

Класс ParserWorkers наследуется от Worker и пока имеет пустой метод run().

В итоге я запускаю сценарий и получаю в логах сообщение:
[13-Oct-2016 11:27:35 Europe/Moscow] PHP Fatal error:  Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0
Stack trace:
#0 {main}
  thrown in [no active file] on line 0

Сведения:
Laravel 5.2.43, php 7.0.8, Windows

#3 Re: Laravel 5.x » И вновь авторизация... » 28.08.2016 17:38:57

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

#4 Re: Laravel 5.x » И вновь авторизация... » 27.08.2016 22:18:40

Alex_01 пишет:

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

Галочку вам за отписку :-) Видимо и читать не читали вовсе.
Я где-то написал, что сделал идеально? Нет, вы конечно самый мудрый и умный, родились с познаниями Laravel, но я сразу спросил помощи, а не похвалы своего кода.
P.S. Guard'ы так то и используются. Не видно? Жаль вас, что вы такой внимательный.

#5 Laravel 5.x » И вновь авторизация... » 26.08.2016 16:42:49

Nik_Gubin
Ответов: 3

Добрый день. Хочу вынести на суд свой велокостыль, собранный на 4 день изучения Laravel, и попросить разъяснить некоторые моменты…

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

Я не использовал модель стандартную, ибо предпочитаю видеть свои запросы и строить их (в идеале) самостоятельно.

Создал свой контроллер с методом login:

PHP
function login(Request $request)
{
  if (
Auth::attempt([
    
'username' => $request->get('username'),
    
'password' => $request->get('password')
  ], 
false)) {
    
$userID Auth::id();

    
// проверим на наличие бана
    // (через метод с запросом в своей модели)
    // если есть бан - сообщаем пользователю об этом и logout'им
    // если нет бана - редиректим дальше

    
return Redirect::route('site::cabinet::main');
  }

  
// возвращаем к форме авторизации
  // говорим, что логин\пароль указаны неверно
}

Метод, собственно, авторизует нашего пользователя (именно пользователя, но у админов по аналогии в отдельном контроллере)

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

PHP
public function handle($requestClosure $next$guard null)
{
  if (
Auth::guard($guard)->guest()) {
    switch (
$guard) {
      case 
'adm' :
        
$route 'admin::auth::login';
        break;

      default :
        
$route 'site::cabinet::login';
        break;
    }

    return 
redirect()->route($route);
  }

  return 
$next($request);
}

Для проверки статуса гостя, чтобы выгонять с маршрутов для авторизации, так же сделал общего посредника CheckNotAuth, похожего на стандартного:

PHP
public function handle($requestClosure $next$guard null)
{
  if (
Auth::guard($guard)->check()) {
    switch (
$guard) {
      case 
'adm' :
        
$route 'admin::main';
        break;

      default :
        
$route 'site::cabinet::main';
        break;
    }

    return 
redirect()->route($route);
  }

  return 
$next($request);
}

И ещё один посредник LoadUser, которого я использую для загрузки пользователя (авторизованного) из базы и для обновления времени последнего визита:

PHP
public function handle($requestClosure $next$guard null)
{
  if (
Auth::guard($guard)->check()) {
    switch (
$guard) {
      case 
'adm' :
        
$sql "update admins set updated_at = ? where id = ?";
        break;

      default :
        
$sql "update users set updated_at = ? where id = ?";
        break;
    }

    
DB::update($sql, [new Carbon(), Auth::id()]);
  }

  return 
$next($request);
}

Далее я добавил в Kernel, всё по стандарту. В нужных маршрутах указал посредников для проверки пользователя\гостя, и для групп маршрутов для админской области и для пользовательской добавил по посреднику LoadUser (со своим guard)

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

К примеру меня очень интересует, если использовать стандартную модель пользовательскую, можно ли её перенести в свою директорию, можно ли избежать Active Record? На каком этапе она подгрузит пользователя в окружение и когда Laravel обновляет updated_at, задействовав метод touch()? Вопросов много, на самом деле, и в основном они про авторизацию, остальное более-менее понятно.

Подвал раздела