Defining content outside the controller?

大憨熊 提交于 2019-12-11 12:51:41

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!