【问题标题】:How to use my custom Symfony 3.0 Library/Bundle/HowIsCalled如何使用我的自定义 Symfony 3.0 Library/Bundle/HowIsCalled
【发布时间】:2018-11-05 07:13:31
【问题描述】:

通过查看这些文档:

我已经制作了这个库:

<?php
namespace Acme\HelloBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;

class Image extends ConfigurableExtension
{
    /*The size of the thumbnail*/
    private $thumb_max_width=100;
    private $thumb_max_height=100;
    /*End of: "The size of the thumbnail"*/

    private $image_width=0;
    private $image_height=0;

    /**
    *Contains the Image Data
    */
    private $image=null;

    protected function setThumbHeight($value)
    {
      $thumb_max_height=$value>0?$value:0;
    }

    protected function setThumbWidth($value)
    {
      $thumb_max_width=$value>0?$value:0;
    }

    /**
    *Function that Loads the configuration
    */
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container)
    {
        var_dump($mergedConfig);
    }

    /**
    *Loads a $file from $extention
    *@param $file {String} The path of file
    *@param $extention {String} the type or the extention of the image
    *
    *@return This Object Instance
    */
    public function load($file)
    {

      $extention= exif_imagetype($file);

      switch($extention)
      {
        case IMAGETYPE_PNG:
          $this->image=imagecreatefrompng($file);
          break;

        case IMAGETYPE_JPEG:
          $this->image=imagecreatefromjpeg($file);
          break;

        case IMAGETYPE_GIF:
          $this->image=imagecreatefromgif($file);
          break;
      }

      $this->image_width=imagesx($this->image);
      $this->image_height=imagesy($this->image);
      return $this;
    }

    /**
    * Resizes an Image
    * @param $width {Int} The new images width
    * @param $height {Int} The new Images Height
    *
    * @return The Object Instance
    */
    public function resize($width,$height)
    {
      $new_image=imagecreatetruecolor($width,$height);
      imagecopyresampled($new_image,$this->image, 0, 0, 0, 0,$width,$height);

      /*Set the new data to the Image*/
      imagedestroy($this->image);
      $this->image=$new_image;
      /*End of: "Set the new data to the Image"*/

      return $this;
    }

    /**
    *Generates a thumbnail of the image
    *The thumbnail size is retrieved from configuration
    *
    * @return The Object Instance
    */
    public function to_thumb()
    {
      $width=0;
      $width=0;

      /*Determine the resize width and height*/
      $source_aspect_ratio = $this->image_width / $this->image_height;
      $thumbnail_aspect_ratio = $this->thumb_max_width / $this->thumb_max_height;

      if ($this->image_width <= $this->thumb_max_width && $this->image_height <= $this->thumb_max_height)
      {
        $width = $this->image_width;
        $height = $this->image_height;
      }
      elseif ($thumbnail_aspect_ratio > $source_aspect_ratio)
      {
        $width = (int) ($this->thumb_max_height * $source_aspect_ratio);
        $height = $this->thumb_max_height;
      }
      else
      {
        $width = $this->thumb_max_width;
        $height = (int) ($this->thumb_max_width / $source_aspect_ratio);
      }
      /*End of: "Determine the resize width and height"*/

      $this->resize($width,$width);

      return $this;
    }

    /**
    *Exports the image to a file
    *@param file {String} The file path
    */
    public function export($file)
    {
      $ext = pathinfo($file, PATHINFO_EXTENSION);
      $ext=strtolower($ext);

      $write=false;

      switch($ext)
      {
        case 'png':
          imagesavealpha($this->image,true);
          $write=imagepng($this->image,$file);
        case 'jpeg':
        case 'jpg':
          $write=imagejpeg($this->image,$file);
        case 'gif':
          $write=imagegif($this->image,$file);
      }
      imagedestroy($this->image);
    }
}
?>

上面的库位于src/AppBundle/ImageBundle/DependencyInjection/Image.php。我希望能够将它加载到实体(在 Doctrine 钩子上)或控制器中。但我不知道该怎么做。

【问题讨论】:

  • 另外请记住,如果您来自 codeigniter 用法,Symfony 中的模型实现变化很大。 Model 实际上是服务,根本没有单一的方法,所以您需要将它作为参数传递给服务的构造函数,因此您需要以“模型”实际上做一件事的方法设计您的应用程序。因此,您需要一个用于 Db I/O 的“模型”(又名 DoctrineRepository)、一个用于图像操作的“模型”以及(可选)一个“模型”将它们组合在一起。

标签: php symfony


【解决方案1】:

你做的东西太复杂了。

首先,您不能在捆绑包中包含捆绑包(您说的是src/AppBundle/ImageBundle)。

那么,您的库就不需要扩展 ConfigurableExtension
因此,在创建一个干净的独立包 (php app/console generate:bundle) 之后,
创建一个Util 目录,将类移入并更改如下:

namespace ImageBundle\Util;

class Image
{
    // Methods
}

然后,您可以将其声明为服务:

# app/config/services.yml
acme_image:
    class: ImageBundle\Util\Image

在控制器中,像这样使用它:

$image = $this->get('acme_image');

在实体中(无法访问服务容器),只需创建您的类的新实例:

$image = new ImageBundle\Util\Image();

请注意,Symfony 主要是一个 PHP 框架。
当然,第一次尝试时有非常酷的功能和一些复杂的东西,但它仍然是 PHP。

编辑

要使用从服务类中注入的arguments,只需在构造函数中检索并定义它们即可。

例如注入教义EntityManager:

# app/config/services.yml
acme_image:
    class: ImageBundle\Util\Image
    arguments: [ "@doctrine.orm.entity_manager" ]

然后,从您的班级中检索它:

use Doctrine\ORM\EntityManagerInterface;
// ...

class Image
{
    private $em;

    public function __construct(EntityManagerInterface $entityManager)
    {
         $this->em = $entityManager;
    }

    // ...

    public function doSomething()
    {
        // Use the defined property
        $repository = $this->em->getRepository(...);

        // ... 
    }
}

【讨论】:

  • 当我生成 ImageBundle\Util\Image 的新实例时,如何访问 services.yml 提供的设置?
  • 你可以使用arguments(另一个服务,一个定义的参数,...)在你的服务中注入你想要的东西,并在你的类的构造函数中检索它们。看服务:symfony.com/doc/current/book/…
  • 我生成了 Bundle,但它有一个 ImageBundle.php 文件和文件夹 Controllers、Resouces 和 Tests 我需要以下文件吗?
  • 这是包的最小结构。 Resources/ 将包含一个 config 目录,该目录应该包含路由和服务定义,一个 public 目录用于您的捆绑资产。 Controllers/ 将包含您的捆绑包的所有控制器,并且该目录将用于检索它们,尤其是 RouterLoader 将尝试从您的路由定义中匹配它们(例如,_controller: AppBundle:Default:index 将查找 AppBundle\Controller\DefaultController::indexAction)。最后,Tests 是你的 bundle 的测试目录。所以是的,你需要这些文件。
  • 但是如果没有在构造函数上提供参数(在 thw 内部创建实例)我如何从 services.yml 中检索它们我的意思是通过调用新的 ImageBundle\Util\Image() hoc 我可以阅读services.yml 中的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2018-10-19
  • 2023-01-29
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多