Некоторые архитектурные рекомендации по замене ASP.NET MVC 3 на сайте php - PullRequest
0 голосов
/ 24 июля 2011

Я переписываю веб (приложение?). Я постараюсь все настроить, кратко (хаха). Веб-сайт моего клиента встроен в / в CMS. Большая часть статического контента. Веб-сайт размещен где-то, но есть зона входа для клиентов, чтобы отслеживать их заказы и другой динамический бизнес-контент, который хранится на серверах моего клиента. Аутентификация происходит с обеих сторон (сессия [php] управляет сессией, но бизнес-логика и данные клиента, включая пароли, находятся на серверах моего клиента в базе данных моего клиента и обслуживаются через wcf). Каждый php-запрос к веб-сервису wcf отправляет строку аутентификации json, и если аутентифицировано, мой веб-сервис wcf возвращает результат json, заполненный запрошенными данными (который затем используется с шаблонами smarty для генерации вывода, который cms отправляет в браузер).

Это было бы хорошо, за исключением того, что php-код - это монументальные спагетти. На самом деле, это, вероятно, не так уж плохо по стандартам php, но я привык ... ну, кого это волнует, потому что все сводится к тому, что я его не писал, но я должен расширять его и каждую модификацию занимает в 10 (0?) раз больше времени, чем следует, и только утопает стог сена в большем количестве лапши (чтобы смешать метафоры). И, черт возьми, нет никаких изменений в тестировании, прежде чем они будут запущены. Любые изменения или дополнения должны быть сделаны в производственной среде (из-за зависимостей от среды CMS). Поэтому я должен смешать тактику блиц с правкой и молитвой, а также удерживать одиннадцатый палец на кнопке пословицы, как это было бы хорошо (не было бы неплохо, если бы это был всего лишь один шаг, чтобы вернуться?). Я много раз играл с рефакторингом на стороне php, и даже написал около 75% полного повторного воплощения. Но ...

Это веб-приложение получает все больше обязанностей и запросов на изменение. Для этого клиента я написал ERP на 500 000 строк в C #, и вся его бизнес-логика находится в нем. Итак, я полагаю, что существует определенная рентабельность инвестиций в то, что весь их код находится в .NET для меня или любого, кто последует за ним.

Единственным реальным ограничением для любого решения является то, что все, что отображает CMS, должно быть добавлено к переменной «$ output». Это оставляет вещи довольно открытыми.

Во всяком случае, (зачастую лишнее, но, надеюсь, занудное) повествование завершено. Итак, с этим я установил простую обёртку php, которая использует cURL для получения содержимого url, которое поддерживается моим новым mvc-приложением. Это прекрасно работает для получения. Мой вопрос заключается в том, как лучше всего это сделать. Каждый запрос со стороны cms должен включать некоторую аутентификационную информацию, которую он будет получать из базы данных (или чего-либо еще) и публиковать со своим запросом. Я полагаю, что просто каннибализирую веб-сервис wcf и буду обслуживать весь контент из приложения mvc.

Итак, в принципе, как лучше написать приложение mvc, в котором каждый запрос представляет собой сообщение, содержащее информацию об аутентификации (это может быть json или xml)? Я пытаюсь избежать декорирования каждого метода контроллера с помощью [HttpPost], и каждый метод действия требует аргумента моей аутентификации dto, чтобы в какой-то момент я мог быстро и легко переключить всю аутентификацию на аутентификацию asp-форм.

Спасибо (за чтение)!

Ответы [ 3 ]

1 голос
/ 24 июля 2011

Реализуйте собственный фильтр действий, который будет централизованно определять текущего пользователя, вошедшего в систему, и применять его к параметру вашей функции.Примерно так:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class UserIDFilter : ActionFilterAttribute
{
    public bool Require { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Require)
        {
            if (Membership.GetUser() == null)
            {
                string formsAuthenticationToken = HttpContext.Current.Request.Form["cookie"];
                if (!string.IsNullOrEmpty(formsAuthenticationToken))
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(formsAuthenticationToken);
                    if (ticket != null)
                    {
                        FormsIdentity identity = new FormsIdentity(ticket);
                        string[] roles = Roles.GetRolesForUser(identity.Name);
                        GenericPrincipal principal = new GenericPrincipal(identity, roles);
                        HttpContext.Current.User = principal;
                    }
                }
                if (Membership.GetUser() == null)
                    throw new UserNotAuthenticatedException();
            }
        }
        const string key = "userId";
        if (filterContext.ActionParameters.ContainsKey(key))
        {
            if (Membership.GetUser() != null)
                filterContext.ActionParameters[key] = (Guid)Membership.GetUser().ProviderUserKey;
            else
                filterContext.ActionParameters[key] = (Guid?)null;
        }

        base.OnActionExecuting(filterContext);
    }
}

А затем украсьте каждое действие:

[UserIDFilter]
(and the action will have 1st parameter: Guid? userId)

или

[UserIDFilter(Require=true)
(and the action will have 1st parameter: Guid userId)
0 голосов
/ 24 июля 2011

Это похоже на одну из тех ситуаций, где фраза «человеку с молотком все выглядит как гвоздь» очень применима. Вы не могли помешать себе добавить не слишком тонкие раскопки в php, когда вы заявили, что код «CMS» - это спагетти, хотя на самом деле это не так, потому что, насколько вам известно, PHP = спагетти.

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

Архитектура, в которой вы используете PHP исключительно для выполнения вызовов CURL для ваших скриптов .NET, абсурдна. Зачем тратить наше время, когда ваша повестка дня ясна. Обсудите с клиентом, почему их инвестиции в технологический стек Microsoft так велики, как что-либо еще, что для них имеет смысл расширить этот стек до внешнего интерфейса. У нас есть множество отличных фреймворков, доступных в мире PHP, которые предоставляют MVC. Совершенно очевидно, что PHP находится не в вашей зоне комфорта, и в этих обстоятельствах вполне логично объяснить клиенту, что гибридное решение ему не подходит.

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

Мы ничего не знаем о вашей CMS, мы ничего не знаем о вашем приложении, мы ничего не знаем о вашей архитектуре, мы ничего не знаем о вашей ERP ... ничего не зная ни о чем, сложно дать ответы, которые что-то значат.

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

Представьте, если кто-то пришел к вам с вашим вопросом, и представьте, что вы ничего не знаете об этом ... ВЫ можете понять, что вы имели в виду?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...