Сделайте по подобию. Это не PHP, но принципы похожие
using System.Linq;
using HeIsBadMvc.Code;
using HeIsBadMvc.Models;
using Microsoft.AspNetCore.Mvc;
namespace HeIsBadMvc.Controllers
{
/// <summary>
/// Адресный контроллер. Занимается всеми вопросами связанными с адресами, регионами и прочим.
/// </summary>
[Route("api/address")]
[ApiController]
public class AddressController : Controller
{
private static readonly Country[] _countryes = new Country[]
{
new Country{Id = 643,
Alpha2 = "RU",
Alpha3 = "RUS",
Name = "Russia"},
};
private readonly Region[] _regions = RegionsSinglton.Instance.Items;
private readonly City[] _cityes = CityesSinglton.Instance.Items;
/// <summary>
/// Список стран в системе.
/// </summary>
/// <returns></returns>
[HttpGet]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public IActionResult Get()
{
return Ok(_countryes);
}
/// <summary>
///
/// </summary>
/// <param name="country"></param>
/// <returns></returns>
[HttpGet("{country}")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult<Country> Get(string country)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
return res;
}
/// <summary>
/// Список регионов для страны.
/// </summary>
/// <param name="country"></param>
/// <returns></returns>
[HttpGet("{country}/regions")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult GetRegions(string country)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
if (res.Alpha2 == "RU")
return Ok(_regions);
return NoContent();
}
/// <summary>
/// Список городов для страны. Только Россия. Первым идет спецобьект "Вся Россия", потом Москва и Санк-Петербург, дальше сортировка по коду.
/// </summary>
/// <param name="country">Код страны, ru</param>
/// <param name="query">Поисковая фраза, по умолчанию все</param>
/// <param name="limit">Лимит для запроса</param>
/// <returns></returns>
[HttpGet("{country}/cityes")]
[ResponseCache(Location = ResponseCacheLocation.Any, Duration = 86000)]
public ActionResult GetCityes(string country, [FromQuery]string query = "", [FromQuery]int limit = 10)
{
var res = _countryes.FirstOrDefault(x => x.Alpha2 == country.ToUpper());
if (res == null)
return NotFound(new { error = "Not found country" });
if (res.Alpha2 == "RU")
{
return Ok(GetFilteredCityList(query, limit));
}
return NoContent();
}
/// <summary>
/// Отдает лимитированное количество городов.
/// </summary>
/// <param name="query">Если строка не пустая то применяется фильтр</param>
/// <param name="limit"></param>
/// <returns></returns>
private City[] GetFilteredCityList(string query, int limit)
{
if (string.IsNullOrEmpty(query))
return _cityes.Take(limit).ToArray();
query = query.ToLower();
return _cityes.Where(x => x.Name.ToLower().Contains(query) || x.Slug.ToLower().Contains(query))
.Take(limit)
.ToArray();
}
}
}