01/10/2018, 16:00

Hỏi về function Laravel php?

em đang tìm hiểu về framework laravel của php , em thấy nó gọi function theo kiểu chaning liên tiếp
vd : response()->view()->cookie()->witherror()->header() …
em mới từ java qua nên chưa hiểu lắm làm sao mà nhiều function có thể được gọi liên tiếp như vậy được , nếu function response() trả về 1 object response thì view() sẽ trả về đối tượng gì để cookie() gọi tiếp không lẽ cũng là obj response nữa chăng @@

vì em thấy cách viết này khá hay nên muốn học hỏi nhưng không hiểu được cơ chế hoạt động ạ …

Tuan Nguyen viết 18:01 ngày 01/10/2018

Để viết được kiểu như vậy thì bạn thì tìm hiểu về builder pattern . Các helper trong Laravel trả về 1 object , từ object đó có thể gọi tiếp các method khác.

Hung viết 18:17 ngày 01/10/2018

response() helper nếu không có tham số thì trả về Illuminate\Contracts\Routing\ResponseFactory contract.

Trong ResponseFactory interface có 1 method view(), trả về kiểu \Illuminate\Http\Response

interface ResponseFactory
{
    /**
     * Return a new view response from the application.
     *
     * @param  string  $view
     * @param  array  $data
     * @param  int  $status
     * @param  array  $headers
     * @return \Illuminate\Http\Response
     */
    public function view($view, $data = [], $status = 200, array $headers = []);
}

Trong class \Illuminate\Http\Response sử dụng trait ResponseTrait ở cùng 1 namespace.

class Response extends BaseResponse
{
    use ResponseTrait, Macroable {
        Macroable::__call as macroCall;
    }
}

Trait ResponseTrait hiện thực các method cookie(), header(), riêng widthError() có thể là withException().

trait ResponseTrait
{
    public function header($key, $values, $replace = true)
    {
        $this->headers->set($key, $values, $replace);
        return $this;
    }

    public function cookie($cookie)
    {
        return call_user_func_array([$this, 'withCookie'], func_get_args());
    }

    public function withCookie($cookie)
    {
        if (is_string($cookie) && function_exists('cookie')) {
            $cookie = call_user_func_array('cookie', func_get_args());
        }
        $this->headers->setCookie($cookie);
        return $this;
    }

    public function withException(Exception $e)
    {
        $this->exception = $e;
        return $this;
    }
}

Các method của trong trail ResponseTrait đa số trả về $this, theo Builder Pattern.


Tham khảo:
Http Response - Other Response Types
\Illuminate\Contracts\Routing\ResponseFactory
\Illuminate\Http\Response
\Illuminate\Http\ResponseTrait

Bài liên quan
0