【问题标题】:laravel 5.4 pass data to create controllerlaravel 5.4 传递数据创建控制器
【发布时间】:2017-04-04 22:40:33
【问题描述】:

我有一个视图 /station/{id},其中包含一个新闻广播列表。我想在列表中创建一个新闻广播。

station.show.blade:

<td colspan="11">
    @can('newscast_edit')
    <a href="{{ route('newscast.create', [$station->id]) }}"
       class="btn btn-xs btn-info">Add Newscast</a>
    @endcan
</td>

NewscastsController 中:
(更改前)

/**
 * Show the form for creating new Newscast.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    if (!Gate::allows('newscast_create')) {
        return abort(401);
    }
    $relations = [
        'for_stations' => \App\Station::get()->pluck('calls', 'id')->prepend('Please select', ''),
    ];
    $backUrl = Session('_previous');
    session(['backUrl' => $backUrl]);

    return view('newscast.create', $relations);
}

newscast.create.blade:

<div class="panel panel-default">
    <div class="panel-body">
        <div class="row">
            <div class="col-xs-12 form-group">
                {!! Form::label('for_station_id', 'For Station*', ['class' => 'control-label']) !!}
                {!! Form::select('for_station_id', $for_stations, old('for_station_id'), ['class' => 'form-control
                select2']) !!}
                <p class="help-block"></p>
                @if($errors->has('for_station_id'))
                <p class="help-block">
                    {{ $errors->first('for_station_id') }}
                </p>
                @endif
            </div>
        </div>
    </div>
</div>

我的目标是删除 NewscastsController 中的 relations 行并将电台 ID 传递给 newscast.create.blade 以代替 select,如 @ 987654328@

我尝试了几种解决方法,包括Passing data from controller to view in Laravelhttps://laravel.io/forum/07-26-2014-routing-passing-parameters-to-controller,但均未成功。

修改create函数为public function create($station_id) 导致此错误: ReflectionException in RouteDependencyResolverTrait.php line 57: Internal error: Failed to retrieve the default value

我也用谷歌搜索了该错误消息,但没有提出任何改进。 我敢肯定,这可能是在炫耀我在 php 和 Laravel 中仍然是一个菜鸟。我错过了什么?

【问题讨论】:

  • 如果你转储$for_stations,你会看到什么?另外,您的 routes.php 文件中有什么内容?
  • 在 web.php(路由文件)//Newscasts routes Route::resource('newscast', 'NewscastsController'); Route::post('newscasts_mass_destroy', ['uses' =&gt; 'NewscastsController@massDestroy', 'as' =&gt; 'newscasts.mass_destroy']);
  • 我无法使用上面的代码访问$for_stations。将 station.show.blade 更改为 &lt;a href="{{ route('newscast.create') }}"NewscastController 后,控制器传递的 $relations 数组中有 26 个条目,并且在create.blade 中的 for_stations 数组——两者的内容应该是相同的。

标签: laravel laravel-5.4


【解决方案1】:

因为您正在通过传递参数来修改默认的create() 函数,所以您不能再从Route::resource() 使用它。因此,你必须手动定义它,上面Route::resource('newscast')

Route::get('newscast/{station_id}', 'NewscastController@create')->name('newscast.create');

//Define your resource routes, excluding 'create'
Route::resource('newscast', 'NewscastsController', ['except' => ['create']);

然后在您的控制器中,您可以毫无问题地传递您的参数

public function create($station_id)

【讨论】:

  • 我试过这个并且得到一个不同的错误:array_merge(): Argument #2 is not an array in Factory.php line 134 at HandleExceptions-&gt;handleError(2, 'array_merge(): Argument #2 is not an array', '/var/www/vnc/vendor/laravel/framework/src/Illuminate/View/Factory.php', 134, array('view' =&gt; 'newscast.create', 'data' =&gt; '4', 'mergeData' =&gt; array(), 'path' =&gt; '/var/www/vnc/resources/views/newscast/create.blade.php')) 创建 URL 现在显示为 newscast/$station_id - 这不是与具有相同编号的实际新闻广播(例如 newscast/9)?
【解决方案2】:

解决方案是进行以下更改:

NewscastsController 中:

public function create($id, $calls)
{
    if (! Gate::allows('newscast_create')) {
        return abort(401);
    }

    $backUrl = Session('_previous');
    session(['backUrl' => $backUrl]);
    return view('newscast.create', [ 'station_id' => $id, 'calls' => $calls ]);
}  

(当我得到第一个参数时,我最终传递了第二个参数。)

web.php(路由器)中:
Route::get('newscast/create/{station_id}/{calls}', 'NewscastsController@create')->name('newscast.create');
station.show.blade
&lt;a href="{{ route('newscast.create', [$station-&gt;id, $station-&gt;calls]) }}" class="btn btn-xs btn-info"&gt;Add Newscast&lt;/a&gt;

newscast.create.blade

<h3 class="page-title">Add Newscast for {{ $calls }}</h3>
{!! Form::open(['method' => 'POST', 'route' => ['newscast.store']]) !!}

<div class="panel panel-default">
    <div class="panel-body">
        <div class="row">
            <div class="col-xs-12 form-group">
                {!! Form::hidden('for_station_id', $station_id, old('for_station_id'), ['class' => 'form-control']) !!}
            </div>
        </div>

这似乎基本上是@EddyTheDove 推荐的内容,但要么我没有正确理解该推荐,要么我在第一次进行这些更改时发生了其他事情导致它出错。对我来说最终的解决方案是当我偶然发现 Laravel 5 的 DebugBar 包(“barryvdh/laravel-debugbar”:“^2.3”)并能够挖掘整个请求时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2017-07-27
    • 2017-12-27
    • 2013-05-31
    • 2019-04-15
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多