2013-04-16 11 views
5

Ich habe einen Basiscontroller mit einer Methode, um einen Twitter-Feed zu meiner Ansicht zurückzukehren.Laravel: Übergeben von Daten zu default.blade.php von Basiscontroller

Ich möchte dies in der Ansicht von der Seitenansicht auf die Standard-Blade verschieben, um die Redundanz zu reduzieren, da es Site-weit erscheinen wird. Wie übermittele ich Daten vom Basis-Controller zum Blade?

ich es meiner Ansicht von der Seite Controller wie so senden kann:

public function get_index() 
{ 
    .................. 
    $this->layout->nest('content', 'home.index', array(
     'tweets' => $this->get_tweet() 
    )); 
} 

und in der Ansicht, Ausgabe, die es wie folgt aus:

if ($tweets) 
{ 
    foreach ($tweets as $tweet) 
    { 
     .............. 

ich tun möchte, das alles von innen default.blade.php und mein Base_Contoller:

<?php 
class Base_Controller extends Controller { 
    /** 
    * Catch-all method for requests that can't be matched. 
    * 
    * @param string $method 
    * @param array  $parameters 
    * @return Response 
    */ 
    public function __call($method, $parameters) 
    { 
     return Response::error('404'); 
    } 

    public function get_tweet() 
    { 
     ........... 
     return $tweets; 
    } 
} 

Wie ist das möglich?

/////////////////////// UPDATE ///////////////////////// //////

application/models/tweets.php

<?php 
class Tweets { 
    public static function get($count = 3) 
    { 
     Autoloader::map(array(
     'tmhOAuth'  => path('app'). 
       'libraries/tmhOAuth-master/tmhOAuth.php', 
      'tmhUtilities' => path('app'). 
       'libraries/tmhOAuth-master/tmhUtilities.php' 
     )); 
     $tmhOAuth = new tmhOAuth(array(
      'consumer_key'  => 'xxx', 
      'consumer_secret'  => 'xxx', 
      'user_token'   => 'xxxxx', 
      'user_secret'   => 'xxxxx', 
      'curl_ssl_verifypeer' => false 
     )); 
     $code = $tmhOAuth->request('GET', 
     $tmhOAuth->url('1.1/statuses/user_timeline'), array(
      'screen_name' => 'xxx', 
      'count' => $count 
     )); 
     $response = $tmhOAuth->response['response']; 
     $tweets = json_decode($response, true); 
     return $tweets; 
    } 
} 

application/views/widgets/tweets.blade.php

@foreach ($tweets) 
    test 
@endforeach 

application/views/layouts/default. blade.php

.... 
{{ $tweets }} 
.... 

application/composers.php

<?php 
View::composer('widgets.tweets', function($view) 
{ 
    $view->tweets = Tweets::get(); 
}); 
View::composer('layouts.default', function($view) 
{ 
    $view->nest('tweets', 'widgets.tweets'); 
}); 

application/controllers/base.php

<?php 
class Base_Controller extends Controller { 

    /** 
    * Catch-all method for requests that can't be matched. 
    * 
    * @param string $method 
    * @param array  $parameters 
    * @return Response 
    */ 
    public $layout = 'layouts.default'; 

    public function __call($method, $parameters) 
    { 
     return Response::error('404'); 

    } 

} 

application/controllers/home.php

<?php 
class Home_Controller extends Base_Controller { 

    public $layout = 'layouts.default'; 

    public $restful = true; 

    public function get_index() 
    { 
     Asset::add('modernizr', 'js/thirdparty/modernizr.js'); 
     Asset::add('jquery', 
      'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'); 
     Asset::add('scripts', 'js/scripts.js'); 

     $this->layout->title = 'title'; 
     $this->layout->nest('content', 'home.index', array(
      //'data' => $some_data 
     )); 
    } 
} 

gibt mir eine

Un definierte Variable: Tweets

Fehler

+0

Haben Sie Ihre Tweets in Ihrem Layout gerendert werden soll, oder immer innerhalb des Inhalts verschachtelt? –

+0

Entweder um ehrlich zu sein. Ich rende sie nur in der Ansicht, bis ich eine bessere/sauberere Art finde, es zu tun – Fraser

+0

Aber Sie würden stattdessen einen Platz in Ihrem Layout für sie finden? Ich frage, weil es mir hilft, die bessere Antwort für dich zu schreiben :) –

Antwort

12

Schritt 1 sehen - Make a Sehen Sie nur für Ihre Tweets, nennen wir es widgets/tweets.blade.php, das wird Ihre $tweets Daten akzeptieren. Dies macht es sehr einfach, die Tweets-Ansicht in der Zukunft zwischenzuspeichern, wenn Sie etwas mehr Leistung wünschen. Wir möchten auch ein Modell, das die Tweet-Daten für Sie generiert.

Schritt 2 - Übergeben Sie die Tweet-Daten in Ihre Tweets-Ansicht, verwenden Sie hierfür eine View Composer, damit die Logik mit (aber außerhalb) der Ansicht beibehalten wird.

Schritt 3 - Erstellen Sie Ihr Standardlayout, nennen wir das layout/default.blade.php. Dies wird akzeptiert $content und $tweets. Wir werden die Tweets-Ansicht mit einer anderen View Composer verschachteln. Sie können die $content in Ihre Controller-Aktionen verschachteln.

Schritt 4 - Setzen Sie die $layout auf Ihre Base_Controller.

Schritt 5 - Profit!

Hinweis - Wenn diese ersten Blick Komponisten sind dann müssen Sie sie enthalten müssen in application/start.php


// application/models/tweets.php 
class Tweets { 
    public static function get($count = 5) 
    { 
     // get your tweets and return them 
    } 
} 

// application/views/widgets/tweets.blade.php 
@foreach ($tweets) 
    {{-- do something with your tweets --}} 
@endforeach 

// application/views/layouts/default.blade.php 
<section class="main">{{ isset($content) ? $content : '' }}</section> 
<aside class="widget widget-tweets">{{ $tweets }}</aside> 

// application/composers.php 
View::composer('widgets.tweets', function($view) 
{ 
    $view->tweets = Tweets::get(); 
}); 
View::composer('layouts.default', function($view) 
{ 
    $view->nest('tweets', 'widgets.tweets'); 
}); 

// application/start.php (at the bottom) 
include path('app').'composers.php'; 

// application/controllers/base.php 
class Base_Controller extends Controller { 
    public $layout = 'layouts.default'; 
} 

// application/controllers/home.php 
class Home_Controller extends Base_Controller { 

    public $restful = true; 

    public function get_index() 
    { 
     $this->layout->nest('content', 'home.welcome'); 
    } 

} 
+0

Ehrfürchtig. Vielen Dank, dass Sie sich die Zeit genommen haben. Es ist sehr geschätzt. Ich habe gerade erst auf Laravel angefangen, aber ich liebe es! – Fraser

+0

Hallo, Danke nochmal für das oben genannte. Ich habe versucht, es zu implementieren, aber bekomme undefinierte Variable: Tweets von default.blade. Irgendwelche Ideen? Ich habe meinen Beitrag oben mit meinem Code aktualisiert. Prost – Fraser

+0

Hi @Fraser Ich habe einen Schritt komplett vergessen, Sie müssen die Datei composers.php hinzufügen, Sie können dies in 'application/start.php' tun. –

6
View::share('key', 'value'); 

in Sie verwenden (Blade-Syntax)

{{$key}} 

oder (PHP-Syntax)

echo $key; 
+1

Nicht immer fällt auf 'View :: share()' - es ist eine großartige Lösung für einige Dinge, aber in vielen Fällen ist es so schlecht wie eine [globale Variable] (http://c2.com/ cgi/wiki? GlobalVariablesAreBad) –

+0

@PhillSparks, stimme zu. – Usman

Verwandte Themen