The BootPHP filesystem is a hierarchy of similar directory structures that cascade. The hierarchy in BootPHP (used when a file is loaded by BootPHP::find_file) is in the following order:
Defined as `APPPATH` in `index.php`. The default value is `application`.
This is set as an associative array using BootPHP::modules in `APPPATH/bootstrap.php`. Each of the values of the array will be searched in the order that the modules are defined.
Defined as `SYSPATH` in `index.php`. The default value is `system`. All of the main or "core" files and classes are defined here.
Files that are in directories higher up the include path order take precedence over files of the same name lower down the order, which makes it is possible to overload any file by placing a file with the same name in a "higher" directory:
This image is only shows certain files, but we can use it to illustrate some examples of the cascading filesystem:
If BootPHP catches an error, it would display the `bootphp/error.php` view, So it would call `BootPHP::find_file('views', 'bootphp/error')`. This would return `application/views/bootphp/error.php` because it takes precidence over `system/views/bootphp/error.php`. By doing this we can change the error view without editing the system folder.
If we used `View::factory('welcome')` it would call `BootPHP::find_file('views','welcome')` which would return `application/views/welcome.php` because it takes precidence over `modules/common/views/welcome.php`. By doing this, you can overwrite things in a module without editing the modules files.
If use the Cookie class, BootPHP::auto_load will call `BootPHP::find_file('classes', 'cookie')` which will return `application/classes/cookie.php`. Assuming Cookie extends BootPHP_Cookie, the autoloader would then call `BootPHP::find_file('classes','bootphp/cookie')` which will return `system/classes/bootphp/cookie.php` because that file does not exist anywhere higher in the cascade. This is an example of transparent extension.
If you used `View::factory('user')` it would call `BootPHP::find_file('views','user')` which would return `modules/common/views/user.php`.
If we wanted to change something in `config/database.php` we could copy the file to `application/config/database.php` and make the changes there. Keep in mind that config files are merged rather than overwritten by the cascade.
The top level directories of the application, module, and system paths have the following default directories:
The path to any file within the filesystem can be found by calling BootPHP::find_file:
// Find the full path to "classes/cookie.php" $path = BootPHP::find_file('classes', 'cookie'); // Find the full path to "views/user/login.php" $path = BootPHP::find_file('views', 'user/login');
If the file doesn't have a `.php` extension, pass the extension as the third param.
// Find the full path to "guide/menu.md" $path = BootPHP::find_file('guide', 'menu', 'md'); // If $name is "2000-01-01-first-post" this would look for "posts/2000-01-01-first-post.textile" $path = BootPHP::find_file('posts', $name, '.textile');
We call extensions or external libraries that are not specific to BootPHP "vendor" extensions, and they go in the vendor folder, either in application or in a module. Because these libraries do not follow BootPHP's file naming conventions, they cannot be autoloaded by BootPHP, so you will have to manually included them. Some examples of vendor libraries are Markdown, DOMPDF, Mustache and Swiftmailer.
For example, if you wanted to use DOMPDF, you would copy it to `application/vendor/dompdf` and include the DOMPDF autoloading class. It can be useful to do this in a controller's before method, as part of a module's init.php, or the contstructor of a singleton class.
require BootPHP::find_file('vendor', 'dompdf/dompdf/dompdf_config','inc');
Now you can use DOMPDF without loading any more files:
$pdf = new DOMPDF;
If you want to convert views into PDFs using DOMPDF, try the PDFView module.