Preface
Using the latest PHPOfficePhpSpreadsheet in a CakePHP3 application is relatively easy,
A simple composer command like composer require phpoffice/phpspreadsheet
does the trick in a few seconds and then
you ready to go.
All of as Cake uses end up with a PHPExcelComponent
that we either borrow or devise ourselves,
so we can make our users ... happy by giving them the beloved excel files.
The problem with using PHPOffice/PhpSpreadsheet inside a CakePHP2 application is that CakePHP2 does not support namespaces
and so the App::import()
is not able to load all the required classes correctly.
This simple howto lists all the steps that I followed in order to make things work, with the help of this question at stackoverflow and this blog post from Mark.
The Steps
- Download the latest version from here.
- Extract the zip file and rename the
src
folder (inside Phpspreadsheet-develop) toPhpOffice
- Go to your Cake2 project and move/copy this new
PhpOffice
folder inside yourAPP/Vendors
folder -
While you are there, create another folder named
Psr
(inside yourAPP/Vendors
) and an other folder namedSimpleCache
insidePsr
. (You will know why in a minute) - PhpSpreadsheet refferences the Fig-Simple cache library that we also have to install manually. Go to the php-fig/simple-cache page and download the required zip file (name is simple-cache-master.zip).
-
Unzip that in a temprary directory and move all three files from the
src
folder toAPP/Vendors/Psr/SimpleCache
. -
Open your
APP/Config/bootstrap.php
file and place the following code at the end./** * Configure the autoloader */ spl_autoload_register( function($class) { foreach(App::path('Vendor') as $base) { $path = $base . str_replace('\\', DS, $class) . '.php'; if (file_exists($path)) return include $path; } }, true);
-
That's it. If you want to use the Spreadsheet class, all you have to do is place a
use PhpOffice\PhpSpreadsheet\Spreadsheet;
statement at the top of your file and then any reference like_xls = new Spreadsheet();
will work just fine.
A few afterwords
What we actually accomplished here is that we instructed the php class loader to search for any class
it does not know about inside a speciffic sub folder of our APP/Vendors
. This subfolder structure, must confirm
to the exact package name of the class. Hence we created the PhpOffice/PhpSpreadsheet
and Psr/SimpleCache
subfolders. Using this technique we may add any additional library into our CakePHP2 application provided that
we keep this naming standard. My setup was a CentOS 6.10 web server with PHP 5.6.37 (from Remi).
Once again, CakePHP3 and composer can make this job extremely easier, so unless you really have to, do not go into all this fass ;)