【问题标题】:Service provider doesn't run on ajax服务提供者不在 ajax 上运行
【发布时间】:2016-03-09 02:52:30
【问题描述】:

我在服务提供商中有以下内容:

protected $defer = false;

public function register() {
    $this->app->singleton('User', function ($app) {
        $user = new User();
        $user->setUser(Auth::user() ? Auth::user() : null);
        dd($user);
        return $user;
    });
}

如您所见,我有一个dd() 调用,每当我加载页面时,它都会转储传递给它的数据。

我在页面上有一个 ajax 请求,当我发出 ajax 请求时,dd() 甚至没有运行。

所以:

a) 服务提供者在什么时候运行?

b) 我可以做些什么来解决我的问题?

编辑

我这样创建一个新用户:

public function UserService() {
    $this->app->singleton('User', function ($app) {
        return new User();
    });
}

然后在我的用户服务中,我有这个:

public function __construct(UserModel $user = null){
    if($user === null){
        $this->user = Auth::user();
    }else{
        $this->user = $user;
    }
}
public function getUserId(){
    dd($this->user);
    return isset($this->user->id) ? $this->user->id : null;
}

public function getAcesseId(){
    return isset($this->user->acesse_id) ? $this->user->acesse_id : null;
}

这是页面加载的结果:

UserModel {#261
  #rules: array:1 [
    "player_tag" => "required|min:3|max:15|regex:/^(?=.*[a-zA-Z]).+$/|regex:/^[a-zA-Z0-9_]+$/"
  ]
  #table: "users"
  #fillable: array:1 [
    0 => "player_tag"
  ]
  #hidden: array:1 [
    0 => "remember_token"
  ]
  #errors: null
  #connection: null
  #primaryKey: "id"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:6 [
    "id" => 1
    "acesse_id" => 108649
    "player_tag" => "TheColorRed"
    "remember_token" => null
    "created_at" => "2016-03-08 11:31:02"
    "updated_at" => "2016-03-08 11:31:02"
  ]
  #original: array:6 [
    "id" => 1
    "acesse_id" => 108649
    "player_tag" => "TheColorRed"
    "remember_token" => null
    "created_at" => "2016-03-08 11:31:02"
    "updated_at" => "2016-03-08 11:31:02"
  ]
  #relations: []
  #visible: []
  #appends: []
  #guarded: array:1 [
    0 => "*"
  ]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: true
  +wasRecentlyCreated: false
}

这是来自同一页面的 ajax 请求的结果:

UserModel {#254
  #rules: array:1 [
    "player_tag" => "required|min:3|max:15|regex:/^(?=.*[a-zA-Z]).+$/|regex:/^[a-zA-Z0-9_]+$/"
  ]
  #table: "users"
  #fillable: array:1 [
    0 => "player_tag"
  ]
  #hidden: array:1 [
    0 => "remember_token"
  ]
  #errors: null
  #connection: null
  #primaryKey: "id"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: []
  #original: []
  #relations: []
  #visible: []
  #appends: []
  #guarded: array:1 [
    0 => "*"
  ]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: false
  +wasRecentlyCreated: false
}

由于某种原因,转储不包含正确的信息。用户属性在哪里?

这里是 AJAX 请求的控制器:

use App\Services\User;

public function UploadAvatar(User $user){
    $userid = $user->getAcesseId();
    if($userid > 0){
        $md5  = md5($userid);
        $disk = Storage::disk('avatars');

        $file = $md5 . '.png';

        $image = new Imagick();
        $image->readImageBlob(file_get_contents($_FILES['file']['tmp_name']));
        $image->setImageFormat('png');

        $disk->getDriver()->put('tmp/' . $file, $image->getImageBlob(), [
            'visibility' => 'public'
        ]);
        return response()->json(env('URL_AVATARS_TMP') . $file);
    }
    return response()->json(['error' => 'Invalid User'], 500);
}

以下行是返回的内容:

return response()->json(['error' => 'Invalid User'], 500);

【问题讨论】:

  • 您是否有某种 ajax 中间件出现故障或重定向到其他地方?没有理由仅仅因为请求是通过 ajax 发出的而不运行。

标签: php laravel


【解决方案1】:

如果您的服务提供者被添加到config/app.php 中的providers 列表中,那么它将在内核引导过程中的每个请求上自动加载,该过程在处理请求之前执行。因此,register 方法会在每个请求上执行,无论它是否是 AJAX 请求。

另一方面,单例闭包中的代码只会在您第一次需要单例实例时执行,因此当您通过容器创建实例时:

$user = app('User');

只有这样才会创建单例实例并执行您的dd 函数调用,注册绑定时默认不会创建它。所以我猜你的 AJAX 调用没有执行任何请求该实例的代码。


话虽如此,从您的单例代码中,我假设您正在尝试缓存登录的 User 模型实例(可能是为了避免在访问期间从多个位置访问用户详细信息时对数据库进行额外查询相同的请求)。

如果是这样,那么它是多余的,因为 Laravel 的 Illuminate\Auth\SessionGuardis already caching the user instance 在第一次从数据库中获取详细信息之后。使用诸如Laravel DebugBar 之类的包会显示每个请求只运行一个查询来获取经过身份验证的用户详细信息,无论您在请求期间调用了多少次Auth::user()

【讨论】:

  • 很高兴能帮上忙 :)。
  • 好的,所以我修改了我的提供者,我的用户服务请查看我的修改
  • 能否请您包括为该 AJAX 请求执行的代码。我看到您可以选择将用户模型实例注入用户服务类,您是否有机会将新实例(可能是新实例/空白)传递给服务,从而避免构造函数使用身份验证系统提供的用户实例?这意味着该行将被执行$this->user = $user; 并且注入的$user 可能只包含一个新的未填充实例。
  • 好的,我已经为那个请求添加了 PHP 控制器
  • 如果您在控制器中的此行$userid = $user->getAcesseId(); 之前添加转储调用dd(Auth::user());,它是否会为经过身份验证的用户输出预期的用户详细信息?我正在尝试确定会话是否对于所有请求都是一致的。
猜你喜欢
  • 2020-12-21
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多