Laravel по-русски

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

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

#1 12.01.2013 12:17:05

Передать переменную в роут

Столкнулся с задачей передачи переменной в замыкание.
Т.е.

$data='test';
Route::any($url, function ($route = array()) {                
    echo $data;
});                                                           

Но так естественно не получится т.к. в замыкании переменной $data не видно. Глобальные переменные использовать очень не хочется. По идее прийдется переписывать Route::any точнее написать свою

$data='test';
Route::my_any($url,$data, function ($data,$route = array()) {                
    echo $data;
});

или есть варианты проще?

UPD:
Начал искать, как передать ее расширив роутер, но что то как то остановился на регистрации роута. Там он просто регистрируется, т.е. оттуда я могу сохранить свою $data, а вот передать ее в свой callback что-то не могу найти как.

UPD:
Попробовал с глобальной переменной, не получилось. У меня там цикл в реальном коде идет. используется последнее присвоенное значение. А сделать уникальные ключи я не могу, т.к. вызвать по уникальным ключам не получится, я ж не могу их туда передать.

Изменено la2ha (12.01.2013 12:43:43)

Не в сети

#2 12.01.2013 13:17:40

Re: Передать переменную в роут

Мне штатное решение в духе Laravel не приходит в голову, поэтому можешь попробовать в стиле JavaScript — создавать замыкание динамически или просто создавать объект и ему присваивать все нужные данные.

PHP
// 1
class MyRoute {
  function 
handle($route = array()) {
    ..
    
$this->data ...
  }
}

$route = new MyRoute;
$route->data = array(...);
Route::any($url, array($route'handle'));

// 2
$route = function ($data) {
  return function (
$params = array()) use ($data) {
    ...
  };
};
Route::any($url$route($data));

Не в сети

#3 12.01.2013 13:29:12

Re: Передать переменную в роут

Спасибо, с ходу так не понял особо как это сделать, но нашел кажется то как я могу переделать роуты под свои нужды, но возник вопрос как их так расширить, чтоб заменить добавить функций или заменить на свои.
Нужно отредактировать 
/laravel/routing/route.php
/laravel/routing/router.php
Почитал еще раз как ты рекомендовал класс базы данных расшинить и все равно не въехал. Суть то понимаю что надо сделать класс который насделует этот класс. Но как мне сделать чтоб потом когда вызывается Route->call() где-то оно использовало мой код, а не laravel.

Не в сети

#4 12.01.2013 16:08:57

Re: Передать переменную в роут

Ты не понимаешь, как работают куски кода выше? В первом ты создаёшь класс-контейнер со своими данными и функцией обработки, а PHParray($route'handle') — это стандартная форма записи функции обратного вызова в PHP (см. тип callable).

Во втором случае функция-замыкание генерирует тебе замыкания на каждый свой вызов, поэтому параметры (PHP$data) видны внутри той функции, которую она возвращает. Может так понятнее:

PHP
function makeRoute($data) {
  return function (
$params = array()) use ($data) {
    ...
  };
};

Не в сети

#5 12.01.2013 23:44:27

Re: Передать переменную в роут

Все оказалось очень просто, PHP 5.3 для меня новая штука, так вот и мучаюсь. А тут подсказали на англоязычном форуме. Полез в документацию почитать. И оказалось что не дочитал до этого один абзац.

$data='test';
Route::any($url, function ($route = array()) use ($data) {                
    echo $data;
});  

Как тут сделать подсветку php?

Изменено la2ha (13.01.2013 00:03:25)

Не в сети

#6 13.01.2013 10:11:10

Re: Передать переменную в роут

Я так понял, что для тебя вариант с передачей PHP$data не подходит, так как ты выше писал, что она изменяется в цикле и хранит только значение последней итерации, поэтому я и предлагал другие варианты. Советую посмотреть список изменений в PHP 5.3, сразу проще станет. Замыкания — это вообще первая вещь.

  1. Как тут сделать подсветку php?

Включи «Использовать вики-разметку вместо BB-кодов».

Не в сети

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