Skip to content

Commit ed9bb1c

Browse files
authored
Feature/angular load correct versioned files from symfony (#122)
* Allow loading of angular prod build files (quick'n dirty files) * Lighter Controller for Ng and Cache to prevent calling again and again the controller
1 parent de65687 commit ed9bb1c

File tree

4 files changed

+87
-12
lines changed

4 files changed

+87
-12
lines changed

config/services.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ services:
3434
$apiPlatformPrefix: '%api_platform_prefix%'
3535
$tokenJwtTtl: '%token_jwt_ttl%'
3636
$tokenJwtBearer: '%token_jwt_bearer%'
37+
$kernelProjectDir: '%kernel.project_dir%'
3738

3839
# makes classes in src/ available to be used as services
3940
# this creates a service per class whose id is the fully-qualified class name

src/Controller/FormDevXpressAngularController.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22

33
namespace App\Controller;
44

5+
use App\Tools\AngularCli;
6+
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
57
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
68
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
79
use Symfony\Component\Routing\Annotation\Route;
10+
use Symfony\Component\Yaml\Yaml;
811

912
class FormDevXpressAngularController extends Controller
1013
{
1114
/**
15+
* @var string $kernelProjectDir
1216
* @Route("/demo/form/devxpress-angular/{ngRouteName}", requirements={"ngRouteName"=".*"}, defaults={"ngRouteName"="home"})
1317
* @Method({"GET"})
18+
* @Cache(maxage="2 weeks")
1419
*/
15-
public function index()
20+
public function index(string $kernelProjectDir)
1621
{
22+
$ngFiles = AngularCli::getNgBuildFiles($kernelProjectDir);
23+
1724
return $this->render('form-devxpress-angular/app.html.twig', [
25+
'ngFiles' => $ngFiles,
1826
'appName' => 'devxpress-angular',
1927
'title' => 'DevxpressAngular',
2028
'preventParentJs' => true, // since Angular6, but maybe need to build nativeElement to solve this

src/Tools/AngularCli.php

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
namespace App\Tools;
3+
4+
class AngularCli
5+
{
6+
/**
7+
* @param string $kernelProjectDir
8+
* @return array
9+
*/
10+
public static function getNgBuildFiles(string $kernelProjectDir): array
11+
{
12+
// Quick'n a bit dirty solution to load correct ng files (until now, prod build with version string in name cannot be loaded)
13+
$ngFiles = [
14+
'js' => [ // take care at the order it's very important !!!
15+
'runtime' => 'runtime.js',
16+
'polyfills' => 'polyfills.js',
17+
'vendor' => 'vendor.js',
18+
'main' => 'main.js',
19+
],
20+
'css' => [
21+
'styles' => 'styles.css',
22+
]
23+
];
24+
$json = file_get_contents($kernelProjectDir . '/assets/js/form-devxpress-angular/angular.json');
25+
$jsonDecoded = json_decode($json, true);
26+
$path = $jsonDecoded['projects']['devxpress']['targets']['build']['options']['outputPath'];
27+
$pathParts = explode('/', $path);
28+
$ngBuildDir = [];
29+
$startBuildBir = false;
30+
foreach ($pathParts as $oneDir) {
31+
if ($oneDir === 'public') {
32+
$startBuildBir = true;
33+
}
34+
35+
if (!$startBuildBir) {
36+
continue;
37+
}
38+
39+
$ngBuildDir[] = $oneDir;
40+
}
41+
42+
// find build files
43+
$ngBuildDirFromProject = '/' . implode('/', $ngBuildDir);
44+
$ngBuildDirFromPublic = '/' . implode('/', array_slice($ngBuildDir, 1));
45+
$dirIt = new \DirectoryIterator($kernelProjectDir . $ngBuildDirFromProject);
46+
foreach ($dirIt as $iteration) {
47+
if ($iteration->isFile()) {
48+
// improve this using array_* functions
49+
foreach ($ngFiles['js'] as $jsKey => $jsNgFile) {
50+
if (strpos($iteration->getBasename(), $jsKey) !== false) {
51+
$ngFiles['js'][$jsKey] = $ngBuildDirFromPublic.$iteration->getBasename();
52+
continue;
53+
}
54+
}
55+
56+
foreach ($ngFiles['css'] as $cssKey => $cssNgFile) {
57+
if (strpos($iteration->getBasename(), $cssKey) !== false) {
58+
$ngFiles['css'][$cssKey] = $ngBuildDirFromPublic.$iteration->getBasename();
59+
continue;
60+
}
61+
}
62+
}
63+
}
64+
65+
return $ngFiles;
66+
}
67+
}

templates/form-devxpress-angular/app.html.twig

+10-11
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,23 @@
1212

1313
{% block stylesheets %}
1414
{# this one is generated by --extract-css option from build command #}
15-
<link rel="stylesheet" type="text/css" href="/dist-ng/devxpress/styles.css" />
15+
{% for cssFile in ngFiles.css %}
16+
<link rel="stylesheet" type="text/css" href="{{ cssFile }}" />
17+
{% endfor %}
1618

1719
{{ parent() }}
18-
<!-- preload JS -->
19-
<link rel="preload" href="/dist-ng/devxpress/runtime.js" as="script"/>
20-
<link rel="preload" href="/dist-ng/devxpress/polyfills.js" as="script"/>
21-
<link rel="preload" href="/dist-ng/devxpress/vendor.js" as="script"/><!-- not in prod, only dev -->
22-
<link rel="preload" href="/dist-ng/devxpress/main.js" as="script"/>
20+
<!-- preload JS -->
21+
{% for jsFile in ngFiles.js %}
22+
<link rel="preload" href="{{ jsFile }}" as="script"/>
23+
{% endfor %}
2324
{% endblock %}
2425

2526
{% block body %}
2627
<app-root></app-root>
2728
{% endblock %}
2829

2930
{% block javascripts %}
30-
<!-- HardCoded part whereas it should be generated with ngcli build system: it should be better to serve the -->
31-
<script type="text/javascript" src="/dist-ng/devxpress/runtime.js"></script>
32-
<script type="text/javascript" src="/dist-ng/devxpress/polyfills.js"></script><!-- generate Zone already loaded. Error -->
33-
<script type="text/javascript" src="/dist-ng/devxpress/vendor.js"></script><!-- not in prod, only dev -->
34-
<script type="text/javascript" src="/dist-ng/devxpress/main.js"></script>
31+
{% for jsFile in ngFiles.js %}
32+
<script type="text/javascript" src="{{ jsFile }}"></script>
33+
{% endfor %}
3534
{% endblock %}

0 commit comments

Comments
 (0)