【问题标题】:Backbone routes doesn't work with Laravel骨干路由不适用于 Laravel
【发布时间】:2015-02-05 11:29:56
【问题描述】:

我不知道错误在哪里。

我正在做一个单页应用程序,这是上下文:

  1. 我在 Laravel 中有一个资源控制器来监视这条路由“domain.dev/v1/”
  2. Laravel 提供第一页/视图“/public/views/layouts/application.blade.php”
  3. Mustache 视图存储在“public/views/”下,并在被主干路由器调用时同步加载(我已修改“app/config/view.php”文件以提供来自 bakcbone 的视图)
  4. 在骨干网中,路由器控制每个 URI 更改,甚至是 pushstate 和相应的 Mustache 视图。一切似乎都正常,但是如果您键入用户或用户列表的直接 URI……您只会看到服务器返回的 JSON,而不是相应的主干视图,换句话说,我不知道哪个没有做正确的工作,Laravel 路由器或骨干路由器。还是它是 Laravel 配置?

这是我目前的代码:

// app/routes.php

Route::group(['prefix' => 'v1'],function (){

    Route::resource('users','V1\UsersController');

    Route::get('/', function()
    {
      return View::make('layouts.application')->nest('content', 'app');
    });
});


// app/controllers/V1/UsersController.php

namespace V1;

//import classes that are not in this new namespace
use BaseController;
use User;
use View;
use Input;
use Request;

class UsersController extends \BaseController {

    public function index()
    {
        return $users = User::all(['id','email','name']) ;
    }

    public function show($id)
    {
        $user = User::find($id,['id','email','name']);

        if(is_null($user)){
            return array(
                'id' => 0,
                'email' => 'fake email'
                );
        }
        return $user;
    }

// public/js/namespaces.js

(function(){

    window.App = {
        Models : {},
        Collections : {},
        Views : {},
        Router : {}
    };

    window.Templator = function (mustacheView){
        return $.ajax({
            url: '/views/'+mustacheView,
            async : false,
            type: 'GET',
        }).responseText;
    };

    window.Vent = _.extend({},Backbone.Events); 

})();

// public/js/backbone/router.js

App.Router = Backbone.Router.extend({
    routes : {
        '' : 'home',
        'users' : 'showAll',
        'users/:id' : 'showUser',
        'login' : 'showLoginForm'
    },
    home: function (){
        Vent.trigger('home:index');  
    },
    showAll : function (){
        Vent.trigger('users:showAll');  
    },
    showUser: function (id){
        Vent.trigger('users:show',id);  
    },
    showLoginForm : function (){
        Vent.trigger('login:form');  
    }
});


// public/js/app.js
$(function() {

    $(document).on("click", "a", function(e){
        var href = $(this).attr("href");

      if (href != '#')  {
        e.preventDefault();
        Backbone.history.navigate(href,{trigger:true});
      }
    });

    new App.Views.AllUsers;
    new App.Views.Index;
    new App.Views.Login;
    new App.Router;

    Backbone.history.start({ 
        pushState: true, 
        silent: true,
        root: '/v1' 
    });
});

因此,如果我在导航栏上键入此 URI “domain.dev/v1/users”,则会以 JSON 格式显示用户列表,并且不会显示在主干中关联的视图。 有什么建议吗?

【问题讨论】:

  • 我对 Backbone 不是特别熟悉,但就 Laravel 代码而言,你得到了你应该得到的东西。您的控制器操作正在返回一组用户,Laravel 会自动将其转换为 JSON 响应。如果你想从 Laravel 返回一个视图,你应该返回 View::make('view_name'),但我猜你有一些来自 Backbone 应用程序的视图的数据绑定,所以如果直接路由到 @987654323,你需要处理它@ 返回一个视图而不是一个数组。
  • 是的,你是对的@Bogdan。Laravel RESTful API 只返回和接收 JSON。但我认为问题可能出在 BackBone 中的“深度链接”。我现在真的很困惑,我不知道还有哪里可以检查

标签: javascript php backbone.js laravel


【解决方案1】:

看看我刚刚在关于 Angular 的类似问题中给出的答案:Angular and Laravel

在文本中,只需将Angular 替换为Backbone。

如何通过 Laravel 到 Backbone 的路由:

从 Laravel 返回的 '/' 路由的基本视图需要在其 <head> 的某处有类似的东西 before backbone.js 包括:

<script>
    var myRoute = "{{ $route }}";
</script>

此刀片模板创建一个 Javascript 变量。然后,在 Backbone 中声明路由后,添加以下内容:

Backbone.history.start(); // You should already have this line, so just add the next one
App.nav.navigate(myRoute);

这应该可以解决问题。

【讨论】:

  • 我认为您的解决方案可以工作@sisou,但是......如何处理传递给服务器呈现的主页的变量“路由”? (在您的示例中->“return Redirect:to('/')”)。
  • 我还编辑了我的答案,为将 route 变量从 Laravel 获取到 Backbone 提供了指导。
  • 看起来很完美,我会尝试评论你的结果;)
  • 完美!我只需要对我的 Laravel 过滤器和路由进行一些调整,瞧!谢谢@sisou
  • 很高兴我能帮上忙。快乐编码! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多