Laravel по-русски
Русское сообщество разработки на PHP-фреймворке Laravel.
- Форум
- » Laravel 5.x
- » Передать переменную из одного метода контроллера в другой
Страницы 1
#1 15.05.2019 09:48:48
Landser Сообщений: 9 Статей: 1
Передать переменную из одного метода контроллера в другой
Доброго времени суток. Использую Laravel 5.8.17 , Apache 2.4, Windows7, MS SQL 2012. Хочу передать переменную из одного public метода в другой:
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 тоже.
Спасибо.
Не в сети 29.06.2017
#2 15.05.2019 17:36:37
Demiurge +93 Сообщений: 12 Статей: 2
Re: Передать переменную из одного метода контроллера в другой
Чтобы при вызове message() в $x было значение ‘111’ нужно дополнительно вызывать $this->index(),
либо размещать присвоение значения переменной в методе __construct().
Не в сети 04.04.2019
#3 15.05.2019 19:28:41
Landser Сообщений: 9 Статей: 1
Re: Передать переменную из одного метода контроллера в другой
DemiurgeБлагодарю за ответ.
Вот так работает, как мне надо:
x ='111'; > public function message() < $this->index(); echo '$this->x= '. $this->x; > >
На самом деле у меня в методе index формируется коллекция eloquent — результат поиска, и по нажатию кнопки выводится вьюшка с результатами поиска, а в метод message я пытаюсь передать из метода index эту самую коллекцию, чтобы потом при нажатии кнопки «Экспорт» на вьюшке с результатами происходил экспорт в Excel, как то так:
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)
Как передать переменную из одного метода в другой? Java
Первый из класса Interpreter принимает какую то строку и передает ее во второй, чтобы тот можно было вызвать в JFrame и засунуть эту строчку в текст арею. Проблема в том, что InterpreterMediator1 строка приходит корректно, а вот в InterpreterMediator2 я уже получаю null если, например, вывести то, что я получил через System.out. Проблема, видимо, в том что когда я в InterpreterMediator2 пытаюсь показать строку, то она еще пустая, потому и null, но как решить эту проблему я так и не понял. Я пытался ставить там Thread.sleep, но он ждет отведенное время и показывает мне null, хотя строка уже должна была прийти. Как мне в InterpreterMediator2 корректно получить строки? Весь проект — это интерпретатор Бейсика, к которому я пытаюсь прикрутить ГУИ. Исходный код интерпретатора для меня очень сложный, поэтому делаю тупые костыли в виде классов посредников, которые бы передавали выводимую интерпретатором инфу в JFrame. Если нужно будет, то скину код всего остального.
Как передать переменную из метода одного класса в метод другого класса?
Ребята, помогите! Такая проблема: есть 2 класса, условно ClassA и ClassB. В ClassA есть метод createName, который имеет переменную String name. В этот метод я передаю имя. То есть ClassA выглядит примерно так:
public ClassA public void createName(String newName) String name = newName;
>
>
В другом же классе (ClassB) в методе мне нужно получить переменную name, то есть что-то вроде такого:
public ClassB public void wantMyName() «И вот тут мне нужно получить мое name»
>
>
Пример сильно утрирован, потому что на самом деле я много всего опустил, но смысл проблемы именно в этом. Вроде пробовал в ClassA объявлять глобальную переменную public static String name, но то ли я что-то не так понимаю и делаю, то ли это вообще не должно работать. И, если это важно, на ClassA навешена аннотация @RequestScoped. В общем, ребята, помогите! Заранее спасибо!
- Вопрос задан более двух лет назад
- 585 просмотров
1 комментарий
Простой 1 комментарий
Как передать переменную из одного метода в другой java
Существует два способа передачи параметров в метод в языке C#: по значению и по ссылке .
Передача параметров по значению
Наиболее простой способ передачи параметров представляет передача по значению, по сути это обычный способ передачи параметров:
void Increment(int n) < n++; Console.WriteLine($"Число в методе Increment: "); > int number = 5; Console.WriteLine($"Число до метода Increment: "); Increment(number); Console.WriteLine($"Число после метода Increment: ");
Число до метода Increment: 5 Число в методе Increment: 6 Число после метода Increment: 5
При передаче аргументов параметрам по значению параметр метода получает не саму переменную, а ее копию и далее работает с этой копией независимо от самой переменной.
Так, выше при вызове метод Increment получает копию переменной number и увеличивает значение этой копии. Поэтому в самом методе Increment мы видим, что значение параметра n увеличилось на 1, но после выполнения метода переменная number имеет прежнее значение — 5. То есть изменяется копия, а сама переменная не изменяется.
Передача параметров по ссылке и модификатор ref
При передаче параметров по ссылке перед параметрами используется модификатор ref :
void Increment(ref int n) < n++; Console.WriteLine($"Число в методе Increment: "); > int number = 5; Console.WriteLine($"Число до метода Increment: "); Increment(ref number); Console.WriteLine($"Число после метода Increment: ");
Число до метода Increment: 5 Число в методе Increment: 6 Число после метода Increment: 6
При передаче значений параметрам по ссылке метод получает адрес переменной в памяти. И, таким образом, если в методе изменяется значение параметра, передаваемого по ссылке, то также изменяется и значение переменной, которая передается на его место..
Так, в метод Increment передается ссылка на саму переменную number в памяти. И если значение параметра n в Increment изменяется, то это приводит и к изменению переменной number, так как и параметр n и переменная number указывают на один и тот же адрес в памяти.
Обратите внимание, что модификатор ref указывается как перед параметром при объявлении метода, так и при вызове метода перед аргументом, который передается параметру.
Выходные параметры. Модификатор out
Выше мы использовали входные параметры. Но параметры могут быть также выходными. Чтобы сделать параметр выходным, перед ним ставится модификатор out :
void Sum(int x, int y, out int result)
Здесь результат возвращается не через оператор return , а через выходной параметр result. Использование в программе:
void Sum(int x, int y, out int result) < result = x + y; >int number; Sum(10, 15, out number); Console.WriteLine(number); // 25
Причем, как и в случае с ref ключевое слово out используется как при определении метода, так и при его вызове.
Также обратите внимание, что методы, использующие такие параметры, обязательно должны присваивать им определенное значение. То есть следующий код будет недопустим, так как в нем для out-параметра не указано никакого значения:
void Sum(int x, int y, out int result)
Прелесть использования подобных параметров состоит в том, что по сути мы можем вернуть из метода не одно значение, а несколько. Например:
void GetRectangleData(int width, int height, out int rectArea, out int rectPerimetr) < rectArea = width * height; // площадь прямоугольника - произведение ширины на высоту rectPerimetr = (width + height) * 2; // периметр прямоугольника - сумма длин всех сторон >int area; int perimetr; GetRectangleData(10, 20, out area, out perimetr); Console.WriteLine($"Площадь прямоугольника: "); // 200 Console.WriteLine($"Периметр прямоугольника: "); // 60
Здесь у нас есть метод GetRectangleData, который получает ширину и высоту прямоугольника (параметры width и height). А два выходных параметра мы используем для подсчета площади и периметра прямоугольника.
При этом можно определять переменные, которые передаются out -параметрам в непосредственно при вызове метода. То есть мы можем сократить предыдущий пример следующим образом:
void GetRectangleData(int width, int height, out int rectArea, out int rectPerimetr) < rectArea = width * height; rectPerimetr = (width + height) * 2; >GetRectangleData(10, 20, out int area, out int perimetr); Console.WriteLine($"Площадь прямоугольника: "); // 200 Console.WriteLine($"Периметр прямоугольника: "); // 60
При этом, если нам неизвестен тип значений, которые будут присвоены параметрам, то мы можем для их определения использовать оператор var :
GetRectangleData(10, 20, out var area, out var perimetr); Console.WriteLine($"Площадь прямоугольника: "); // 200 Console.WriteLine($"Периметр прямоугольника: "); // 60
Входные параметры. Модификатор in
Кроме выходных параметров с модификатором out метод может использовать входные параметры с модификатором in . Модификатор in указывает, что данный параметр будет передаваться в метод по ссылке, однако внутри метода его значение параметра нельзя будет изменить. Например, возьмем следующий метод:
void GetRectangleData(in int width, in int height, out int rectArea, out int rectPerimetr) < //width = 25; // нельзя изменить, так как width - входной параметр rectArea = width * height; rectPerimetr = (width + height) * 2; >int w = 10; int h = 20; GetRectangleData(w, h, out var area, out var perimetr); Console.WriteLine($"Площадь прямоугольника: "); // 200 Console.WriteLine($"Периметр прямоугольника: "); // 60
В данном случае через входные параметры width и height в метод передаются значения, но в самом методе мы не можем изменить значения этих параметров, так как они определены с модификатором in .
Передача по ссылке в некоторых случаях может увеличить произодительность, а использование оператора in гарантирует, что значения переменных, которые передаются параметрам, нельзя будет изменить в этом методе.