Lumen - Как создать объект запроса, к которому приложение («запрос») может получить доступ из другого файла? - PullRequest
0 голосов
/ 11 декабря 2018

У моего приложения lumen есть общая черта, которая записывает каждое действие добавления / обновления / удаления каждой таблицы в базе данных.Эта черта используется в базовой модели, которая затем расширяется для всех применимых файлов моделей таблиц, как показано ниже.

namespace App\Models;
class BaseModel extends Model {
   use RecordsActivity; //this is the common trait
}

namespace App\Models;
class User extends BaseModel {}

До даты у моего приложения были только API, которые будут использоваться клиентом Angular.Итак, каждая конечная точка API поставляется с запросом, в котором я буду хранить свойство в промежуточном программном обеспечении как end_point_id (динамический для каждого вызова API).Этот end_point_id будет сохранен как часть записи транзакции добавления / обновления / удаления, чтобы связать транзакции с транзакцией конечной точки, как показано ниже.

namespace App\Http\Middleware;
class APIMiddleware {
   //check and do some process
   $request->merge(['end_point_id' => $end_point_id]);
}

namespace App\Http\Traits;
trait RecordsActivity {
   //other preparation statements
   AuditTrail::create([
      "end_point_id" => app('request')->end_point_id,
      'table_name' => $model->getTable(),
      'object_id' => $model->id,
      'field_name' => $field_name,
      'old_value' => $old_value,
      'new_value' => $new_value,
      'event_timestamp' => $model->updated_at]);
}

При ссылке на app ('request') признак получал значениеend_point_id при использовании в качестве API.Сейчас я пишу задание для выполнения некоторого пакетного процесса на нескольких таблицах, обычно используемых API.Теперь я переименовал end_point_id в «event_id» и добавил новый столбец «event_trigger» для хранения «API / JOB».Когда задание будет выполнено, таблица добавления / обновления / удаления транзакций будет сохранена в таблице audit_trails с event_trigger как «JOB» и event_id как целое число job_id.

Поскольку у задания нет входного запроса, я попытался создать объект Illuminate \ Http \ Request и включил свойство с именем 'event_id', используя $ request-> replace (также пробовал метод слияния).При этом вновь включенное свойство становится недоступным при попытке его использовать как app ('request') -> event_id.Ниже приведена информация о печатном журнале.

TestJob.php 
namespace App\Console\Commands;
class TestJob extends Command {

   public function handle() {
     $request = new \Illuminate\Http\Request;
     $request->replace(['event_id' => 11]);
     Log::info(print_r($request->all(), true));
     //prints output as Array
     //(
     //     [event_id] => 11
     //)
     Log::info(print_r(app('request')->all(),true));
     //prints output as Array
     //(
     //)
    }
}

Поскольку app('request')->all() печатает пустой массив, при любом обновлении таблицы признак завершается ошибкой, так как значение event_id отсутствует.

Я попытался создать $request = new \Request(), он не удался, так как

"вызов неопределенного метода replace ()";

то же самое для merge() тоже,Та же ошибка при попытке создать запрос Guzzle.

Поскольку lumen не имеет состояния, передача значения от одного компонента другому через объект запроса была единственной возможностью, которая пришла мне в голову.Любая помощь в решении проблемы приветствуется.Я хотел бы знать, как создать объект запроса из задания, которое будет доступно с помощью команды app ('request') из другого файла.

Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Зачем вам объединять его в сценарии, где нет Request контекста?Я понимаю, почему вы пытаетесь это сделать, но в этом сценарии это не имеет особого смысла, поэтому я рекомендовал бы использовать альтернативный подход.

Что я бы порекомендовал, так это хранить частную статическую переменную в RecordsActivity собщедоступный статический метод получения и установки.Таким образом, вы можете установить эту переменную либо из промежуточного программного обеспечения, либо из команды и ссылаться на нее внутренне (когда вы создаете AuditTrail).Делая это, вы получаете четкое разделение и не смешиваете элементы http, когда нет контекста http.Делая это, вы делаете AuditTrail независимым от контекста (http или команды), что делает ваш код намного лучше и модульным.

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

...