Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Frameworki _ [CakePHP] Refaktor powielającego się kodu

Napisany przez: kinimod99 22.01.2023, 14:59:49

Hej, zrobiłem podział sitemapy, lecz mam problem z powtarzalnym kodem i chciałbym uniknąć tworzenia dodatkowych funkcji, żeby tylko zmienić wartość offsetu przy robieniu query (pobieram artykuły po 2000).

  1. public function index() {
  2. $this->layout = false;
  3. $sitemaps = [
  4. ['loc' => (APP . '\Config\Config')::getUrl() . '/sitemaps/articles0/sitemap.xml'],
  5. ['loc' => (APP . '\Config\Config')::getUrl() . '/sitemaps/articles1/sitemap.xml']
  6.  
  7. ];
  8.  
  9. $this->set('sitemaps', $sitemaps);
  10. }
  11.  
  12. public function articles0() {
  13. $this->loadModel('Article');
  14.  
  15. $articles = $this->Article->query(
  16. 'SELECT url, modified FROM articles WHERE site_id='
  17. . $this->siteId . " AND status='publish' AND (redirect_url is null OR redirect_url = '') AND landing_page_id is null AND calc_id = '0' LIMIT 2000"
  18. );
  19.  
  20. foreach ($articles as $article) {
  21. $urls[] = [
  22. 'loc' => (APPNAME . '\Config\Config')::getUrl() . '/-' . $article['url'],
  23. 'lastmod' => http://www.php.net/date('Y-m-d\TH:i:s+00:00', http://www.php.net/strtotime($article['modified']))
  24. ];
  25. }
  26.  
  27. $this->set('urlset', $urls);
  28. $this->render('sitemaps/urlset', false);
  29. }
  30.  
  31. public function articles1() {
  32. $this->loadModel('Article');
  33.  
  34. $articles = $this->Article->query(
  35. 'SELECT url, modified FROM articles WHERE site_id='
  36. . $this->siteId . " AND status='publish' AND (redirect_url is null OR redirect_url = '') AND landing_page_id is null AND calc_id = '0' LIMIT 2000, 2000"
  37. );
  38.  
  39. foreach ($articles as $article) {
  40. $urls[] = [
  41. 'loc' => (APPNAME . '\Config\Config')::getUrl() . '/-' . $article['url'],
  42. 'lastmod' => http://www.php.net/date('Y-m-d\TH:i:s+00:00', http://www.php.net/strtotime($article['modified']))
  43. ];
  44. }
  45.  
  46. $this->set('urlset', $urls);
  47. $this->render('sitemaps/urlset', false);
  48. }


Chciałbym mieć tylko jedną funkcje articles(), tylko pojawia się problem, że muszę podać nazwę funkcji i nie wiem jak je dynamicznie generować. Pozdrawiam

Napisany przez: viking 23.01.2023, 07:47:01

  1. public function articles(int $offset, int $rowCount){}

Napisany przez: kinimod99 23.01.2023, 22:39:52

dziękuje bardzo, a czy mógłbym przeciażać w php metodę, żeby mieć 1 metodę z tą samą nazwą tylko parametrami by się różniła?

Napisany przez: Salvation 24.01.2023, 00:09:03

Nie da się przeciążać metod w PHP, ale możesz wstrzyknąć Obiekt z różną ilością properties, ale zapiętym jednym Interface'em.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)