Laravel无法通过超过1次返回 - 如何使用类似方法完成?

时间:2017-02-10 17:00:13

标签: ajax laravel model-view-controller laravel-5 controller

创建页面后重定向用户时遇到一个小问题。

问题在于,我在2个函数中共有3个返回,显然无法完成,我正在寻找一种方法来改变它,但我不知道它应该是什么。

流程是这样的。

用户创建页面:代码保存到javascript变量中。 用户为页面选择一个名称:代码保存到另一个javascript变量中。

Ajax将这些值传递给Controller,然后:

 public function postDB(Request $request) {
    $newName = $request->input('name_website');
    $newLat = $request->input('newCode');
    $websites = new Website();
    $websites->name = $newName;
    $websites->html = $newLat;
    $websites->save();
    return $newName;
    return $this->website($newName);
}
   public function website($newName)
{
    dd($newName);
    Website::where('name', $newName)->first()->html;
    return view('layouts/website');
}

保存到数据库后,我返回$ newName的值,这是网站的实际名称,或者我应该说URL并返回(调用另一个函数),然后搜索匹配名称的html代码,并返回视图处理显示它:

@extends('layouts.master') @section('title', 'Website Builder') @section('content')
<meta name="csrf-token" content="{{ csrf_token() }}" />


{{html_entity_decode($name->html)}}
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    axios.get('/name').then(
        html => document.querySelector('html').innerHTML = html     
    );
</script>
</html>
@endsection @show

所以基本上在用户将其保存到数据库后,我想将它们重定向到保存变量$ newName中的页面,并检索与显示变量中的名称匹配的显示html。

Route::group(['middleware' => ['web']], function () {

    Route::get('home', 'BuilderController@homepage');
    Route::get('template', 'BuilderController@templates');
    Route::post('template', 'BuilderController@postDB');
    Route::get('logout', 'BuilderController@getLogout');
    Route::get('/{name}', 'BuilderController@website');
}); 

template.blade.php

<button onClick=" updateDatabase(this);" type="button" class="form-control margin btn btn-success" id="getRequest changes">
                    Save Website
                </button>

JS:

var web_name;
function updateDatabase(newCode, name_website)
{
    code2 = document.getElementById("content-link2").innerHTML;
    web_name = ($('#website_name').val());
    // make an ajax request to a PHP file
    // on our site that will update the database
    // pass in our lat/lng as parameters
    $.post('http://localhost/template', {
            _token: $('meta[name=csrf-token]').attr('content'),
            newCode: (code2),
            name_website: (web_name),
        })
        .done(function() {
        })
        .fail(function() {
            alert("error");
        });
}

编辑:我已经更新了我的代码,就像我在下面的答案中被告知的那样,但现在我得到了:

Trying to get property of non-object (View: C:\xampp\htdocs\fyproject\resources\views\layouts\website.blade.php)
in 87bb9cbe60b5bd1fe6f78e1246f2227dbd0f328f.php line 5
at CompilerEngine->handleViewException(object(ErrorException), '1') in PhpEngine.php line 44
at PhpEngine->evaluatePath('C:\xampp\htdocs\fyproject\storage\framework\views/87bb9cbe60b5bd1fe6f78e1246f2227dbd0f328f.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'name' => ' <title>Template 1</title> <link href="http://localhost/templates/css.css" rel="stylesheet" type="text/css"> <div class="logo"> <img class="images" id="image" src="#" alt="Your Logo"> </div> <div contenteditable="true" id="content" class="draggable ui-widget-content refresh ui-draggable ui-draggable-handle" style="position: relative; left: 209px; top: 139px;"><p>Change Text inside this box</p></div> <div id="editTxt" class="refresh" contenteditable="true"> <p>This text can be by the user.</p> </div> ')) in CompilerEngine.php line 59
at CompilerEngine->get('C:\xampp\htdocs\fyproject\resources\views/layouts/website.blade.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'name' => ' <title>Template 1</title> <link href="http://localhost/templates/css.css" rel="stylesheet" type="text/css"> <div class="logo"> <img class="images" id="image" src="#" alt="Your Logo"> </div> <div contenteditable="true" id="content" class="draggable ui-widget-content refresh ui-draggable ui-draggable-handle" style="position: relative; left: 209px; top: 139px;"><p>Change Text inside this box</p></div> <div id="editTxt" class="refresh" contenteditable="true"> <p>This text can be by the user.</p> </div> ')) in View.php line 149

1 个答案:

答案 0 :(得分:0)

我会建议这样的事情:

public function postDB(Request $request) {
    $newName = $request->input('name_website');
    $newLat = $request->input('newCode');
    $websites = new Website();
    $websites->name = $newName;
    $websites->html = $newLat;
    $websites->save();

    // Now we go to our other function
    $this->website($newName);
}

public function website($newName)
{
    // Return our "website" object
    $website = Website::where('name', $newName)->first();

    // Pass the contents of the "html" property to the view
    return view('layouts/website', [
        'html' => $website->html
    );
}

这样,您就可以使用$html访问刀片模板中“html”属性的内容。

修改

如果您将控制器用于API,您可能会考虑不返回视图,而是返回一个可以监听的json响应:

return response()->json([
        'url'  => $website->name,
        'html' => $website->html
]);

然后,您可以使用javascript处理页面内容或重定向