Новичок в Symfony, я пытаюсь начать свою первую сессию
вот весь мой код, расположенный под public/php/session.php:
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
$session = new Session();
$session->start();
Я получаю ошибку Uncaught Error: Class 'Symfony\Component\HttpFoundation\Session\Session' not found
phpstorm не выдает ошибок, мне нужно установить модуль? Я пробовал composer require session, но это не работает
Я также пробовал метод symfony doc с handler_id: ~ в config/packages/framework.yaml
с помощью этого метода нет сообщения об ошибке, но также нет файла cookie сеанса
а вот мой контроллер:
class HomeController extends AbstractController {
// start session
public function index(SessionInterface $session) {
$session->set('foo', 'bar');
$session->get('foo');
}
/**
* @Route("/", name = "home")
*/
public function homepage(){
return $this->render('home.html.twig');
}
}
попробовав команду из папки моего сайта, я получаю Could not open input file: composer.phar
Любопытно, как вы вызываете public/php/session.php, но не думайте, что трюк с composer dump-autoload -o сработает, если вы не загружаете его из контроллера, поскольку session.php не включает автозагрузчик для использования флага -o.
Что ж, теперь я вернулся к официальному методу (как описано в вопросе); нет ошибок, но нет файла cookie сеанса
Ваш метод индекса не возвращает никакого ответа, поэтому файлы cookie не будут отправлены обратно.
@Cerad, но в документации Symfony ничего не сказано о возврате? Я пробовал return $session и return $this->session безуспешно
Это базовый протокол http. Подумайте об отказе от Symfony и напишите несколько базовых примеров, возможно, после php документы. Когда вы получите общее представление о том, как взаимодействуют серверы и браузеры, файлы cookie и сеансы, это станет ясным.






Если вы используете весь фреймворк Symfony, он запускает сеансы автоматически, когда вы читаете, записываете или даже проверяете наличие данных в сеансе. Вам не нужно делать это вручную.
Что вам нужно сделать, так это определить адаптер, который вы будете использовать, или оставьте его для настройки php в
конфигурация / пакеты / framework.yaml
framework:
+ session:
+ # The native PHP session handler will be used
+ handler_id: ~
а затем в ваших сервисах контроллеры просто получают сеансовую службу
с SF4 и включенным автоматическим подключением, в действии контроллера
public function index(SessionInterface $session)
{
$session->set('foo', 'bar');
$session->get('foo');
}
это все. См. Больше в https://symfony.com/doc/current/controller.html#session-intro
Ваш код находится вне фреймворка, и он не будет работать, потому что нет автозагрузчика, который загружал бы компонент из композитора, он работал бы, если бы вы включили vendor / autoload.php, но не пойдете по этому пути.
Извините, я забыл упомянуть, я тоже пробовал это. Я вставил его в свой домашний контроллер; Сайт загружается, но в моем браузере нет файла cookie сеанса ?? В документации по symfony сказано, что сеанс должен быть создан с помощью set? Я обновлю свой вопрос
проверьте конфигурацию сеанса PHP, чем например, в php.ini, потому что, когда вы устанавливаете обработчик как ~, тогда symfony просто использует собственную конфигурацию сеанса из php
В моем приложении нигде нет php.ini. если я просто поставлю session_start() простым способом php, он работает нормально
если да, то поместите то, что я дал вам, в конфиг и очистите кеш, он должен работать. Убедитесь, что вы не начинаете сеанс самостоятельно
Как упомянул @Robert, поскольку ваш код находится в public/php, он не знает об автозагрузчике, который сообщает PHP, где расположены файлы относительно их пространств имен (PSR-0 или PSR-4).
Я считаю, что путаница заключается в том, что ваш public index function не запускает сеанс автоматически, поскольку он не вызывается Symfony, если вы не перейдете к функции index() и не должны вернуть Response. Попробуйте передать сеанс аргументам метода homepage и перейти к нему в браузере.
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class HomeController extends AbstractController
{
/**
* @Route("/", name = "home")
*/
public function homepage(SessionInterface $session)
{
$session->set('foo', 'bar');
return $this->render('home.html.twig');
}
}
Попробуйте использовать
php composer.phar dump-autoload -o, см. Мой ответ на Composer и производственный сервер Linux - автозагрузка не работает Как правило, вы хотите создать службу в/src, которую вы передаете своему контроллеру, а не помещать в свой путь/public.