问题
In Laravel, every method in the controller will contain $heading['panelText']
For example:
public function pageName1()
{
$heading['panelText'][] = "Content Here one";
$heading['panelText'][] = "Content Here Two";
$heading['panelText'][] = "Content Here Three";
return View('mockup/pagename1', compact('heading'));
}
public function pageName2()
{
$heading['panelText'][] = "Some Random one";
$heading['panelText'][] = "Some Random Line Two";
return View('mockup/pagename2', compact('heading'));
}
In the blade file, it would look something like that
@foreach($heading['panelText'] as $content)
<p>{{$content}}</p>
@endforeach
As you can see the controller methods can get a bit messy. I am looking for a cleaner solution I don't have to define the value for $heading['panelText']
in controller methods? Maybe create a library to have a list of $heading
content and the controller will use that library or how do I go about this?
回答1:
Does this only applies on controllers? If so I would create a ControllerClass and extend all of my controllers from that. Something like this:
class HeadController extends Controller
{
protected $heading = [];
public function header1(){
$this->heading['panelText'][] = "Content Here one";
$this->heading['panelText'][] = "Content Here Two";
$this->heading['panelText'][] = "Content Here Three";
return $this;
}
public function header2(){
$this->heading['panelText'][] = "Some Random one";
$this->heading['panelText'][] = "Some Random Line Two";
return $this;
}
public function setPanelText(array $panelTexts){
foreach($panelTexts as $panelText){
$this->heading['panelText'][] = $panelText;
}
return $this;
}
public function loadView($view){
return View($view)->withHeading($this->heading);
}
}
Then yon your controller you could do something like this:
class YourController extends HeadController{
public function pageName1(){
return $this->header1()->loadView('mockup/pagename1');
}
public function pageName2(){
return $this->header2()->loadView('mockup/pagename2');
}
public function customPage3(){
//setting on the controller
$panelTexts = [
"Some Random line One for page 3",
"Some Random Line Two for page 3",
];
return $this->setPanelText($panelTexts)->loadView('mockup/pagename3');
}
}
Alternative with a Helper Class:
<?php namespace Your\Namespace;
use View;
class Helper
{
protected $heading = [];
public function header1(){
$this->heading['panelText'][] = "Content Here one";
$this->heading['panelText'][] = "Content Here Two";
$this->heading['panelText'][] = "Content Here Three";
return $this;
}
public function header2(){
$this->heading['panelText'][] = "Some Random one";
$this->heading['panelText'][] = "Some Random Line Two";
return $this;
}
public function setPanelText(array $panelTexts){
foreach($panelTexts as $panelText){
$this->heading['panelText'][] = $panelText;
}
return $this;
}
public function loadView($view){
return View($view)->withHeading($this->heading);
}
}
Then on your controller you could do something like this:
<?php namespace Your\Controllers\Namespace;
use Your\Namespace\Helper;
class YourController extends Controller{
protected $helper;
public function __construct(Helper $helper){
$this->helper = $helper;
}
public function pageName1(){
return $this->helper->header1()->loadView('mockup/pagename1');
}
public function pageName2(){
return $this->helper->header2()->loadView('mockup/pagename2');
}
public function customPage3(){
//setting on the controller
$panelTexts = [
"Some Random line One for page 3",
"Some Random Line Two for page 3",
];
return $this->helper->setPanelText($panelTexts)->loadView('mockup/pagename3');
}
}
回答2:
You can create a composer which will automatically attach this to all your views.
view()->composer('*', function($view) {
$panelText = [
'Content Here one',
'Content Here Two',
'Content Here Three'
];
return $view->with('panelText', $panelText);
});
You can read more about view composers here: https://laravel.com/docs/5.2/views#view-composers
来源:https://stackoverflow.com/questions/34678736/defining-content-outside-the-controller