yii2 | Работа с константами

117
25 марта 2021, 22:00

У меня есть код

<?php
   namespace api\modules\v1\models;
   use Yii;
   const KYIV = 'Kyiv';
   const ODESSA = 'Odessa';
   class Coordinates
   {
    public function checkForTheExistenceOfCoordinates($postCoordinates){
    $erros = new Errors();
    //массив данных которые должны быть ОБЯЗАТЕЛЬНЫЕ
    $arrayCoordinates = 
    ['startLatitude','startLongitude','endLatitude','endLongitude','city'];
    $arr2 = array_flip($arrayCoordinates);
    $arr3 = array_diff_key($arr2,$postCoordinates);
    $result = array_diff_key($arr3,$postCoordinates);
    if(!empty($result)){
        $errorMessage = 'To determine the price is not enough';
        foreach ($result as $key => $data){
            $errorMessage .= ', '. $key;
        }
        return $erros->returnError('To determine the price is not enough'. $errorMessage);
    }else{
         return true;
     }
  }
 }

И есть код

<?php
namespace api\modules\v1\models;
 use api\modules\v1\models\Coordinates;
 class Bond extends Coordinates
 {
  const BOND = 'bond';
public function createRequestUrl($postData){
    $city = $postData['city'];
    if($city == 'Kyiv'){
        return "https://taxibond.kiev.ua/calcprice//coos2/?coox1={$postData['startLatitude']}&cooy1={$postData['startLongitude']}&coox2={$postData['endLatitude']}&cooy2={$postData['endLongitude']}&rule=";
    }elseif($city == "Odessa"){
        return "https://bond.od.ua/calcprice//coos2/?coox1={$postData['startLatitude']}&cooy1={$postData['startLongitude']}&coox2={$postData['endLatitude']}&cooy2={$postData['endLongitude']}&rule=";
    }else{
        return false;
    }
}
public function calculatePrice($output, $city){
    $price = (int)explode(" ", $output)[7];
    if($price == 0){
        $price = (int)explode(" ", $output)[11];
    }
    if($city == $this::KYIV){
        $standartPrice = $price;
        $businessPrice = $price * 1.3; // умножить на 1.3, такова цена бизнесс цены в Бонд Такси
    }elseif($city == ::ODESSA){
    }
}
}

Как я могу использовать константу KYIV в классе Bond? Если это не возможно или неправильно, можете ли вы подсказать, как это реализовать другим способом?

Answer 1

Константы, как и классы, доступны при указании полного имени \api\modules\v1\models\KYIV, кроме того их можно импортировать use api\modules\v1\models\KYIV;. Если нэймспйсы совпадают, то можно использовать просто имя KYIV.

Но в вашем случае можно обойтись без констант. Напишите клёвые классы для городов:

class City {
    private $id;
    private $name;
    private $url;
    public function __construct($id, $name, $url) {
        $this->id = $id;
        $this->name = $name;
        $this->url = $url;
    }
    public function getId() {
        return $this->id;
    }
    public function getName() {
        return $this->name;
    }
    public function getUrl() {
        return $this->url; 
    }
}
class Cities implements \IteratorAggregate {
    private $cities = [];
    public static function createDefault() {
        $defaultCities = [
            new City('Kyiv', 'Киев', "https://taxibond.kiev.ua/calcprice//coos2/"),
            new City('Odessa', 'Одесса', "https://bond.od.ua/calcprice//coos2/"),
        ];
        $self = new self;
        foreach ($defaultCities as $city) {
            $self->addCity($city);
        }
        return $self;
    }
    public function addCity(City $city) {
        $this->cities[$city->getId()] = $city;
    }
    public function getById($id) {
        return $this->cities[$id]?? null;
    }
    public function getIterator() {
        return new \ArrayIterator($this->cities);
    }
}
$postData = [
    'city' => 'Kyiv',
    'startLatitude' => 12,
    'startLongitude' => 34,
    'endLatitude' => 56,
    'endLongitude' => 76,
];
$query = [
    'coox1' => $postData['startLatitude']?? '',
    'cooy1' => $postData['startLongitude']?? '',
    'coox2' => $postData['endLatitude']?? '',
    'cooy2' => $postData['endLongitude']?? '',
    'rule' => '',
];
$cities = Cities::createDefault();
$city = $cities->getById($postData['city']);
echo $city->getUrl() . '?' . http_build_query($query), "\n";
foreach ($cities as $city) {
    echo '<option value="' . $city->getId() . '">' . $city->getName() . '</option>', "\n";
}

Теперь список ваших городов будет в одном месте, добавить город будет просто. А когда-нибудь эти данные даже смогут переехать в базу и админы будут добавлять новые города без участия программиста!

P.S. И не палите коммерческую тайну такси Бонд :-)

READ ALSO
Автоматическая очистка кеша на сайте

Автоматическая очистка кеша на сайте

У меня есть сайтИ я хочу реализовать на нём автоматическую очистку кеша

125
Как заменить данные из многомерного массива?

Как заменить данные из многомерного массива?

Как в данном массиве найти элемент и поменять соседнее значение? те

121
Как вывести массив с помощью api?

Как вывести массив с помощью api?

У меня есть форма, где надо писать счет-фактуру, мне нужно чтобы когда я писал на поле СЧ-111111/11 мне выводил этот счет из api

94
Слияние png изображений

Слияние png изображений

Что нужно поменять в данном коде, чтоб картинка 156png была слева а не внизу? Заранее благодарен

91