Я использую Backbone.js вместе с инфраструктурой PHP MVC (Codeigniter, Laravel). Я смущен тем, как URL-адреса будут обрабатываться маршрутизатором PHP и Backbone-маршрутизатором при использовании Pushstates. (Я еще не начал использовать pushstates, все еще используя hashbangs #
). Я не работаю над одностраничным приложением, но сайт состоит из нескольких страниц, которые действуют как одностраничное приложение самостоятельно.
Проблема. Если у меня есть страница http://domain.com/user/user123
, и нажав ссылку http://domain.com/user/user123#photos
загружает несколько фотографий через AJAX, и я хочу избавиться от #
, Я предвижу проблему, когда пользователь, который переходит на http://domain.com/user/user123/photos
после нажатия ссылки, решает скопировать и вставить URL-адрес на другую вкладку браузера, увидит страницу с ошибкой 404 как структуру PHP маршрутизатор (если я правильно предполагаю, что PHP-маршрутизатор обрабатывает запрос URL-адреса сначала до создания магистрали), он не распознает наличие этого URL- адреса . Как решить эту проблему?
Другая проблема, которая, как мне кажется, возникнет, заключается в том, как следует визуализировать представление, когда пользователь напрямую переходит на http://domain.com/user/user123/photos
? Если код HTML будет дублироваться как в представлении PHP (для экземпляра, в котором пользователь вводит URL-адрес напрямую), так и в backbone.js View (для случая, когда пользователь нажимает ссылку из http://domain.com/user/user123
)? Это не похоже на оптимальное решение для меня. Или можно как-то визуализировать представление в обоих случаях с помощью магистрали, чтобы избежать дублирования кода?
Пожалуйста, порекомендуйте 🙂
Вы столкнулись с одним из наиболее сложных аспектов включения pushState
в pushState
приложение. В принципе, вам необходимо убедиться, что любой маршрут, на который вы будете ссылаться в своем приложении, также может обрабатываться сервером.
Самый простой способ решить это, на PHP, – /user/user123
все запросы на действительные URL-адреса ( /user/user123
) на вашу корневую страницу, а затем позвольте позвоночнику вызвать обработчик, соответствующий фрагменту url. Это требует от вас на стороне сервера действительно знать, какой действительный URL-адрес (т.е. /posts/5
действителен, /posts/abc
или /aaa/
is нет и т. Д.), Но в остальном это не огромный объем работы.
В конечном итоге проблема заключается в том, что вы переключаетесь между протоколом без учета состояния (HTTP) и государственным приложением (backbone.js). Это требует некоторого тщательного планирования.
Что касается второго вопроса, вам не нужно отображать представление на стороне сервера, просто сделайте все, что вы сделали бы для запроса в корневой домен, а backbone.js вызовет соответствующий обработчик (например, /user/user123
). Единственный случай, когда вы хотите визуализировать представление на стороне сервера, – это если вы хотите поддерживать пользователей без javascript или сделать свое приложение RESTful, и в этом случае вам придется дублировать код просмотра (нет простого способа обойти это).
Надеюсь, это имеет смысл.