Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using App::uses (instead of App::import) in a CakePHP 2.1 Plugin

I'm writing a small application in CakePHP 2.1, and I want to use Nick Baker's file upload plugin. I downloaded the cakephp2.0 branch (I know that isn't done yet), and placed it in my apps Plugin folder. I made some necessary modifications on it, but I'm curious what the right way is to replace those App::import function calls (at start of FileUploadComponent, FileUploadBehavior and FileUploadHelper classes) with the App:uses function.

It needs to import the FileUploadSettings class from Config/file_upload_settings.php and the Uploader class from Vendor/upload.php. It can be done with the require_once function, but I'm sure there is a CakePHP way to do it.

like image 548
PeterB Avatar asked Jan 24 '12 21:01

PeterB


2 Answers

According to the Cake manual App::import() is comparable to the way require_once() works. From what I understand you would load classes using App:uses() and Vendor files using App:import().

The API documentation says the following on the subject:

All classes that were loaded in the past using App::import(‘Core’, $class) will need to be loaded using App::uses() referring to the correct package. This change has provided large performance gains to the framework.

  • The method no longer looks for classes recursively, it strictly uses the values for the paths defined in App::build()
  • It will not be able to load App::import('Component', 'Component') use App::uses('Component', 'Controller');.
  • Using App::import('Lib', 'CoreClass'); to load core classes is no longer possible. Importing a non-existent file, supplying a wrong type or package name, or null values for $name and $file parameters will result in a false return value.
  • App::import('Core', 'CoreClass') is no longer supported, use App::uses() instead and let the class autoloading do the rest.
  • Loading Vendor files does not look recursively in the vendors folder, it will also not convert the file to underscored anymore as it did in the past.

The migration guide also has some things to say about App:uses() and is a good starting point in general to compare best practices for 2.0 with the older methods from 1.3 and lower.

This related question deals with loading Vendor files in Cake 2.0, I can't verify the claim by José Lorenzo that App:import() is a "silly wrapper" for require_once(), nor the statement that it's the preferred way of including files. The only reference I could find for the latter is in the Coding Standards for Cake contributors, viz. developers contributing to the Cake core, not applications built on the framework.

EDIT

Let's say you want to import the Twitter OAuth library, residing in Vendor/twitter, the main class file is twitteroauth.php in Vendor/twitter/twitteroauth/twitteroauth.php:

  App::import('Vendor', 'twitteroauth', array('file' => 'twitter'.DS.'twitteroauth'.DS.'twitteroauth.php'));
like image 198
mensch Avatar answered Oct 13 '22 03:10

mensch


From what I've gathered:

  • use import() for external libraries
  • and uses() for framework files

For example:

App::import('Vendor', 'ExternalLibrary');
App::uses('Inflector', 'Cake.Utility');
like image 43
mjswensen Avatar answered Oct 13 '22 03:10

mjswensen