services.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * This file includes all the services that are loaded via the ServiceProviderInterface
  5. *
  6. * @package chamilo.services
  7. */
  8. use Silex\Application;
  9. use Silex\ServiceProviderInterface;
  10. // Monolog
  11. if (is_writable($app['sys_temp_path'])) {
  12. /** Adding Monolog service provider Monolog use examples
  13. $app['monolog']->addDebug('Testing the Monolog logging.');
  14. $app['monolog']->addInfo('Testing the Monolog logging.');
  15. $app['monolog']->addError('Testing the Monolog logging.');
  16. */
  17. $app->register(
  18. new Silex\Provider\MonologServiceProvider(),
  19. array(
  20. 'monolog.logfile' => $app['chamilo.log'],
  21. 'monolog.name' => 'chamilo',
  22. )
  23. );
  24. }
  25. //Setting HttpCacheService provider in order to use do: $app['http_cache']->run();
  26. /*
  27. $app->register(new Silex\Provider\HttpCacheServiceProvider(), array(
  28. 'http_cache.cache_dir' => $app['http_cache.cache_dir'].'/',
  29. ));*/
  30. // Session provider
  31. //$app->register(new Silex\ProviderSessionServiceProvider());
  32. /*
  33. Implements a UserProvider to login users
  34. use Symfony\Component\Security\Core\User\UserProviderInterface;
  35. use Symfony\Component\Security\Core\User\UserInterface;
  36. use Symfony\Component\Security\Core\User\User;
  37. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  38. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  39. use Doctrine\DBAL\Connection;
  40. class UserProvider implements UserProviderInterface
  41. {
  42. private $conn;
  43. public function __construct(Connection $conn)
  44. {
  45. $this->conn = $conn;
  46. }
  47. public function loadUserByUsername($username)
  48. {
  49. $stmt = $this->conn->executeQuery('SELECT * FROM users WHERE username = ?', array(strtolower($username)));
  50. if (!$user = $stmt->fetch()) {
  51. throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
  52. }
  53. $roles = 'student';
  54. echo $user['username'];exit;
  55. return new User($user['username'], $user['password'], explode(',', $roles), true, true, true, true);
  56. }
  57. public function refreshUser(UserInterface $user)
  58. {
  59. if (!$user instanceof User) {
  60. throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
  61. }
  62. public function supportsClass($class)
  63. {
  64. return $class === 'Symfony\Component\Security\Core\User\User';
  65. }
  66. }
  67. $app->register(new Silex\Provider\SecurityServiceProvider(), array(
  68. 'security.firewalls' => array(
  69. 'secured' => array(
  70. 'pattern' => '^/admin/',
  71. 'form' => array(
  72. 'login_path' => '/login',
  73. 'check_path' => '/admin/login_check'
  74. ),
  75. 'logout' => array('path' => '/logout', 'target' => '/'),
  76. 'users' => $app->share(function() use ($app) {
  77. return new UserProvider($app['db']);
  78. })
  79. )
  80. ),
  81. 'security.role_hierarchy'=> array(
  82. 'ROLE_ADMIN' => array('ROLE_EDITOR'),
  83. "ROLE_EDITOR" => array('ROLE_WRITER'),
  84. "ROLE_WRITER" => array('ROLE_USER'),
  85. "ROLE_USER" => array("ROLE_SUSCRIBER"),
  86. )
  87. ));*/
  88. // Setting Controllers as services provider
  89. $app->register(new Silex\Provider\ServiceControllerServiceProvider());
  90. // Validator provider
  91. $app->register(new Silex\Provider\ValidatorServiceProvider());
  92. // Implements Symfony2 translator (needed when using forms in Twig)
  93. $app->register(new Silex\Provider\TranslationServiceProvider(), array(
  94. 'locale' => 'en',
  95. 'locale_fallback' => 'en'
  96. ));
  97. // Handling po files
  98. /*
  99. use Symfony\Component\Translation\Loader\PoFileLoader;
  100. use Symfony\Component\Translation\Dumper\PoFileDumper;
  101. $app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
  102. $translator->addLoader('pofile', new PoFileLoader());
  103. $language = api_get_language_interface();
  104. $iterator = new FilesystemIterator(api_get_path(SYS_PATH).'resources/locale/'.$language);
  105. $filter = new RegexIterator($iterator, '/\.(po)$/');
  106. foreach ($filter as $entry) {
  107. //$domain = $entry->getBasename('.inc.po');
  108. $locale = api_get_language_isocode($language); //'es_ES';
  109. //$translator->addResource('pofile', $entry->getPathname(), $locale, $domain);
  110. $translator->addResource('pofile', $entry->getPathname(), $locale, 'messages');
  111. }
  112. return $translator;
  113. }));
  114. //$app['translator.domains'] = array();
  115. */
  116. // Form provider
  117. $app->register(new Silex\Provider\FormServiceProvider());
  118. // URL generator provider
  119. $app->register(new Silex\Provider\UrlGeneratorServiceProvider());
  120. /*
  121. use Doctrine\Common\Persistence\AbstractManagerRegistry;
  122. class ManagerRegistry extends AbstractManagerRegistry
  123. {
  124. protected $container;
  125. protected function getService($name)
  126. {
  127. return $this->container[$name];
  128. }
  129. protected function resetService($name)
  130. {
  131. unset($this->container[$name]);
  132. }
  133. public function getAliasNamespace($alias)
  134. {
  135. throw new \BadMethodCallException('Namespace aliases not supported.');
  136. }
  137. public function setContainer(Application $container)
  138. {
  139. $this->container = $container;
  140. }
  141. }
  142. $app['form.extensions'] = $app->share($app->extend('form.extensions', function ($extensions, $app) {
  143. $managerRegistry = new ManagerRegistry(null, array(), array('orm.em'), null, null, $app['orm.proxies_namespace']);
  144. $managerRegistry->setContainer($app);
  145. $extensions[] = new \Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension($managerRegistry);
  146. return $extensions;
  147. }));*/
  148. // Setting Doctrine service provider (DBAL)
  149. if (isset($app['configuration']['main_database'])) {
  150. $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
  151. 'db.options' => array(
  152. 'driver' => 'pdo_mysql',
  153. 'dbname' => $app['configuration']['main_database'],
  154. 'user' => $app['configuration']['db_user'],
  155. 'password' => $app['configuration']['db_password'],
  156. 'host' => $app['configuration']['db_host'],
  157. 'charset' => 'utf8',
  158. /*'driverOptions' => array(
  159. 1002 => 'SET NAMES utf8'
  160. )*/
  161. )
  162. ));
  163. // Setting Doctrine ORM
  164. $app->register(new Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider, array(
  165. 'orm.auto_generate_proxies' => true,
  166. "orm.proxies_dir" => $app['db.orm.proxies_dir'],
  167. //'orm.proxies_namespace' => '\Doctrine\ORM\Proxy\Proxy',
  168. "orm.em.options" => array(
  169. "mappings" => array(
  170. array(
  171. /* If true, only simple notations like @Entity will work.
  172. If false, more advanced notations and aliasing via use will work.
  173. (Example: use Doctrine\ORM\Mapping AS ORM, @ORM\Entity)*/
  174. 'use_simple_annotation_reader' => false,
  175. "type" => "annotation",
  176. "namespace" => "Entity",
  177. "path" => api_get_path(INCLUDE_PATH).'Entity',
  178. ),
  179. array(
  180. 'use_simple_annotation_reader' => false,
  181. "type" => "annotation",
  182. "namespace" => "Gedmo",
  183. "path" => api_get_path(SYS_PATH).'vendors/gedmo/doctrine-extensions/lib/Gedmo',
  184. )
  185. ),
  186. ),
  187. ));
  188. // Temporal fix to load gedmo libs
  189. $sortableGroup = new Gedmo\Mapping\Annotation\SortableGroup(array());
  190. $sortablePosition = new Gedmo\Mapping\Annotation\SortablePosition(array());
  191. $tree = new Gedmo\Mapping\Annotation\Tree(array());
  192. $tree = new Gedmo\Mapping\Annotation\TreeParent(array());
  193. $tree = new Gedmo\Mapping\Annotation\TreeLeft(array());
  194. $tree = new Gedmo\Mapping\Annotation\TreeRight(array());
  195. $tree = new Gedmo\Mapping\Annotation\TreeRoot(array());
  196. $tree = new Gedmo\Mapping\Annotation\TreeLevel(array());
  197. $tree = new Gedmo\Mapping\Annotation\Versioned(array());
  198. $tree = new Gedmo\Mapping\Annotation\Loggable(array());
  199. $tree = new Gedmo\Loggable\Entity\LogEntry();
  200. // Setting Doctrine2 extensions
  201. $timestampableListener = new \Gedmo\Timestampable\TimestampableListener();
  202. $app['db.event_manager']->addEventSubscriber($timestampableListener);
  203. $sluggableListener = new \Gedmo\Sluggable\SluggableListener();
  204. $app['db.event_manager']->addEventSubscriber($sluggableListener);
  205. $sortableListener = new Gedmo\Sortable\SortableListener();
  206. $app['db.event_manager']->addEventSubscriber($sortableListener);
  207. $treeListener = new \Gedmo\Tree\TreeListener();
  208. //$treeListener->setAnnotationReader($cachedAnnotationReader);
  209. $app['db.event_manager']->addEventSubscriber($treeListener);
  210. $loggableListener = new \Gedmo\Loggable\LoggableListener();
  211. $app['db.event_manager']->addEventSubscriber($loggableListener);
  212. }
  213. // Setting Twig as a service provider
  214. $app->register(
  215. new Silex\Provider\TwigServiceProvider(),
  216. array(
  217. 'twig.path' => array(
  218. api_get_path(SYS_CODE_PATH).'template', //template folder
  219. api_get_path(SYS_PLUGIN_PATH) //plugin folder
  220. ),
  221. // twitter bootstrap form twig templates
  222. 'twig.form.templates' => array('form_div_layout.html.twig', 'default/form/form_custom_template.tpl'),
  223. 'twig.options' => array(
  224. 'debug' => $app['debug'],
  225. 'charset' => 'utf-8',
  226. 'strict_variables' => false,
  227. 'autoescape' => false,
  228. 'cache' => $app['debug'] ? false : $app['twig.cache.path'],
  229. 'optimizations' => -1, // turn on optimizations with -1
  230. )
  231. )
  232. );
  233. // Setting Twig options
  234. $app['twig'] = $app->share(
  235. $app->extend('twig', function ($twig) {
  236. $twig->addFilter('get_lang', new Twig_Filter_Function('get_lang'));
  237. $twig->addFilter('get_path', new Twig_Filter_Function('api_get_path'));
  238. $twig->addFilter('get_setting', new Twig_Filter_Function('api_get_setting'));
  239. $twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));
  240. $twig->addFilter('return_message', new Twig_Filter_Function('Display::return_message_and_translate'));
  241. $twig->addFilter('display_page_header', new Twig_Filter_Function('Display::page_header_and_translate'));
  242. $twig->addFilter(
  243. 'display_page_subheader',
  244. new Twig_Filter_Function('Display::page_subheader_and_translate')
  245. );
  246. $twig->addFilter('icon', new Twig_Filter_Function('Template::get_icon_path'));
  247. $twig->addFilter('format_date', new Twig_Filter_Function('Template::format_date'));
  248. return $twig;
  249. })
  250. );
  251. // Developer tools
  252. if (is_writable($app['sys_temp_path'])) {
  253. if ($app['debug']) {
  254. // Adding symfony2 web profiler (memory, time, logs, etc)
  255. if (api_get_setting('allow_web_profiler') == 'true') {
  256. $app->register($p = new Silex\Provider\WebProfilerServiceProvider(), array(
  257. 'profiler.cache_dir' => $app['profiler.cache_dir'],
  258. ));
  259. $app->mount('/_profiler', $p);
  260. }
  261. //$app->register(new Whoops\Provider\Silex\WhoopsServiceProvider);
  262. //}
  263. }
  264. }
  265. // Registering Menu service provider (too gently creating menus with the URLgenerator provider)
  266. $app->register(new \Knp\Menu\Silex\KnpMenuServiceProvider());
  267. // Pagerfanta settings (Pagination using Doctrine2, arrays, etc)
  268. use FranMoreno\Silex\Provider\PagerfantaServiceProvider;
  269. $app->register(new PagerfantaServiceProvider());
  270. // Custom route params see https://github.com/franmomu/silex-pagerfanta-provider/pull/2
  271. //$app['pagerfanta.view.router.name']
  272. //$app['pagerfanta.view.router.params']
  273. $app['pagerfanta.view.options'] = array(
  274. 'routeName' => null,
  275. 'routeParams' => array(),
  276. 'pageParameter' => '[page]',
  277. 'proximity' => 3,
  278. 'next_message' => '&raquo;',
  279. 'prev_message' => '&laquo;',
  280. 'default_view' => 'twitter_bootstrap' // the pagination style
  281. );
  282. // @todo use a app['image_processor'] setting
  283. define('IMAGE_PROCESSOR', 'gd'); // imagick or gd strings
  284. // Setting the Imagine service provider to deal with image transformations used in social group.
  285. $app->register(new Grom\Silex\ImagineServiceProvider(), array(
  286. 'imagine.factory' => 'Gd',
  287. //'imagine.base_path' => __DIR__.'/vendor/imagine',
  288. ));
  289. // Prompts Doctrine SQL queries using monolog
  290. if ($app['debug'] && isset($app['configuration']['main_database'])) {
  291. $logger = new Doctrine\DBAL\Logging\DebugStack();
  292. $app['db.config']->setSQLLogger($logger);
  293. $app->after(function() use ($app, $logger) {
  294. // Log all queries as DEBUG.
  295. foreach ($logger->queries as $query) {
  296. $app['monolog']->debug($query['sql'], array('params' =>$query['params'], 'types' => $query['types']));
  297. }
  298. });
  299. }
  300. // Email service provider
  301. $app->register(new Silex\Provider\SwiftmailerServiceProvider(), array(
  302. 'swiftmailer.options' => array(
  303. 'host' => isset($platform_email['SMTP_HOST']) ? $platform_email['SMTP_HOST'] : null,
  304. 'port' => isset($platform_email['SMTP_PORT']) ? $platform_email['SMTP_PORT'] : null,
  305. 'username' => isset($platform_email['SMTP_USER']) ? $platform_email['SMTP_USER'] : null,
  306. 'password' => isset($platform_email['SMTP_PASS']) ? $platform_email['SMTP_PASS'] : null,
  307. 'encryption' => null,
  308. 'auth_mode' => null
  309. )
  310. ));
  311. //if (isset($platform_email['SMTP_MAILER']) && $platform_email['SMTP_MAILER'] == 'smtp') {
  312. $app['mailer'] = $app->share(function ($app) {
  313. return new \Swift_Mailer($app['swiftmailer.transport']);
  314. });
  315. // Gaufrette service provider (to manage files/dirs) (not used yet)
  316. /*
  317. use Bt51\Silex\Provider\GaufretteServiceProvider\GaufretteServiceProvider;
  318. $app->register(new GaufretteServiceProvider(), array(
  319. 'gaufrette.adapter.class' => 'Local',
  320. 'gaufrette.options' => array(api_get_path(SYS_DATA_PATH))
  321. ));
  322. */
  323. // Use symfony2 filesystem instead of custom scripts
  324. use Neutron\Silex\Provider\FilesystemServiceProvider;
  325. $app->register(new FilesystemServiceProvider());
  326. /** Chamilo service provider */
  327. class ChamiloServiceProvider implements ServiceProviderInterface
  328. {
  329. public function register(Application $app)
  330. {
  331. // Template class
  332. $app['template'] = $app->share(function () use ($app) {
  333. $template = new Template($app);
  334. return $template;
  335. });
  336. // Chamilo data filesystem
  337. $app['chamilo.filesystem'] = $app->share(function () use ($app) {
  338. $filesystem = new ChamiloLMS\Component\DataFilesystem\DataFilesystem($app['sys_data_path']);
  339. return $filesystem;
  340. });
  341. // Page controller class
  342. $app['page_controller'] = $app->share(function () use ($app) {
  343. $pageController = new PageController($app);
  344. return $pageController;
  345. });
  346. }
  347. public function boot(Application $app)
  348. {
  349. }
  350. }
  351. // Registering Chamilo service provider
  352. $app->register(new ChamiloServiceProvider(), array());
  353. // Controller as services definitions see
  354. $app['pages.controller'] = $app->share(
  355. function () use ($app) {
  356. return new PagesController($app['pages.repository']);
  357. }
  358. );
  359. $app['index.controller'] = $app->share(
  360. function () use ($app) {
  361. return new ChamiloLMS\Controller\IndexController();
  362. }
  363. );
  364. $app['legacy.controller'] = $app->share(
  365. function () use ($app) {
  366. return new ChamiloLMS\Controller\LegacyController();
  367. }
  368. );
  369. $app['userPortal.controller'] = $app->share(
  370. function () use ($app) {
  371. return new ChamiloLMS\Controller\UserPortalController();
  372. }
  373. );
  374. $app['learnpath.controller'] = $app->share(
  375. function () use ($app) {
  376. return new ChamiloLMS\Controller\LearnpathController();
  377. }
  378. );
  379. $app['course_home.controller'] = $app->share(
  380. function () use ($app) {
  381. return new ChamiloLMS\Controller\CourseHomeController();
  382. }
  383. );
  384. $app['certificate.controller'] = $app->share(
  385. function () use ($app) {
  386. return new ChamiloLMS\Controller\CertificateController();
  387. }
  388. );
  389. $app['user.controller'] = $app->share(
  390. function () use ($app) {
  391. return new ChamiloLMS\Controller\UserController();
  392. }
  393. );
  394. $app['news.controller'] = $app->share(
  395. function () use ($app) {
  396. return new ChamiloLMS\Controller\NewsController();
  397. }
  398. );
  399. $app['editor.controller'] = $app->share(
  400. function () use ($app) {
  401. return new ChamiloLMS\Controller\EditorController();
  402. }
  403. );
  404. $app['question_manager.controller'] = $app->share(
  405. function () use ($app) {
  406. return new ChamiloLMS\Controller\Admin\QuestionManager\QuestionManagerController();
  407. }
  408. );
  409. $app['exercise_manager.controller'] = $app->share(
  410. function () use ($app) {
  411. return new ChamiloLMS\Controller\ExerciseController();
  412. }
  413. );