phplaravelapi

How to pass custom request to Api Resource


I have custom Request class:

class ApiRequest extends FormRequest
{
    ...
    public function locale()
    {
        $lang = $this->header('Accept-Language');
        return $lang ? $lang : 'uz';
    }
}

and API recourse:

class SomeResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            ...
        ];
    }
}

but I can't use ApiRequest's method locale() in SomeResource. Because toArray() accepts only \Illuminate\Http\Request.

Is there any idea that I pass my class into this? Or a better solution from you.


Solution

  • I created a base Resource class, that all my other resource classes extend it with my custom method:

    class BaseResource extends JsonResource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return array
         */
        public function toArray($request)
        {
            return parent::toArray($request);
        }
    
        protected function locale($request)
        {
            $lang = $request->header('Accept-Language');
            return $lang ? $lang : 'uz';
        }
    }
    

    and I use it in child class:

    class SomeResource extends BaseResource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return array
         */
        public function toArray($request)
        {
            $lang = $this->locale($request);
    
            return [
                'id' => $this->id,
                'hash' => $this->hash,
                'name'  => $this->translation('name', $this->locale($request)),
                'created_at' => $this->created_at,
                'updated_at' => $this->updated_at,
            ];
        }
    }