【问题标题】:Call to a member function createData() on null using middleware on Laravel Transformers使用 Laravel Transformers 上的中间件在 null 上调用成员函数 createData()
【发布时间】:2019-08-12 05:16:16
【问题描述】:

所以我创建了一个控制器,用于使用 2 种方法 (token() / native)_) 进行身份验证。我使用分形变压器返回响应。令牌方法对我来说很好,但 loginAndroid() 返回

“在 null 时调用成员函数 createData()”错误。

有什么帮助吗?谢谢。

class AuthController extends RestController
{
    protected $transformer = UserTransformers::Class;

    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login', 'loginAndroid']]);
    }

    public function login(Request $request)
    {
        $credentials = $request->only(['username', 'password']);

        if (!$token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    public function loginAndroid(Request $request)
    {
        $credentials = $request->only(['username', 'password']);

        if (Auth::attempt($credentials)) {
            //$user = Auth::user()->with(['employees']);
            $userdata = User::with(['employees', 'employees.role', 'employees.branch'])->find(Auth::id());
            //$success['token'] =  $user->createToken('MyApp')->accessToken; 
            //return response()->json($userdata, 200); 
            //return $userdata;
            $response = $this->generateItem($userdata);

            return $this->sendResponse($response, 201);
        } else {
            return response()->json('gagal', 401);
        }
    }
}

这是我的休息控制器

abstract class RestController extends Controller
{
protected $manager;

protected $transformer;

public function __construct()
{
    $this->manager = new Manager();
}

protected function generateItem($model, $transformer = null)
{
    if (!is_null($transformer)) {
        return new Item($model, new $transformer);
    }

    return new Item($model, new $this->transformer);
}

protected function generateCollection($model, $transformer = null)
{
    if (!is_null($transformer)) {
        return new Collection($model, new $transformer);
    }

    return new Collection($model, new $this->transformer);
}

protected function sendResponse(ResourceInterface $data, $status = 200)
{
    return response()->json(
        $this->manager->createData($data)->toArray(),
        $status
    );
}

protected function sendNotFoundResponse($status)
{
    return response()->json($status, 404);
}

protected function sendIseResponse($status)
{
    return response()->json($status, 500);
}
}

【问题讨论】:

    标签: php laravel eloquent transformer


    【解决方案1】:

    看起来您的sendResponse() 方法依赖于$this->manager。但是,$this->manager 被设置在 RestController::__construct() 中,并且您已经覆盖了 AuthController::__construct() 中的 __construct() 方法。因此,为了使$this->manager 可用,您应该从 AuthController 调用父构造函数,如下所示:

    class AuthController extends RestController
    {
        protected $transformer = UserTransformers::Class;
    
        public function __construct()
        {
            parent::__construct(); // call the parent constructor where
                                   //  $this->manager gets initialized
            $this->middleware('auth:api', ['except' => ['login', 'loginAndroid']]);
        }
    
    ... etc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2016-09-04
      • 2016-06-29
      • 2018-04-03
      相关资源
      最近更新 更多