symfony2: загрузка классов / обработка пространства имен — разница между средами prod / dev?

в чем разница между автозагрузкой классов и обработкой пространства имен между app_dev.php в symfony2 и средой app.php или dev / prod (symfony 2.8.4).

Когда я запускаю его в среде разработки через app_dev.php, все в порядке, когда я запускаю его в prod через app.php, я получаю ошибку внутреннего сервера 500 (ничего не написано в prod.log symfony). Заглядывая в apache error.log я вижу:

PHP Fatal error:  Class 'SSMCRM\\Common\\ProductionTemplateMapper' not found in /var/[...]

И да, я очистил кеш продуктов …

app.php:

use Symfony\Component\HttpFoundation\Request;

/**
* @var Composer\Autoload\ClassLoader
*/
$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../app/bootstrap.php.cache';

// Enable APC for autoloading to improve performance.
// You should change the ApcClassLoader first argument to a unique prefix
// in order to prevent cache key conflicts with other applications
// also using APC.
/*
$apcLoader = new Symfony\Component\ClassLoader\ApcClassLoader(sha1(__FILE__), $loader);
$loader->unregister();
$apcLoader->register(true);
*/

//require_once __DIR__.'/../app/AppCache.php';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);

// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
//Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

app_dev.php:

<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Debug\Debug;

// If you don't want to setup permissions the proper way, just uncomment the following PHP line
// read http://symfony.com/doc/current/book/installation.html#checking-symfony-application-configuration-and-setup
// for more information
//umask(0000);

// This check prevents access to debug front controllers that are deployed by accident to production servers.
// Feel free to remove this, extend it, or make something more sophisticated.
if (isset($_SERVER['HTTP_CLIENT_IP'])
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|| !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1',
'192.168.33.1', //for vagrant box
)) || php_sapi_name() === 'cli-server')
) {
header('HTTP/1.0 403 Forbidden');
exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

/**
* @var Composer\Autoload\ClassLoader $loader
*/
$loader = require __DIR__.'/../app/autoload.php';
Debug::enable();

$kernel = new AppKernel('dev', true);
$kernel->loadClassCache();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

в autoload.php я добавил наши старые классы в загрузчик:

$loader->add('SSMCRM', __DIR__.'/../web/legacy/classes');

0

Решение

Я нашел провал. Для каждого унаследованного PHP-файла, который был вызван напрямую, у нас есть маршрут, который ведет к нашей оболочке (чтобы сделать возможности Symfony доступными в унаследованном коде). Я сгенерировал контроллер и его имена маршрутов и пути из реальных URL-адресов, поэтому на первом этапе нам не нужно было переписывать все ссылки и вызовы javascript AJAX, а позже упростить действия поиска / замены.
В результате чего-то. как это:

/**
* @Route(
* path="ajax/ajax_admin_vorlagen_web2print_detail.php",
* name="pages/admin/ajax/ajax_admin_vorlagen_web2print_detail.php",
* options={"expose"=true}
* )
*/
public function ajax_admin_vorlagen_web2print_detailAction()
{
return $this->returnLegacyResponse('pages/admin/ajax/ajax_admin_vorlagen_web2print_detail.php');
}

Это работает абсолютно нормально в среде разработчиков, выполняется маршрутизация Symfony, и мы переходим к соответствующему действию.
Но кажется, что в среде prod symfony сначала ищет сам файл (может быть, для большей скорости?) И пропускает сопоставление маршрута, если файл существует. Если наш файл вызывается напрямую, автозагрузчик Symfony отсутствует, и мы недавно удалили наш старый автозагрузчик. Вот почему класс отсутствует …

Таким образом, простое решение — переименовать все затронутые пути (например, удалить «.php»).

Я не смог найти ничего об этих различиях между средой prod / dev при обработке ядра в документации. 🙁

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]