使用路线的laravel中的轮廓的URL结构

时间:2013-11-30 04:49:47

标签: php laravel laravel-4 laravel-routing

我正在设置一个哨兵laravel 4。

此时对于个人资料视图我应该像这样链接

http://localhost/ffdd/public/3/show

其中3是用户ID

我正在使用以下路线

Route::get('/{profile}/show', array('as' => 'profile.show', 'uses' => 'ProfilesController@show'));

我需要相同的链接结果

http://localhost/ffdd/public/3

我应该在路线上改变什么。

以及将来我希望此用户ID位置为用户名。

编辑2

我目前的路线结构是这样的。

Route::get('/{userId?}', array('as' => 'profile', 'uses' => 'ProfilesController@index')); 
Route::post('/{userId?}', array('as' => 'profile-koko', 'uses' => 'Controllers\Account\ProfileController@postIndex'));

Route::get('/{profile}/show', array('as' => 'profile.show', 'uses' => 'ProfilesController@show'));

当profilesController的索引收到路由请求时,只需将其转发给show method。

 // User is logged in
                $user = Sentry::getUser();
                $user = $user->id;

                //return View::make('profiles.index');
                return Redirect::action('ProfilesController@show', array('userId'=>$user));
            }

当我使用此

Route::get('{profile}',array(
        'as'    =>  'test2',
        'uses'  =>  'ProfilesController@show',
    ));

正如我的朋友itachi在回答中所说的那样!

我收到此错误!

Some mandatory parameters are missing ("profile") to generate a URL for route "profile.show".

编辑3

<?php

# Profile

Route::get('/{userId?}', array('as' => 'profile', 'uses' => 'ProfilesController@index')); 
Route::post('/{userId?}', array('as' => 'profile-koko', 'uses' => 'Controllers\Account\ProfileController@postIndex'));

Route::resource('profile', 'ProfilesController@show');


Route::get('{profile}/show',array(
        'as'    =>  'profile.show',
        'uses'  =>  'ProfilesController@show',
    ));

    Route::get('{profile}',array(
        'as'    =>  'test2',
        'uses'  =>  'ProfilesController@show',
    ));

1 个答案:

答案 0 :(得分:2)

我没有看到为同一行动定义两条路线的任何用途。但是,如果你想要它,它就在这里。

只需创建指向同一操作的两条路线。例如

    Route::get('{profile}/show',array(
        'as'    =>  'test1',
        'uses'  =>  'ProfileController@show',
    ));

    Route::get('{profile}',array(
        'as'    =>  'test2',
        'uses'  =>  'ProfileController@show',
    ));

现在,您可以访问路线http://localhost/ffdd/public/3/showhttp://localhost/ffdd/public/3

但这里有一个问题。 {profile}参数可以匹配任何内容。

e.g。

http:// localhost / ffdd / public / 3 / show [会按预期调用ProfileController @ show]

http:// localhost / ffdd / public / asdf / show [也会调用ProfileController @ show 这是不可能的!]

为了避免这个问题,你有两种方法。

  1. 在文件的最后声明这两条路由,以便其他路由优先。

  2. 由于{profile}必须是[现在]的ID,所以让我们通过声明以下内容来约束它,

  3. Route::pattern('profile', '[0-9]+');

    现在,{profile}只会匹配数字。

    所以整个代码变为

        Route::pattern('profile', '[0-9]+');
    
        Route::get('{profile}/show',array(
            'as'    =>  'test1',
            'uses'  =>  'ProfileController@show',
        ));
    
        Route::get('{profile}',array(
            'as'    =>  'test2',
            'uses'  =>  'ProfileController@show',
        ));
    

    此处不存在任何冲突,因为{profile}必须是数字才能唤起ProfileController@show操作。

    放置约束的替代方法

    还有一种使用where放置约束的替代方法。

    e.g。

    Route::get('{profile}/show',array(
        'as'    =>  'test1',
        'uses'  =>  'ProfileController@show',
    ))->where('profile', '[0-9]+');
    

    但是如果你这样做,你需要将where放在你使用的每个路由{profile}中。