Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.05.2019 09:48:48

Передать переменную из одного метода контроллера в другой

Доброго времени суток. Использую Laravel 5.8.17, Apache 2.4, Windows7, MS SQL 2012. Хочу передать переменную из одного public метода в другой:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class TestController extends Controller
{
    private $x;
 
    public function index()
    {
        $this->x ='111';
        echo '$this->x= '. $this->x;
    }
 
    public function message()
    {
        echo  '$this->x= '. $this->x;
    }    
}

когда вызываю метод index - выводит $this->x=111, когда вызываю метод message - выводит $this->x= и не видит значение из метода index. Все clear команды и composer dump-autoload выполнял.

Наверняка кто-то пытался такое или подобное делать. В оригинале пытаюсь передать из одного метода в другой результат запроса, так что в сессию его не хочу класть да и в Cache тоже...
Спасибо.

Не в сети

#2 15.05.2019 17:36:37

Re: Передать переменную из одного метода контроллера в другой

Чтобы при вызове message() в $x было значение '111' нужно дополнительно вызывать $this->index(),
либо размещать присвоение значения переменной в методе __construct().

Не в сети

#3 15.05.2019 19:28:41

Re: Передать переменную из одного метода контроллера в другой

DemiurgeБлагодарю за ответ.
Вот так работает, как мне надо:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
    private $x;
 
    public function index()
    {
        $this->x ='111';
    }
 
    public function message()
    {   $this->index();
        echo  '$this->x= '. $this->x;
    }    
}

На самом деле у меня в методе  index формируется коллекция  eloquent -  результат поиска, и по нажатию кнопки выводится вьюшка с результатами поиска, а в метод  message я пытаюсь передать из метода index эту самую коллекцию, чтобы потом при нажатии кнопки "Экспорт" на вьюшке с результатами происходил экспорт в  Excel, как то так:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
use App\Exports\SearchExport;
use Maatwebsite\Excel\Facades\Excel;
 
class TestController extends Controller
{
    private $x;
 
    public function index(Request $ request)
    {
       $result= Post::where('title',$request->get('title'))->get();//для примера
       $this->x=$result;
       return view('search.result',['$res'=>$result]);
    }

    public function message()//сюда хочу передать коллекцию чтобы 2 раза не считать поисковый запрос
    {
        return Excel::download(new SearchExport($this->x), 'export.xlsx');
    }    
}

Ведь если я сделаю так:

class TestController extends Controller
{
    private $x;
    public function search(Request $ request)
    {
       $result= Post::where('title',$request->get('title'))->get();//для примера
       $this->x=$result;
       return $this->x;
    }
   public function index (Request $request)//выводит результат во вьюшку при нажатии кнопки поиск на форме поиска
   {
      $this->search($request);
      $r=$this->x;
      return view ('search.result','r'=>$r);
   }
    public function message($request)//метод вызывается при нажатии на кнопку экспорт на странице, на которой уже посчитан и отображён 
                                     //результат поиска
    {    $this->search($request);//а тут я ещё раз всё ищу в БД
         $r=$this->x;
        return Excel::download(new SearchExport($r, 'export.xlsx');
    }    
}

как тут выкрутиться красиво?
PS когда я вызываю $this->search($request) в методе message,  Request  будет другой, и как следствие,  в excel  отобразится совсем не то,что во вьюшке..печаль

Изменено Landser (15.05.2019 19:39:33)

Не в сети

#4 15.05.2019 21:09:29

Re: Передать переменную из одного метода контроллера в другой

С потерей реквеста между методами справился так:

class TestController extends Controller
{
    private $x;
    public function search(Request $ request)
    {
       $result= Post::where('title',$request->get('title'))->get();//для примера
       $this->x=$result;
       return $this->x;
    }
   public function index (Request $request)
   {
      $this->search($request);
      $r=$this->x;
      $request->flash();//кладу в сессию
      return view ('search.result','r'=>$r);
   }
    public function message($request)                          
    {   
         $request->request->add($request->old());    //реквест пустой, но я в него из сессии кладу "старый" реквест
         $this->search($request);
         $r=$this->x;
        return Excel::download(new SearchExport($r, 'export.xlsx');
    }    
}

всё как мне надо, но запроса по прежнему два одинаковых...

Не в сети

#5 16.05.2019 09:49:56

Re: Передать переменную из одного метода контроллера в другой

Может лучше кэшировать не запрос, а результат поиска?

Не в сети

Подвал раздела