Загрузка файлов поставщиков в CakePHP 2.0

В настоящее время я обновляю один из наших проектов до CakePHP 2.0. К сожалению, «первая строка» кода создает проблемы, и я не могу найти решение этой проблемы.

В CakePHP 1.3 у меня был оператор App::import("Vendor", "facebook"); прямо перед определением класса AppController. Файл, на который делается ссылка, расположен в разделе /app/vendors/facebook/facebook.php (и включает в себя файл base_facebook.php).

Я испробовал много разных способов включения файла теперь в CakePHP 2.0 в соответствии с именованием файлов и загрузкой классов, описанными здесь: Изменения в именах файлов и загрузке классов в CakePHP 2.0

Я переименовал путь в app/Vendor/Facebook/Facebook.php или app/Vendor/Facebook/facebook.php и попробовал следующие методы:

App::uses("Facebook", "Vendor/Facebook");
App::uses("Facebook", "Facebook");
App::uses("Facebook", "Vendor/Facebook/Facebook.php");
App::uses("Facebook", "Vendor");

Кто-нибудь нашел способ сослаться на файл поставщика? Из-за ленивой загрузки описанные выше методы не выдают ошибку/предупреждение, поэтому отлаживать это немного раздражает...


person Johannes N.    schedule 16.11.2011    source источник


Ответы (3)


Поставщики не могут быть загружены с помощью App::uses() в CakePHP, потому что CakePHP не может ожидать, что внешние библиотеки будут следовать тем же стандартам в отношении именования папок и файлов. Вы по-прежнему можете использовать App::import('Vendor', ...), как и в версии 1.3 фреймворка.

Теперь, если подумать, использование App::import() для продавцов довольно глупо. Это просто дорогая, многословная и очень глупая обертка для require_once().

В версии 2.0 мы поощряем людей использовать require или require_once для своих библиотек поставщиков. Вы можете получить местоположение папки Vendor, используя App::path('Vendor') или просто APP . 'Vendor' . DS.

person José Lorenzo Rodríguez    schedule 16.11.2011
comment
Привет, Хосе, спасибо за быстрый ответ. require_once отлично работает - я об этом не подумал. Тем не менее, старый синтаксис App::import(Vendor,...) у меня не работает. - person Johannes N.; 17.11.2011
comment
Кстати, старое использование App::import(), как вы показываете, не будет работать, потому что вам нужно указать относительный путь к классу. import() больше не будет рекурсивно просматривать каталоги из соображений производительности. Я слышал сообщения об этом, но ни один тикет не открылся в трекере. Однако модульные тесты для этой функции проходят, как и ожидалось. Я попытаюсь написать реальный пример, чтобы убедиться, что он работает так, как ожидалось. Спасибо! - person José Lorenzo Rodríguez; 17.11.2011
comment
Итак, App::import(Vendor, Facebook/Facebook) должен помочь в вашем случае. - person mark; 17.11.2011
comment
Почему я все еще получаю, что класс «Facebook» не найден, хотя я использовал require_once(APP. 'Vendor'. DS. 'facebook'. DS. 'facebook.php'); ? Файл найден, но никак не может его загрузить. Я также пытался дать больше прав доступа к этой папке. @Jo - person hemppa; 17.07.2013
comment
Если это действительно так, @jose-lorenzo, не кажется ли вам, что это должно быть задокументировано (book.cakephp.org/2.0/en/core-utility-libraries/) таким образом? Кроме того, какова цель/ценность App::import или это действительно только для устаревшей поддержки? - person zmonteca; 07.02.2014
comment
App::import() — это метод, который в основном использовался в торте 1.3, нам пришлось оставить его там по соображениям обратной совместимости. Больше нет смысла его использовать. Может быть, вы хотите помочь использовать документ, который в книге? :) - person José Lorenzo Rodríguez; 07.02.2014
comment
Продавцы могут быть загружены с помощью App::uses(). вы вводите меня в заблуждение. см. здесь. Это не будет работать, только если у вас есть имя файла, отличное от имени класса - person Poonam; 06.07.2016
comment
@ Пунам, я думаю, ты заблудился. App:uses() может сломать ваш код, если загружаемая вами библиотека не соответствует стандартам CakePHP. Если это так, то App:uses() будет работать так, как вы сказали, но чаще всего вы будете загружать плагины, написанные для Cake, а не загружать их из Vendor. - person Fr0zenFyr; 08.09.2016

Документация Cake предлагает использовать App::uses() включая-файлы-с-приложением-импортом

Однако в нем также указано, есть ли у вас нестандартный плагин для использования App::Import().

App::import('Vendor', 'phpQuery', array('file' => 'bariew/phpquery/phpQuery/phpQuery.php'));
person mmv_sat    schedule 25.08.2016

Предположим, что ваш файл поставщика расположен /app/vendors/facebook/facebook.php здесь.

Следующая строка должна делать то же самое, что и App:: import() в старой версии CakePHP.

 require_once(ROOT . DS . 'app' . DS .'Vendor' . DS  . 'facebook' . DS . 'src' . DS . 'facebook.php');

 $facebookApi = new facebook();
person Faisal    schedule 26.01.2017