1

コントローラーのないアプリケーションがあり、laravel 4 のドキュメントこの他の記事でコントローラーのレイアウトについて読んでいますが、ルート (バージョン 4) 内で実装するためにどこから始めればよいかわかりません。

受信したエラー: InvalidArgumentException、ビュー [マスター] が見つかりません。

app/routes.php

<?php
View::name('layouts.master', 'layout');
$layout = View::of('layout');
Route::get('users/create', array('as' => 'users.create', function() use($layout) {
  //@TODO: load view using 'layouts.master',
  //       desirable: append 'users.create' and 'users.menu' views to sidebar and content sections.
  //return View::make('users.create');
  return $layout->nest('content', 'master');
  }));
?>

アプリ/ビュー/レイアウト/master.blade.php

<html>
  <body>
    @section('sidebar')
      This is the master sidebar.
    @show

    <div class="container">
      @yield('content')
    </div>
  </body>
</html>

アプリ/ビュー/ユーザー/create.blade.php

{{ Form::open() }}

{{ Form::text('name') }}
{{ Form::submit('submit') }}

{{ Form::close() }}

アプリ/ビュー/ユーザー/menu.blade.php

<!-- This is appended to the master sidebar -->
<p><a href="users/create">Create user</a></p>

更新:やりたいことを明確にするためにサンプルコードを変更しました。チェックapp/routes.phpとそのコメント

4

4 に答える 4

4

ルート ファイル内のコードは、マスター レイアウトをそれ自体の中に入れ子にしようとしていますが、これは実際には望んでいるものではありません。'master'を探すため、エラーが発生していますapp/views/master.blade.php。に変更することで簡単に修正でき'layouts.master'ますが、何が起こるか考えたくありません...

あなたが抱えている問題の根本的な原因は、Blade テンプレートからビューを「生成」することと、ルートからビューをネストすることの違いです。ルートをネストするときは、タグechoを使用するのではなく、ルートをネストする必要があります。@yield

// File: app/routes.php

View::name('layouts.master', 'layout');
$layout = View::of('layout');

Route::get('users/create', array('as' => 'users.create', function() use ($layout)
{
    return $layout
            ->nest('content', 'users.create')
            ->nest('sidebar', 'users.menu');
}));


/*
|--------------------------------------------------------------------------
| View Composer
|--------------------------------------------------------------------------
|
| Code in this method will be applied to all views that use the master
| layout. We use that to our advantage by injecting an "empty" sidebar
| when none is set when returning the view. It will error otherwise.
|
*/

View::composer('layouts.master', function($view)
{
    if (!array_key_exists('sidebar', $view->getData()))
    {
        $view->with('sidebar', '');
    }
});


// File: app/views/layouts/master.blade.php

<html>
<body>
    @section('sidebar')
        This is the master sidebar
        {{ $sidebar }}
    @show

    <div class="container">
        {{ $content }}
    </div>
</body>
</html>

Laravel のView コンポーザーは強力なツールです。同じテンプレートを共有するすべてのビューで使用されるデータ (ログインしたユーザー情報など) がある場合、コンポーザを使用して、ビューをロードするたびにデータを注入する手間を省くことができます。

于 2013-06-22T02:54:35.517 に答える
0

コントローラールーティングを使用して可能な解決策としてこれを投げるだけです(一方、コントローラー内からテンプレートを設定できます)。

app/routes.php

Route::controller('something', 'SomethingController');

アプリ/コントローラー/SomethingController.php

class SomethingController extends BaseController {
  protected $layout = "templates.main"; // denotes views/templates/main.blade.php

  public function getIndex() { // the "landing" page for "/something" or "/something/index"
    $this->layout->content = View::make('something.index')->with("myVar", "Hello, world!"); // load in views/something/index.blade.php INTO main.blade.php
  }

  public function getTest() { // for "/something/test"
    $this->layout->content = View::make('something.index')->nest("widget", "something.widget", array("myVar" => "Hello, World!"));
  }
}

アプリ/ビュー/テンプレート/main.blade.php

@include('templates.partials.header')
@yield('something')
@yield('content')
@include('templates.partials.footer')

アプリ/ビュー/何か/widget.blade.php

I'm a widget. {{ $myVar }}

アプリ/ビュー/何か/index.blade.php

@section('something')
  I will go in the 'something' yield in main.blade.php
@stop

@section('content')
  I will go in the 'content' yield in main.blade.php.

  {{ $myVar }}

  {{ $widget }}
@stop

?>

http://myserver/somethingこれで、テストして違いを確認できますhttp://myserver/something/test。注: テストされていませんが、大まかな例として。

于 2013-06-25T21:10:26.840 に答える
0

ブレードを使用している場合は、ネスト ビューを使用する必要はありません。

アプリ/ビュー/ユーザー/create.blade.php

拡張する必要がありますmaster.blade

@extends('layouts.master')
@section('content')
// form stuff here
@stop

今、あなたがする必要があるのは電話するだけですcreate.blade

return View::make('users.create')

于 2013-06-25T00:15:33.063 に答える
0

テンプレートにブレードを使用していると仮定して、@parent タグを使用してコンテンツを追加することもできます。例(ビュー内)

@section('sidebar')
    @parent
    <p>This is appended to the master sidebar.</p>
@stop
于 2013-06-14T18:31:05.170 に答える