Laravel中with()和compact()之间的区别是什么?

时间:2015-02-11 20:23:57

标签: php laravel laravel-4

在这两个例子中,Laravel中的函数with()compact()之间的区别是什么:

示例1:

return View::make('books.index')->with('booksList', $booksList);

示例2:

return View::make('books.index',compact('booksList'));

2 个答案:

答案 0 :(得分:7)

compact()PHP function,它将变量列表转换为关联数组,其中键是变量名,值是该变量的实际值。

实际问题应该是:

之间有什么区别
return View::make('books.index')->with('booksList', $booksList);

return View::make('books.index', array('booksList' => $booksList));

答案并非如此。它们都会向视图数据添加项目。

语法方式,View::make()只接受一个数组,with()同时接受两个字符串:

with('booksList', $booksList);

或者一个可能包含多个变量的数组:

with(array('booksList' => $booksList, 'foo' => $bar));

这也意味着compact()也可以与with()一起使用:

return View::make('books.index')->with(compact($booksList));

答案 1 :(得分:1)

compact方法将数组数据传递给Constructor,Constructor存储到$data Class属性:

public function __construct(Factory $factory, EngineInterface $engine, $view, $path, $data = array())
    {
        $this->view = $view;
        $this->path = $path;
        $this->engine = $engine;
        $this->factory = $factory;

        $this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;
    }

虽然with()方法接受数组或字符串,但如果它是数组,它会对参数执行array_merge,否则会将数据附加到您作为参数传递给$data的键中属性,所以如果使用构造函数,则必须传递array,而with()接受带有值的单个键。

public function with($key, $value = null)
    {
        if (is_array($key))
        {
            $this->data = array_merge($this->data, $key);
        }
        else
        {
            $this->data[$key] = $value;
        }

        return $this;
    }