-abstract class AbstractController extends BaseAbstractController {
- use ControllerTrait {
- //Rename render as baseRender
- render as protected baseRender;
- }
-
- /**
- * Return the facebook image
- *
- * @desc Generate image in jpeg format or load it from cache
- *
- * @param string $pathInfo The request path info
- * @param array $parameters The image parameters
- * @return array The image array
- */
- protected function getFacebookImage(string $pathInfo, array $parameters = []): array {
- //Get asset package
- //XXX: require asset package to be public
- $package = $this->container->get('rapsys_pack.path_package');
-
- //Set texts
- $texts = $parameters['texts'] ?? [];
-
- //Set default source
- $source = $parameters['source'] ?? 'png/facebook.png';
-
- //Set default source
- $updated = $parameters['updated'] ?? strtotime('last week');
-
- //Set source path
- $src = $this->config['path']['public'].'/'.$source;
-
- //Set cache path
- //XXX: remove extension and store as png anyway
- $cache = $this->config['path']['cache'].'/facebook/'.substr($source, 0, strrpos($source, '.')).'.'.$this->config['facebook']['width'].'x'.$this->config['facebook']['height'].'.png';
-
- //Set destination path
- //XXX: format <public>/facebook<pathinfo>.jpeg
- //XXX: was <public>/facebook/<controller>/<action>.<locale>.jpeg
- $dest = $this->config['path']['public'].'/facebook'.$pathInfo.'.jpeg';
-
- //With up to date generated image
- if (
- is_file($dest) &&
- ($stat = stat($dest)) &&
- $stat['mtime'] >= $updated
- ) {
- //Get image size
- list ($width, $height) = getimagesize($dest);
-
- //Iterate each text
- foreach($texts as $text => $data) {
- //With canonical text
- if (!empty($data['canonical'])) {
- //Prevent canonical to finish in alt
- unset($texts[$text]);
- }
- }
-
- //Return image data
- return [
- 'og:image' => $package->getAbsoluteUrl('@RapsysAir/facebook/'.$stat['mtime'].$pathInfo.'.jpeg'),
- 'og:image:alt' => str_replace("\n", ' ', implode(' - ', array_keys($texts))),
- 'og:image:height' => $height,
- 'og:image:width' => $width
- ];
- //With image candidate
- } elseif (is_file($src)) {
- //Create image object
- $image = new \Imagick();
-
- //With cache image
- if (is_file($cache)) {
- //Read image
- $image->readImage($cache);
- //Without we generate it
- } else {
- //Check target directory
- if (!is_dir($dir = dirname($cache))) {
- //Create filesystem object
- $filesystem = new Filesystem();
-
- try {
- //Create dir
- //XXX: set as 0775, symfony umask (0022) will reduce rights (0755)
- $filesystem->mkdir($dir, 0775);
- } catch (IOExceptionInterface $e) {
- //Throw error
- throw new \Exception(sprintf('Output directory "%s" do not exists and unable to create it', $dir), 0, $e);
- }
- }
-
- //Read image
- $image->readImage($src);
-
- //Crop using aspect ratio
- //XXX: for better result upload image directly in aspect ratio :)
- $image->cropThumbnailImage($this->config['facebook']['width'], $this->config['facebook']['height']);