循环时在URL :: route()中回显动态路由名称

时间:2015-01-06 22:55:29

标签: php laravel foreach echo blade

我有一个数组,其中每个部分都包含有关其状态路径名称的信息:

$sections = array(
    'Section_1' => array(
        'status' => 1,
        'route' => 'section1.route'
        ),
    'Section_2' => array(
        'status' => 0,
        'route' => 'section2.route'
        ),
    'Section_3' => array(
        'status' => 1,
        'route' => 'section3.route'
        )
    );

我试图遍历它以创建HTML列表。

我试过这个(1):

@foreach ($sections as $dataName => $details)
    <li>
        <a href="{{ URL::route($details['route']) }}">{{ $dataName }}</a>
    </li>
@endforeach

这(2):

@foreach ($sections as $dataName => $details)
    <li>
        <?php $routeName = $details['route']; ?>
        <a href="{{ URL::route($routeName) }}">{{{ $dataName }}}</a>
    </li>
@endforeach

这个(3):

@foreach ($sections as $dataName => $details)
    <li>
        <?php $routeName = URL::route($details['route']); ?>
        <a href="<?php echo $routeName; ?>">{{{ $dataName }}}</a>
    </li>
@endforeach

以上所有内容都会产生同样的错误:

路线[]未定义。

InvalidArgumentException(&#34; Route [{$ name}]未定义。&#34;)

数组中的所有路由都存在 - 检查它们是否存在拼写错误等。我有一种感觉,这可能是微不足道的,但我不知道是什么。有什么想法吗?

PS。我知道我可以在数组中存储完整的路由,比如'route' => URL::route('section1.route')等。但是上面的代码有什么问题?

编辑:示例路线

Route::get('user/show/section1',
    array(
        'before' => 'auth',
        'uses' => 'UserController@showSection1',
        'as' => 'section1.route'
        )
    );

我正在使用命名路线。

2 个答案:

答案 0 :(得分:0)

好的,经过简单的测试,我创建了如下的模拟代码。

在我的路线上,我设置了这个:

Route::get('user/show/section1',
    array(
        'before' => 'auth',
        'uses'   => 'HomeController@showWelcome',
        'as'     => 'section1.route'
    )
);

Route::get('user/show/section2',
    array(
        'before' => 'auth',
        'uses'   => 'HomeController@s2',
        'as'     => 'section2.route'
    )
);
Route::get('user/show/section3',
    array(
        'before' => 'auth',
        'uses'   => 'HomeController@s2',
        'as'     => 'section3.route'
    )
);

我控制器上的模拟方法:

public function showWelcome()
    {
        $sections = array(
            'Section_1' => array(
                'status' => 1,
                'route' => 'section1.route'
            ),
            'Section_2' => array(
                'status' => 0,
                'route' => 'section2.route'
            ),
            'Section_3' => array(
                'status' => 1,
                'route' => 'section3.route'
            )
        );

        return View::make('hello')->with('sections', $sections);
    }

    public function s2()
    {

    }

    public function s3()
    {

    }

然后使用第一种方法将其循环播放

@foreach($sections as $dataName => $details)
    <li>
        <a href="{{ URL::route($details['route']) }}">{{ $dataName }}</a>
    </li>
@endforeach

是的,我把结果作为一个HTML链接:

 <li>
    <a href="http://exam.com/public/user/show/section1">Section_1</a>
 </li>
 <li>
    <a href="http://exam.com/public/user/show/section2">Section_2</a>
 </li>
 <li>
    <a href="http://exam.com/public/user/show/section2">Section_3</a>
 </li>

Page source screenshot

请检查您的routes.php,检查是否有其他路线采用您的控制器方法。它位于您的路线和控制器之间。数组已经以正确的方式传递给视图。与此毫无关系。

答案 1 :(得分:0)

我认为没有理由不这样做,除非$sections没有传递给视图,或者路由名称与您在路径文件中指定的路径名​​称不匹配。

@foreach ($sections as $dataName => $details)
    <li>
        <a href="{{ route($details['route']) }}">{{ $dataName }}</a>
    </li>
@endforeach

除非您使用的是Laravel 5(尚未发布)?

如果是这样,那么您可能需要使用新的刀片语法:{!! route($details['route']) !!}