【问题标题】:Upon seemingly correct routing getting error Route not defined! - Laravel 4在看似正确的路由得到错误路由未定义! - Laravel 4
【发布时间】:2014-01-01 12:46:10
【问题描述】:

我正在使用 Laravel 4.1 开发一个非常基本的应用程序,用户可以在其中注册并提出问题,非常基本的东西。我现在对在 laravel 3 中看起来像这样 public $restful = true 的 restful 方法有点困惑。从那时起,laravel 发生了很大变化,我被这个 restful 想法所困扰。所以我决定离开它,继续开发我的应用程序的框架。一切都很顺利,直到我在 homeController 中创建了 postCreate 方法,让授权用户通过表单提交他们的问题。我相信我正确地路由了该方法,并且 index.blade.php 视图也很好。即使代码似乎没问题,我也无法弄清楚为什么会出现以下错误。

Route [ask] not defined. (View: C:\wamp\www\snappy\app\views\questions\index.blade.php)

如果您在这里发现我做错了什么,请您指出并提供一些解释。 我在 laravel 4 中完全是新手,尽管在以前的版本中有一些经验。

这是我在 HomeController.php 中的内容

<?php

class HomeController extends BaseController {

    public function __construct() {

        $this->beforeFilter('auth', array('only' => array('postCreate')));
    }

    public function getIndex() {

        return View::make('questions.index')
            ->with('title', 'Snappy Q&A-Home');
    }

    public function postCreate() {

        $validator = Question::validate(Input::all());

        if ( $validator->passes() ) {
            $user = Question::create( array (
                'question' => Input::get('question'),
                'user_id' => Auth::user()->id
            ));

            return Redirect::route('home')
                ->with('message', 'Your question has been posted!');
        }

        return Redirect::route('home')
            ->withErrors($validator)
            ->withInput();
    }

}

这是我在 routes.php 文件中的内容

<?php

Route::get('/', array('as'=>'home', 'uses'=>'HomeController@getindex'));
Route::get('register', array('as'=>'register', 'uses'=>'UserController@getregister'));
Route::get('login', array('as'=>'login', 'uses'=>'UserController@getlogin'));
Route::get('logout', array('as'=>'logout', 'uses'=>'UserController@getlogout'));

Route::post('register', array('before'=>'csrf', 'uses'=>'UserController@postcreate'));
Route::post('login', array('before'=>'csrf', 'uses'=>'UserController@postlogin'));
Route::post('ask', array('before'=>'csrf', 'uses'=>'HomeController@postcreate')); //This is what causing the error

最后在views/questions/index.blade.php

@extends('master.master')

@section('content')

    <div class="ask">

        <h2>Ask your question</h2>

        @if( Auth::check() )

            @if( $errors->has() )
                <p>The following erros has occured: </p>

                <ul class="form-errors">
                    {{ $errors->first('question', '<li>:message</li>') }}
                </ul>
            @endif

            {{ Form::open( array('route'=>'ask', 'method'=>'post')) }}

                {{ Form::token() }}

                {{ Form::label('question', 'Question') }}
                {{ Form::text('question', Input::old('question')) }}

                {{ Form::submit('Ask', array('class'=>'btn btn-success')) }}

            {{ Form::close() }}

        @endif

    </div>
    <!-- end ask -->

@stop

请询问您是否需要任何其他代码实例。

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    您的“询问”路线未命名。当您将'route' =&gt; 'foo' 传递给Form::open 时,假定您有一条名为“foo”的路线。将'as' =&gt; 'ask' 添加到您的 /ask 路由中,它应该可以工作。

    或者,使用 URL 或 Action 来解析表单的目标 url:

    Form::open(['url' => 'ask']);
    Form::open(['action' => 'HomeController@postCreate']);
    

    【讨论】:

    • 它有效,谢谢。请告诉我,是否可以使用 Redirect:rote() 和正则表达式路由不修复值?
    【解决方案2】:

    您在表单中使用名称路由ask,但该表单不存在。我为您创建了名称路由ask

    Route::post('ask', array('before'=>'csrf', 'as' => 'ask', 'uses'=>'HomeController@postcreate'));
    
    
    {{ Form::open( array('route'=>'ask', 'method'=>'post')) }}
                           ^^^^ -> name route `ask`
                    {{ Form::token() }}
    

    【讨论】:

    • 非常感谢您和@Andreas 抽出宝贵时间,我猜这是问题所在,但我无法理解的一件事是,如果是这样的话,其他帖子路线是如何工作的?如果您查看我的 Routes.php,您会发现我也有其他路线,它们工作得很好,尽管结构与这条路线完全相同。请解释一下为什么会这样?
    • 例如,postlogin 路由指的是这种形式,即使我没有在 routes.php 中指定 'as'=>'login' 也可以使用,如您所见 @extends('master.master ') @section('content') {{ Form::open( array('route'=>'login', 'method'=>'post') ) }} {{ Form::token() }} { { Form::label('username', 'Username') }} {{ Form::text('username', Input::old('username')) }} {{ Form::label('password', '密码') }} {{ Form::password('password') }} {{ Form::submit('Login', array('class' => 'btn btn-success')) }} {{ Form ::close() }} @stop
    • 我不知道为什么,但我可以看到你有路由 Route::get('login')Route::post('login') 并且 Laravel Restfull 控制器支持完全相同类型的路由,而 Route::post('ask') 没有 get 路由。我认为,Laravel 并没有将 ask 路由视为 restfull 路由。
    猜你喜欢
    • 2019-01-15
    • 2021-05-01
    • 2017-11-23
    • 2018-06-27
    • 2017-05-02
    • 2013-09-19
    • 2016-01-30
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多