• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nazwy klas z małej litery nie działają na serwerze

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 18 sierpnia 2017 w PHP przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Witam,

mam pytanko wrzuciłem aplikacje na serwer ftp. Wszystko się ładnie ładuje, ale jeżeli chce wywołać jakiś kontroler to zaczyna się problem, jeżeli w adres wpiszę nazwę kontrolera z dużej litera, tak jak nazywa się klasa. Załóżmy, że na serwerze wpisujemy:

adres-strony.pl/login - nie działa

adres-strony.pl/Login - działa.

Lokalnie to nie ma znaczenia, czy nazwę kontrolera wpisuje z dużej czy z małej litery. A chciałbym, że kontroler się wywoływał bez znaczenia jak jest napisany czy z dużej czy z małej litery.

Do ładowania klas używam Composera i autoloadingu.

Wersja Php na serwerze to 7.0.21 a lokalnie to: 7.0.13.

2 odpowiedzi

0 głosów
odpowiedź 18 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)

Show me the code.

Jeśli czytasz z REQUEST_URI i potem wywołujesz kontroler po jego nazwie z adresu, to wielkość liter ma znaczenie. 

komentarz 18 sierpnia 2017 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Plik .htaccess
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
AddType text/css .css

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Plik routera. Może niebyt elegancki ale dopiero się uczę :P
 

use App\Controllers\Error;
use App\Controllers\Index;

class Router {
    public function __construct()
    {
        $url = $this->prepareUrl();
        $this->checkControllerExist($url);
    }

    public function checkControllerExist($url)
    {
            $controllerClass = '\App\Controllers\\';
            $controllerClass .= $url[0];

        if (class_exists($controllerClass)) {
            $controller = new $controllerClass;

            if (isset($url[2])) {
                if (method_exists($controller, $url[1])) {
                    $controller->{$url[1]}($url[2]);
                    return false;
                }
            } else {
                if (isset($url[1])) {
                    if (method_exists($controller, $url[1])) {
                        $controller->{$url[1]}();
                    } else {
                        return false;
                    }
                } else {
                    return $controller;
                }
            }
        } else {
            if($url[0]==='index.php' || empty($url[0])) {
                $controller = new Index();
                return false;
            }
            else {
                $controller = new Error();
                return false;
            }
        }
    }

    public function prepareUrl()
    {
        $url = isset($_GET['url']) ? $_GET['url'] : null;
        $url = rtrim($url, '/');
        $url = explode('/', $url);
        return $url;
    }

}

Lokalnie wszystko działa.

komentarz 18 sierpnia 2017 przez mitelak Pasjonat (23,330 p.)
Lokalnie pewnie działa bo piszesz na Windowsie gdzie nie ma wielkość liter znaczenia, a z kolei większość serwerów stoi na Linuxach a tam Plik i plik to dwa różne pliki :) Piszę to w formie ciekawostki, bo nie wiem jak rozwiązać Twój problem (tak na szybko to zamienianie pierwszej litery na dużą zawsze, ale idę o zakład, że da się to rozwiązać jakoś normalnie) :/
komentarz 18 sierpnia 2017 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Zostaje uważać jak nazywać klasy. I zrobię taki myk.

NazwaKontrolera = ucfirst(strtolower($bar))

Tylko jednego nie załatwia problemu. Niektóre nazw klasy mam camelCase wiec w nazewnictwo się zrobi bałagan i kod się stanie mniej czytelny
komentarz 18 sierpnia 2017 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Dokładnie serwer jest Unixowy. A lokalnie oczywiście Windows.
0 głosów
odpowiedź 21 sierpnia 2017 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
edycja 22 sierpnia 2017 przez Paweł Antyporowicz

Problem rozwiązałem tak.

Może jest to prymitywne ale działa.
Stworzyłem tablice, przykładowo:

        $array = array(
            array(
                'login' => 'Login',
                'signup' => 'SignUp',
                'index' => 'Index',
                'logout' => 'Logout',
                'error' => 'Error'
            )
        );

przeszukuje funkcja array_column i zwraca mi się wartość prawidłowa, wcześniej oczywiście pobrany adres zamieniam na małe litery.

komentarz 21 sierpnia 2017 przez 0e85dc6eaf Dyskutant (8,840 p.)

Jeżeli nie przeszkadzałyby ci '-' w nazwie, to możesz to też zrobić tak

str_replace( '-' , '' , ucwords( $url[ 0 ] , '-' ) )

 

komentarz 22 sierpnia 2017 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Akurat nie używam myślników do nazywania klas.
Używam camelCase. :)
komentarz 22 sierpnia 2017 przez 0e85dc6eaf Dyskutant (8,840 p.)
Nie do nazywania klas a w URLach,

np. strona.xyz/sign-up ---> kontroler SignUp

Podobne pytania

0 głosów
0 odpowiedzi 621 wizyt
0 głosów
2 odpowiedzi 165 wizyt
pytanie zadane 7 listopada 2020 w Algorytmy przez CSSoup Mądrala (6,460 p.)
0 głosów
3 odpowiedzi 246 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez sympi Nowicjusz (240 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...