Самый эффективный способ реализовать проверку входа в систему с помощью MVC в PHP? - PullRequest
1 голос
/ 01 июля 2011

Я знаю, что вопросы, подобные этому, были заданы, но я искал в Интернете, и я не могу найти именно то, что я ищу.

Самый распространенный ответ - поместить его в контроллер.Мне понравилось конкретное решение от stackoverflow, которое имело SessionController и NonSessionController, оба расширяющие основной контроллер, но с SessionController проверкой, вошел ли пользователь в систему до отправки.

Означает ли это, чтоконтроллер будет выглядеть примерно так?

class SessionController
{
    ...
    function view()
    {
         //view thread stuff
    }

    function post()
    {
         if loggedin then
         {
              //post thread stuff
         }
    }
{

В этой ситуации похоже, что NonSessionController бесполезен, и эта модель используется только тогда, когда каждое действие, которое обрабатывает контроллер, строго для пользователей или не для пользователей.В отличие от этого примера на форуме.

Поэтому я предполагаю, что мой вопрос заключается в том, является ли общая концепция контроллера выше наиболее эффективным способом проверки входа в систему при использовании MVC?

Ответы [ 4 ]

0 голосов
/ 17 ноября 2015

Извините, нет английского:

базовый контроллер

class Controller{


function handleLogin()
{
    if(!Authentication::isLoggedIn())
    {
        //do stuff - redirect to login page?
    }
}

}

someController

class someController extends Controller{


function someAction()
{
    //check login
    $this->handleLogin();

    //do someAction stuff
}

}
0 голосов
/ 01 июля 2011

Я бы сделал компонент. Если вы пишете свой собственный MVC-фреймворк, вам будет интересно посмотреть, как вы это реализуете.

Но, в основном, вам нужен класс для проверки состояния сеанса. Но если вы привязываете себя к расширению класса для входа в систему и класса для выхода из системы, я чувствую, что у вас слишком много дублирующегося кода. Я также лично не думаю, что это очень интуитивно понятно. Я бы, вероятно, потерял след, должен ли контроллер расширять Session или NotSession.

Я на самом деле в процессе написания своей собственной инфраструктуры MVC и подумал о том, как бы я немного решил эту проблему. Я не дошел до того, где фактически реализовал код, так что на данный момент это скорее рабочая теория. :)

  1. Имеется один базовый класс контроллера. У этого класса есть свойство, которое мы назовем $components. Давайте сделаем это массивом, и он может содержать имена классов для вещей, которые вы хотите сделать во многих контроллерах, но на самом деле они не принадлежат самому контроллеру.

  2. Поскольку я использую шаблон проектирования Front Controller до вызова запрошенного действия, я соберу массив $ компонентов и загрузу соответствующий файл класса для каждой записи.

  3. По мере загрузки каждого $component файла я буду динамически добавлять этот компонентный объект в свойства контроллера. Чтобы компонент с именем Session мог ссылаться на класс с именем SessionComponent, и вы можете получить к нему доступ в вашем контроллере с помощью $this->Session->do_something() или $this->SessionComponent->do_something()

Я вроде как разорвал идею из CakePHP . Я использую Cake в качестве своего производственного PHP-фреймворка, и многие мои идеи для пользовательского фреймворка, над которым я работаю, очевидно, вдохновлены Cake.

0 голосов
/ 18 ноября 2013

Если вы находитесь внутри своего SessionController, вам не нужно проверять переменную loggedin для каждой функции, вы должны делать это внутри конструктора или маршрутизатора, если вы чувствуете себя достаточно уверенно, чтобы манипулировать. Таким образом, если пользователь не вошел в систему, файл и класс SessionController не будут загружены вообще.

0 голосов
/ 01 июля 2011

Я думаю, что идея состоит в том, чтобы иметь один контроллер, который проверяет сеанс и вход в систему, а другой - нет.

Я бы поставил проверку входа в конструктор контроллера сеанса так, чтобы каждыйКонтроллер, который расширяет его, будет проверять логин.

Контроллер сеанса будет выглядеть как

class SessionController
{
    public function __construct()
    {
       if ( ! AuthenticationHelper::isLoggedIn() )
       {
           // User is not logged in
           // Do something, maybe a redirect to login page
       }
    }
}

Тогда вы можете просто расширить этот контроллер как

class HomeController extends SessionController
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        print "This page checks login status";
    }
}
...