Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Столкнулся с задачей передачи переменной в замыкание.
Т.е.
$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)
Не в сети
Мне штатное решение в духе Laravel не приходит в голову, поэтому можешь попробовать в стиле JavaScript — создавать замыкание динамически или просто создавать объект и ему присваивать все нужные данные.
// 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));
Не в сети
Спасибо, с ходу так не понял особо как это сделать, но нашел кажется то как я могу переделать роуты под свои нужды, но возник вопрос как их так расширить, чтоб заменить добавить функций или заменить на свои.
Нужно отредактировать
/laravel/routing/route.php
/laravel/routing/router.php
Почитал еще раз как ты рекомендовал класс базы данных расшинить и все равно не въехал. Суть то понимаю что надо сделать класс который насделует этот класс. Но как мне сделать чтоб потом когда вызывается Route->call() где-то оно использовало мой код, а не laravel.
Не в сети
Ты не понимаешь, как работают куски кода выше? В первом ты создаёшь класс-контейнер со своими данными и функцией обработки, а PHParray($route, 'handle')
— это стандартная форма записи функции обратного вызова в PHP (см. тип callable).
Во втором случае функция-замыкание генерирует тебе замыкания на каждый свой вызов, поэтому параметры (PHP$data
) видны внутри той функции, которую она возвращает. Может так понятнее:
function makeRoute($data) {
return function ($params = array()) use ($data) {
...
};
};
Не в сети
Все оказалось очень просто, PHP 5.3 для меня новая штука, так вот и мучаюсь. А тут подсказали на англоязычном форуме. Полез в документацию почитать. И оказалось что не дочитал до этого один абзац.
$data='test';
Route::any($url, function ($route = array()) use ($data) {
echo $data;
});
Как тут сделать подсветку php?
Изменено la2ha (13.01.2013 00:03:25)
Не в сети
Я так понял, что для тебя вариант с передачей PHP$data
не подходит, так как ты выше писал, что она изменяется в цикле и хранит только значение последней итерации, поэтому я и предлагал другие варианты. Советую посмотреть список изменений в PHP 5.3, сразу проще станет. Замыкания — это вообще первая вещь.
- Как тут сделать подсветку php?
Не в сети
Страницы 1