Для меня, если у меня есть этот кусок кода, я сначала обернул бы его в статический (или нормальный) класс и назвал бы его ACME, а затем переместил бы acme.php в /apps/libs/acme.php
. Тогда в контроллере я буду использовать App::import('Lib', 'acme')
. Это действие делает только запрос файла, поэтому вы можете просто использовать его мгновенно, позвонив по номеру ACME::sendAction(...)
.
.
А что касается global
, вам может потребоваться просто объявить статический (или нормальный) класс, а затем определить общие переменные как часть свойств класса, чтобы вы могли делиться ими со всеми функциями в классе.
Например, это /app/libs/acme.php
class ACME {
private static $someapiwebsiteURL = "http://thewebsite/api/1.0/";
private static $apiKey = "0010KIUMLA0PLQA665JJ";
private static $tenantId = "THE_TENANT_NAME";
/**
* Simple builder to build links from array of $params
*
* @param string $url The api url
* @param array $params The given parameters
* @return string built url
*/
private static function BuildLink($url="", $params=array()) {
$link = $url;
foreach($params as $k=>$v) {
$link .= "&$k=$v";
}
//Replace the first & to ?
$link = preg_replace("/&/", "?", $link, 1);
//Not sure if we need URL encode here, please uncomment this
//if the API could not work.
//$link = urlencode($link);
return $link;
}
public static function SendAction($action, $itemId, $itemdescription, $itemurl, $itemimageurl, $sessionid, $userid, $rating="") {
$somewebsiteAPI = self::BuildLink(self::$someapiwebsiteURL.$action, array(
"apikey"=>self::$apiKey,
"sessionid"=>$sessionid,
"userid"=>$userid,
"tenantid"=>self::$tenantId,
"itemid"=>$itemId,
"itemdescription"=>$itemdescription,
"itemurl"=>$itemurl,
"itemimageurl"=>$itemimageurl,
/**
* Assuming your API smart enough to only use this value when
* the action is "rate"
*/
"ratingvalue"=>$rating
));
$xml = simplexml_load_file($somewebsiteAPI);
return $xml;
}
public static function GetRecommendations($recommendationType, $itemId, $userId) {
$somewebsiteAPI = self::BuildLink(self::$someapiwebsiteURL.$recommendationType, array(
'apikey'=>self::$apiKey,
'tenantid'=>self::$tenantId,
'itemid'=>$itemId,
'userid'=>$userId
));
$xml = simplexml_load_file($somewebsiteAPI);
return $xml;
}
}
А в вашем контроллере
App::import('Lib', 'acme');
class FoodController extends AppController {
//Food is plural already I assume? You can just use
//food, should be ok I think, else it will be weird
//to use /foods/view/?
var $name = "Food";
var $uses = array("Item", "Food");
function view($id="") {
//We accepts only valid $id and $id > 0.
//Take notes that this $id will be a string, not int.
if (ctype_digit($id) && $id > 0) {
//I don't know how you would gather the information, but I assume you
//have a database with the information ready.
//I assumed you have an `items` table
$item = $this->Item->findById($id);
$sessionid = "00988PPLO899223NHQQFA069F5434DB7EC2E34"; //$this->Session->...?
$timeRange = "ALL";
$userid = "24EH1725550099LLAOP3"; //$this->Auth->user('id')?
if (!empty($item)) {
$desc = $item['Item']['description'];
$url = "/foods/view/".$id;
$img = $item['Item']['img'];
$viewResponse = ACME::SendAction("view", $id, $desc ,$url, $img, $sessionid, $userid);
$this->set('food', $this->Food->read(null, $id));
}else{
$this->Session->setFlash(__('Invalid food', true));
$this->redirect(array('action' => 'index'));
}
}else{
$this->Session->setFlash(__('Invalid food', true));
$this->redirect(array('action' => 'index'));
}
}
}
Редактировать
Код был заполнен и, конечно, без каких-либо гарантий :). Лично мне не очень нравится иметь длинные аргументы в функции (например, SendAction
, обрезка ошибок), я использую более короткий аргумент, такой как $params
в ACME::BuildLink
. Но просто для того, чтобы уважать ваш код, я не особо изменил метод SendAction
.
Тогда я не слишком уверен, как бы вы использовали этот код, поэтому я предположил, что у вас есть ProductsController
и каким-то образом URL-адрес пользовательского триггера, например /products/send_action/
. Если вы сможете предоставить больше информации, мы сможем помочь.
Редактировать снова
Я изменил класс ACME, а также контроллер. Да, я пропускаю некоторые переменные, но я добавил их обратно в обновленный код.
Не слишком уверен, что он будет работать (возможно, опечатка), вы можете просто изменить код, если он не работает для вас.
А для личных соглашений я обычно использую статические методы, например ACME:GetRecommendations
или ACME::SendAction
.
.
О да, я лучше вернусь к переменным, которые вы использовали. Извините за их изменение, просто мне не нравятся длинные имена:)
И, кстати, корпорация RoadRunner ACME Corporation ? Лол!
Приветствие
Лайонел