Avatar billede supermoos Nybegynder
28. februar 2009 - 19:56 Der er 8 kommentarer

Afbryd php script i constructoren?

Hej

Jeg har en base class ala:

<?php
class BaseService
{
   
    public function __construct()
    {   
    if ($_SESSION['logged_in'] = TRUE){
            //Opret database connection
        } else {
            return false;
            exit; //Dette virker ikke, men ideen var at scriptet skulle stoppe, sådan at login functionen ikke blev kaldt.
        }

    }
   
}

og:

<?php
class LoginManager extends BaseService
{

  public function __construct()
  {
      parent::__construct();
  }

    public function login($user) {
        if ($user->username != '' && $user->password != '')
        {
                return true;
        }
        return false;
    }
}

Det jeg gerne vil opnå er at ved et kald til functionen login(), så skal den checke om sessions er sat, og man er logged in, hvis ikke man er det, så skal kaldet til login() stoppes og false skal returneres... Men login bliver kaldt ligemeget hvad jeg gør.

Pointers, hints, tips, tricks, alt hjælp modtages glædeligt :)
Avatar billede erikjacobsen Ekspert
28. februar 2009 - 20:11 #1
Jeg forstår ikke hvad du vil. En constructor kan ikke returnere noget - ud over det objekt den laver til dig.

Så mener du måske

  if ($_SESSION['logged_in'] == true){

Og hvad vil det sige at scriptet skal stoppe? Skal der slet ingen HTML ud til klienten?
Avatar billede supermoos Nybegynder
01. marts 2009 - 11:22 #2
Der skulle selvfølgelig have været to ==.

Jeg har vil bare opnå at scriptet ikke opretter en database connection og returnerer false, resultatet bliver byte coded i amf format så nej ingen html.

Jeg tænkte at det ville være smart at gøre i constructoren da jeg så ikke skulle gøre det i hver enkelt funktion, men det er vel muligt at blot at modificere koden således:

<?php
class BaseService
{
    private $authenticated = false;
    public function __construct()
    {   
    if ($_SESSION['logged_in'] == TRUE){
            //Opret database connection
            //$authenticated = true
    }
    }
   
}

og:

<?php
class LoginManager extends BaseService
{

  public function __construct()
  {
      parent::__construct();
  }

    public function login($user) {
        if ($user->username != '' && $user->password != '' && this->$authenticated == true)
        {
                return true;
        }
        return false;
    }
}
Avatar billede supermoos Nybegynder
01. marts 2009 - 11:23 #3
Men er der ikke en smartere løsning, der vil komme mange flere funktioner en login(), som alle jo så skal tjekke om $authenticated == true?
Avatar billede erikjacobsen Ekspert
01. marts 2009 - 12:04 #4
Du kan jo også bare checke på $_SESSION['logged_in'] i din rigtige PHP-fil, og lad klassen med databaser være lykkeligt uvidende om sessionsvariabler.
Avatar billede supermoos Nybegynder
01. marts 2009 - 12:07 #5
Men det ødelægger bare lidt formålet med at jeg ikke vil have duplicate kode i alle de klasser der extender baseService. BaseService skal kende til sessions, da jeg ikke vil oprette en database connection før jeg ved om man er logget ind.
Avatar billede erikjacobsen Ekspert
01. marts 2009 - 12:16 #6
Det giver ikke mening at blande database og kendskab til sessions sammen.

Men du kan fx kigge på http://en.wikipedia.org/wiki/Factory_method_pattern og lave et factory, der enten afleverer dig et objekt med databaseforbindelse (hvis man er logget ind), eller et "dummy"-objekt, hvis man ikke er logget ind.
Avatar billede supermoos Nybegynder
01. marts 2009 - 12:25 #7
Det er også blot et database objekt der bliver oprettet hvis sessions angiver logged_in == true.

Men det er ikke mit problem, mit problem er at da jeg skal extende baseservice mange gange til forskellige formål, men fælles for alle de klasser der extender er at der først skal valideres for om man er logget ind. Så giver det da god mening at proppe denne funktionalitet inde i den eneste klasse som de alle extender fra, nemlig BaseService. - Men det er det jeg ikke kan greje hvordan man gør bedst. Mit eksempel i #2 kunne være en løsning, men det virker rimelig bloated at fylde valideringskode i hver eneste function() i de klasser der extender BaseService.
Avatar billede coderdk Praktikant
01. marts 2009 - 13:04 #8
I stedet for return, skal du throw'e en exception... Men ja, ellers kig på mønstre ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester