【问题标题】:Laravel: How to share variables with parent viewLaravel:如何与父视图共享变量
【发布时间】:2017-05-19 02:42:31
【问题描述】:

我的当前状态是,我的 Laravel 应用程序中有多个项目(存储在数据库中)。我确实有以下 URL 结构:

http://app.com/project/7-exampleproject/news

在哪里

https://app.com/project/{id}-{seostring}/{module}

是它背后的想法。我需要的是项目变量应该在 {id} 部分之后的任何视图(模块)上可用。我怎样才能实现它?

==

附加信息

这里是路线列表:

GET|HEAD | project/{project}{extra?} | project.dashboard.index | App\Http\Controllers\Project\DashboardController@index | web

GET|HEAD | project/{project}{extra?}/news | project.news.index | App\Http\Controllers\Project\NewsController@index | web

GET|HEAD | project/{project}{extra?}/tournaments | project.tournaments.index | App\Http\Controllers\Project\TournamentController@index | web


Route::group(['prefix' => 'project', 'namespace' => 'Project'], function(){
Route::get('/{project}{extra?}', 'DashboardController@index')->name('project.dashboard.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);
Route::get('/{project}{extra?}/news', 'NewsController@index')->name('project.news.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);
Route::get('/{project}{extra?}/tournaments', 'TournamentController@index')->name('project.tournaments.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);

});

在每个视图中,我的 app.layouts.project 都被每个视图的内容扩展,所以我们最终得到:

@extends('layouts.project')

@section('content')
<h3>Welcome to <br>{{ $project->name }}!</h3>
@endsection

但我想要实现的是,每次调用 /project/{project} 时,视图 layouts.project 都应该获得它的活动 ID 和 $project 变量

==

我希望数据如何可用:

在我的例子中,每个模块当前都从 URL 获取活动项目(如这里的仪表板所示),已经从 URL 获取。这不是我要找的。​​p>

public function index(Project $project)
{
    return view('project.dashboard.index',[
        'project' => $project
    ]);
}

我正在寻找的是将 $project 对象(包括所有信息)包含到 layouts.project 中,其中包括元和头标题信息,以及显示项目名称本身。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    编辑 3:另一件事是您想在父视图中设置数据。即使您扩展父视图并将数据从控制器传递给子视图,您也可以这样做。希望我已经在聊天中为您澄清了一些事情。

    编辑 2:您想在视图中自动加载对象。您可以通过创建视图编辑器并读取当前路线来做到这一点。如果路由匹配,则提取项目 ID 并加载项目模型。然后,您可以访问视图中的项目对象,而无需通过控制器传递它。尽管与通过控制器传递对象相比,这样做的工作量太大,而且是不好的做法。

    编辑:在所有的 cmets 和聊天之后,我明白你想要做什么。

    这将为您提供使用路由模型绑定的 Project 对象,同时忽略不需要的 SEO 字符串。这也适用于这两种情况。

    http://app.com/project/7-exampleproject/news

    http://app.com/project/7/news

    替换 boot 中的 RouteServiceProvider

    // app/Providers/RouteServiceProvider.php
    public function boot()
    {
        parent::boot();
    
        Route::bind('project', function ($value) {
            $id = explode('-', $value)[0];
            return \App\Project::findOrFail($id);
        });
    }
    

    改变你的路线到

    // routes/web.php
    Route::group(['prefix' => 'project', 'namespace' => 'Project'], function () {
        Route::get('/{project}', 'DashboardController@index')->name('project.dashboard.index');
        Route::get('/{project}/news', 'NewsController@index')->name('project.news.index');
        Route::get('/{project}/tournaments', 'TournamentController@index')->name('project.tournaments.index');
    });
    

    路径必须作为单个参数传递,您可以在控制器中将其拆分以分别获取 id 和 seotring。像这样。

    Route::get('/project/{project}/{module}', 'SomeController@show');
    
    public function show($project, $module)
    {
        $data = explode('-', $project, 2);
    
        $id = $data[0];
        $name = $data[1];
    
        return view('someview')->with(compact('id', 'name'));
    }
    

    【讨论】:

    • 感谢您的快速答复。目前,我在 NewsController@show 中拥有自己的功能(例如 $module = 'news')中的每个模块。我可以在你的上层函数中调用这些函数吗?
    • 你能运行php artisan route:list 并发布结果吗?是的,您可以在该路径的任何控制器中使用此逻辑并毫无问题地提取 id 和字符串。
    • 将其作为上面的答案发布。
    • @Astinox 你的路线有点错误。通过编辑在您的主要问题中发布您的路线。我将修复路线并向您展示如何访问该物业。也尝试发布您的控制器方法,我只需要查看您正在使用的方法参数。
    • 我已经发布了上面的所有内容,并对其进行了编辑。但我想你误会了我。我不是在寻找在每个视图中获取 id 的方法,我正在尝试实现,如果有人调用任何 /project/{id} URL,该对象将与其父视图共享
    【解决方案2】:

    我认为您正在寻找ViewComposers,它不是基于url,而是基于视图名称。 我个人的看法是,这比基于 URL 的方法更好,因为 URL 的变化比视图名称更频繁。

    【讨论】:

    • 这听起来像是我正在寻找的东西。在文档中我可以看到我可以使用通配符,我也可以在视图名称中使用通配符吗?在我当前的结构中,这将包括 project.* -> 如果可能的话,自动扩展 layouts.project 视图。另外,我如何才能在其中包含我当前的 ID?
    • 我是这样使用的: $this->app->make('view')->composer('*.dashboard', 'App\Http\ViewComposers\DashIcons');这对我来说很完美!
    • 在这种情况下,我仍然没有活动项目的 ID 或对象,或者我可以从请求中获取它吗?
    • 这不是我认为最好的方法,但我这样做:{{Request::segment(2)}}
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多