CakePHP clarification on using set() and compact() together. Will only work w/ compact()

36,839

Solution 1

According to the CakePHP API:

Parameters:

mixed $one required

A string or an array of data.

mixed $two optional NULL

Value in case $one is a string (which then works as the key). Unused if $one is an associative array, otherwise serves as the values to $one's keys.

The compact function returns an associative array, built by taking the names specified in the input array, using them as keys, and taking the values of the variables referenced by those names and making those the values. For example:

$fred = 'Fred Flinstone';
$barney = 'Barney Rubble';
$names = compact('fred', 'barney');

// $names == array('fred' => 'Fred Flinstone', 'barney' => 'Barney Rubble')

So when you use compact in conjunction with set, you're using the single parameter form of the set function, by passing it an associative array of key-value pairs.

If you just have one variable you want to set on the view, and you want to use the single parameter form, you must invoke set in the same way:

$variable_to_pass = 'Fred';
$this->set(compact('variable_to_pass'));

Otherwise, the two parameter form of set can be used:

$variable_to_pass = 'Fred';
$this->set('variable_to_pass', $variable_to_pass);

Both achieve the same thing.

Solution 2

Compact returns an array. So, apparently set is checking it's parameters and if it's an array. It knows that it's from compact. If not it expects another parameter, the value of variable.

Share:
36,839

Related videos on Youtube

OldWest
Author by

OldWest

Updated on July 09, 2022

Comments

  • OldWest
    OldWest almost 2 years

    I know compact() is a standard php function. And set() is a cake-specific method.

    I am running a simple test of passing a value to a view generated with ajax (user render() in my controller), and it only passes the value from the controller to the view if my setup is like so:

    $variable_name_to_pass = "Passing to the view using set() can compact()";
    
    $this->set(compact('variable_name_to_pass'));
    

    From reading the manual, it appears set() should work along w/out compact.

    Can anyone explain why set() will not work alone? Like

    $this->set('variable_name_to_pass');
    
  • OldWest
    OldWest about 13 years
    Tokes, thanks for the clarification. I was a bit uncertain as to the exact function of these working together.
  • AnNaMaLaI
    AnNaMaLaI almost 9 years
    Any differences like compact is fast when we having more number of variables.. Incase of Setting ?
  • Raghul Rajendran
    Raghul Rajendran over 8 years
    how to view them in view file
  • mehov
    mehov almost 5 years
    Those looking for the up-to-date (at the moment of writing) info, here's documentation for 3.7: api.cakephp.org/3.7/class-Cake.Controller.Controller.html#_s‌​et

Related