流明-如何创建可以由app('request')从不同文件访问的请求对象?

时间:2018-12-11 04:18:11

标签: php request lumen

我的lumen应用程序具有一个共同的特征,它记录了数据库中每个表的每个添加/更新/删除活动。此特征在基本模型中使用,然后对所有适用的表模型文件进行扩展,如下所示。

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

namespace App\Models;
class User extends BaseModel {}

直到现在,我的应用程序仅具有Angular客户端将使用的API。因此,每个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'),该特性在用作API时获得了end_point_id的值。现在,我正在编写一项工作,以对API常用的一些表执行一些批处理。现在,我将end_point_id重命名为“ event_id”,并添加了一个新列作为“ event_trigger”来保存“ API / JOB”。执行作业时,表添加/更新/删除事务将保存在audit_trails表中,其中event_trigger为'JOB',event_id为整数job_id。

由于该作业没有输入请求,因此我尝试创建一个Illuminate \ Http \ Request对象,并使用$ request-> replace(也尝试了合并方法)创建了一个名为“ event_id”的属性。这样,当尝试以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请求时出现相同的错误。

由于流明是无状态的,所以我想到的唯一选择就是通过请求对象将值从一个组件传递到另一个组件。感谢您为解决该问题提供的任何帮助。我想知道如何从可以使用另一个文件中的app('request')命令访问的作业创建请求对象。

谢谢!

1 个答案:

答案 0 :(得分:1)

为什么在没有Request上下文的情况下将其合并?我理解您为什么尝试这样做,但是在这种情况下这没有多大意义,所以我建议您使用其他方法。

我建议使用公共静态getter和setter方法将私有静态变量存储在RecordsActivity中。这样,您可以从中间件或命令中设置此变量,并在内部引用此变量(创建AuditTrail时)。这样,您就可以清楚地分离,并且在没有http上下文的情况下也不会混合http元素。这样,您就可以使AuditTrail不受上下文(http或命令)的影响,这使您的代码更好并且模块化。

如果您有任何疑问,希望对您有帮助。