Ответы пользователя по тегу Zend Framework
  • Почему continue_if_empty не работает для FileInput?

    @novrm
    /**
     * Configuration of the input filter for element based on the provided specification.
     * Specification can contain any of the following:
     *
     * .-------------------.----------------.-----------------.-----------------.--------------------.
     * | continue_if_empty | required       | allow_empty     | Is empty valid? | Apply other filter |
     * |-------------------+----------------+-----------------+-----------------+--------------------|
     * | false (default)   | true (default) | false (default) | false           | Not                |
     * | false (default)   | true (default) | true            | true            | Not                |
     * | false (default)   | false          | false (default) | true            | Not                |
     * | true              | true (default) | false (default) | true            | Yes                |
     * |-------------------+----------------+-----------------+-----------------+--------------------|
     * | false (default)   | false          | true            | true            | Not                |
     * | true              | true (default) | true            | true            | Yes                |
     * | true              | false          | false (default) | true            | Yes                |
     * | true              | false          | true            | true            | Yes                |
     * '-------------------'----------------'-----------------'-----------------'--------------------'
     */
    Ответ написан
    Комментировать
  • Как запустить ZendFramework?

    @novrm
    Регистрация и автозагрузка классов для ZF3 теперь осуществляется через composer.

    Было для ZF2 index.php:
    <?php
    /**
     * This makes our life easier when dealing with paths. Everything is relative
     * to the application root now.
     */
    chdir(dirname(__DIR__));
    // Decline static file requests back to the PHP built-in webserver
    if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
        return false;
    }
    // Setup autoloading
    require 'init_autoloader.php';
    // Run the application!
    Zend\Mvc\Application::init(require 'config/application.config.php')->run();


    Стало для ZF3 index.php:
    <?php
    use Zend\Mvc\Application;
    use Zend\Stdlib\ArrayUtils;
    /**
     * This makes our life easier when dealing with paths. Everything is relative
     * to the application root now.
     */
    chdir(dirname(__DIR__));
    // Decline static file requests back to the PHP built-in webserver
    if (php_sapi_name() === 'cli-server') {
        $path = realpath(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
        if (__FILE__ !== $path && is_file($path)) {
            return false;
        }
        unset($path);
    }
    // Composer autoloading
    include __DIR__ . '/../vendor/autoload.php';
    if (! class_exists(Application::class)) {
        throw new RuntimeException(
            "Unable to load application.\n"
            . "- Type `composer install` if you are developing locally.\n"
            . "- Type `vagrant ssh -c 'composer install'` if you are using Vagrant.\n"
            . "- Type `docker-compose run zf composer install` if you are using Docker.\n"
        );
    }
    // Retrieve configuration
    $appConfig = require __DIR__ . '/../config/application.config.php';
    if (file_exists(__DIR__ . '/../config/development.config.php')) {
        $appConfig = ArrayUtils::merge($appConfig, require __DIR__ . '/../config/development.config.php');
    }
    // Run the application!
    Application::init($appConfig)->run();
    Ответ написан
  • Как подключить doctrine к zend expressive?

    @novrm
    Как-то так: https://github.com/doctrine/DoctrineORMModule#conn...
    <?php
    return [
        'doctrine' => [
            'connection' => [
                'orm_default' => [
                    'driverClass' => \Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                    'params' => [
                        'host'     => 'localhost',
                        'port'     => '3306',
                        'user'     => 'username',
                        'password' => 'password',
                        'dbname'   => 'database',
                        'driverOptions' => [
                            \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
                        ],
                    ],
                ],
            ],
        ],
    ];
    Ответ написан
    Комментировать
  • Как в Doctrine засетить переменную при подключение?

    @novrm
    Нечто похожее реализовано в модуле запоминания регистрации пользователя.
    Процедура происходит одновременно как через сессии так и через Doctrine.
    goalio/GoalioRememberMe
    goalio/GoalioRememberMeDoctrineORM
    Ответ написан
    Комментировать
  • Чем различаются ServiceManager и ModuleManager?

    @novrm
    Если рассматривать проект в виде "пирамиды", то...

    На вершине - веб-приложение - отображение которого есть сайт.

    Модуль - самодостаточный единичный "блок" веб-приложения; функционально завершенный php-код которого может состоять из моделей, видов, контроллеров, сервисов и прочее... Модуль расширяет функциональные возможности веб-приложения и может функционировать лишь "внутри" веб-приложения.
    ModuleManager - контейнер для манипуляций модулями.

    Сервис - "механизм" в модуле, для манипуляций между моделями, контроллерами, видами, прочее...
    ServiceManager - контейнер для манипуляций сервисами.
    Ответ написан
  • Kак добавить пагинацию?

    @novrm
    Чем вам не подошла официальная документация?
    zend-paginator
    Ответ написан
    Комментировать
  • Можно ли в ZF3 создавать свои объекты типа ViewModel и выносить туда логику представления?

    @novrm
    Не только можно, но и нужно...
    Когда ваш проект разрастется до беспредела - создание отдельных классов для представления станет единственным решением для оптимизации видов.
    Простой проект этого не требует.

    Этот рецепт, кстати относится к любому компоненту ZF3.
    Чем сложнее - тем больше приходится дробить дабы не утонуть в океане кода.

    ----------------
    Еще одно.
    Вам не нужно наследовать класс представления от ViewModel.
    Зачем такое?
    Просто создавайте класс в котором "оформляйте" переменные для видов.
    ... и передавайте переменные...

    return (new ViewModel())
            ->setVariables($productsView->getItemsVariables())
            ;
    Ответ написан
    Комментировать
  • Как использовать события в ZF2/3?

    @novrm
    Вам нужно понять главный смысл событий в ZF3 - нужно создавать ОТДЕЛЬНЫЙ ИНДИВИДУАЛЬНЫЙ экземпляр EventManager для каждой группы событий.
    ... и потом извлекать события из этого же ИНДИВИДУАЛЬНОГО EventManager*а.
    То есть фишка с одним EventManager для ВСЕГО проекта - это путь в тупик.
    Ответ написан
  • Как решить проблему "Circular dependency" в Zend 2 или вообще грамотно организовать внедрение зависимостей?

    @novrm
    Поставьте ограничение на количество циклов.
    В классе пропишите некую переменную, которая будет уменьшатся до определенного значения при каждой итерации.
    Ответ написан
    Комментировать
  • Что лучше выбрать из Zend Framwork 3 для портала MVC или Expressive?

    @novrm
    Вы забыли указать ваш уровень познания Zend Framework.
    Если вы начинающий - реализовать портал (с модулями блога, магазина и скорее всего еще какой-то хотелки - на поддоменах, но в рамках 1 проекта) на Zend Framwork 3 - извините - это для вас будет неподъемная задача.

    Если у вас средний уровень знаний по Zend Framework - пишите на Zend Framework 3.

    Если вы считаете себя асом - можете писать на Zend Framework Expressive.

    Дело в том, что к Expressive мало сторонних модулей. Вам все придется писать самому.
    Ответ написан
    Комментировать
  • Как в Zend Framework 3 организовать несколько зависимых проектов?

    @novrm
    Вам нужно смотреть в сторону модулей типа LosDomain.
    Ответ написан
    Комментировать
  • Проект на ZF1 - как перейти на более новый фрейм?

    @novrm
    Никак. Ваш единственный путь - переписать все с нуля на ZF3.
    Даже ZF2 не совместим с ZF3.
    Ответ написан
  • Как написать автогенерацию номера в Doctrina?

    @novrm
    Если вы работаете с Doctrine - у вас должен быть уникальный id типа INT для каждой записи.
    А раз есть уникальный id - вы можете поставить ему автоинкремент. Это стандартное решение вашей задачи.
    Танцы с бубном - лишнее и вредное.

    Ибо...
    Если вы внимательно читали руководство к Doctirne - вы не наступите на грабли начинающего, который любое поле берет за уникальное. Любое - нельзя.

    28.1.1. Join-Columns with non-primary keys

    It is not possible to use join columns pointing to non-primary keys. Doctrine will think these are the primary keys and create lazy-loading proxies with the data, which can lead to unexpected results. Doctrine can for performance reasons not validate the correctness of this settings at runtime but only through the Validate Schema command.
    Ответ написан
  • Как быть с контроллером?

    @novrm
    Значит так - пиши такой маршрут.
    А об пагинаторе я тебе отписал дальше.
    'router' => [
        'routes' => [
    
            /** Configuration of the 'shop' routes. */
            'shop' => [
                'type'    => 'Literal',
                'options' => [
                    'route'    => '/shop/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
                'may_terminate' => true,
                'child_routes' => [
    
                    /** Configuration of the 'shop/category' routes. */
                    'category' => [
                        'type'    => 'Literal',
                        'options' => [
                            'route'    => 'category/',
                            'defaults' => [
                                'controller' => Controller\CategoryController::class,
                                'action'     => 'index',
                            ],
                        ],
                        'may_terminate' => true,
                        'child_routes' => [
    
                            /** Configuration of the 'shop/category/action' routes. */
                            'action' => [
                                'type' => 'Segment',
                                'options' => [
                                    'route' => '[:action]',
                                    'constraints' => [
                                        'action' => '(create)',
                                    ],
                                ],
                            ],
    
                            /** Configuration of the 'shop/category/category' routes. */
                            'category' => [
                                'type' => 'Segment',
                                'options' => [
                                    'route' => '[:id/]',
                                    'constraints' => [
                                        'id' => '[0-9]+',
                                    ],
                                    'defaults' => [
                                        'id' => null,
                                    ],
                                ],
                                'may_terminate' => true,
                                'child_routes' => [
    
                                    /** Configuration of the 'shop/category/category/action' routes. */
                                    'action' => [
                                        'type' => 'Segment',
                                        'options' => [
                                            'route' => '[:action]',
                                            'constraints' => [
                                                'action' => '(update|delete)',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
    Ответ написан
  • Как вытащить id в phtml?

    @novrm
    Не понял юмора. Просто передай в вид переменную id.
    Не нужно ее пихать в пагинатор и пытаться оттуда достать недоставуемое.

    Пагинатор в вид отдает только следующие переменные, и не больше.
    .---------------------------------------------------------------------------------------.
     | Property         | Type    | Description                                              |
     |---------------------------------------------------------------------------------------|
     | first            | integer | First page number (typically 1).                         |
     | firstItemNumber  | integer | Absolute number of the first item on this page.          |
     | firstPageInRange | integer | First page in the range returned by the scrolling style. |
     | current          | integer | Current page number.                                     |
     | currentItemCount | integer | Number of items on this page.                            |
     | itemCountPerPage | integer | Maximum number of items available to each page.          |
     | last             | integer | Last page number.                                        |
     | lastItemNumber   | integer | Absolute number of the last item on this page.           |
     | lastPageInRange  | integer | Last page in the range returned by the scrolling style.  |
     | next             | integer | Next page number.                                        |
     | pageCount        | integer | Number of pages.                                         |
     | pagesInRange     | array   | Array of pages returned by the scrolling style.          |
     | previous         | integer | Previous page number.                                    |
     | totalItemCount   | integer | Total number of items.                                   |
     '---------------------------------------------------------------------------------------'
    Ответ написан
    Комментировать
  • Как создать связанные записи со связью many-to-many в zend framework, используя doctrine?

    @novrm
    Если поможет, если не поможет - звиняйте...
    Попробуйте вот эти инструменты:
    https://www.mysql.com/products/workbench/
    https://github.com/mysql-workbench-schema-exporter...

    На скорую руку автомат наваял следующие сущности для пробного модуля TestModule:
    b52390696a37424bb2aafa429bc25bf1.jpg
    <?php
    
    /**
     * Auto generated by MySQL Workbench Schema Exporter.
     * Version 3.0.2 (doctrine2-annotation) on 2016-07-26 19:31:50.
     * Goto https://github.com/johmue/mysql-workbench-schema-exporter for more
     * information.
     */
    
    namespace TestModule\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * TestModule\Entity\Portfolio
     *
     * @ORM\Entity()
     * @ORM\Table(name="Portfolio")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"base":"BasePortfolio", "extended":"Portfolio"})
     */
    class BasePortfolio
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         */
        protected $idPortfolio;
    
        /**
         * @ORM\ManyToMany(targetEntity="Tag", mappedBy="portfolios")
         */
        protected $tags;
    
        public function __construct()
        {
            $this->tags = new ArrayCollection();
        }
    
        /**
         * Set the value of idPortfolio.
         *
         * @param integer $idPortfolio
         * @return \TestModule\Entity\Portfolio
         */
        public function setIdPortfolio($idPortfolio)
        {
            $this->idPortfolio = $idPortfolio;
    
            return $this;
        }
    
        /**
         * Get the value of idPortfolio.
         *
         * @return integer
         */
        public function getIdPortfolio()
        {
            return $this->idPortfolio;
        }
    
        /**
         * Add Tag entity to collection.
         *
         * @param \TestModule\Entity\Tag $tag
         * @return \TestModule\Entity\Portfolio
         */
        public function addTag(Tag $tag)
        {
            $this->tags[] = $tag;
    
            return $this;
        }
    
        /**
         * Remove Tag entity from collection.
         *
         * @param \TestModule\Entity\Tag $tag
         * @return \TestModule\Entity\Portfolio
         */
        public function removeTag(Tag $tag)
        {
            $this->tags->removeElement($tag);
    
            return $this;
        }
    
        /**
         * Get Tag entity collection.
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getTags()
        {
            return $this->tags;
        }
    
    }


    <?php
    
    /**
     * Auto generated by MySQL Workbench Schema Exporter.
     * Version 3.0.2 (doctrine2-annotation) on 2016-07-26 19:31:50.
     * Goto https://github.com/johmue/mysql-workbench-schema-exporter for more
     * information.
     */
    
    namespace TestModule\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * TestModule\Entity\Tag
     *
     * @ORM\Entity()
     * @ORM\Table(name="Tag")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"base":"BaseTag", "extended":"Tag"})
     */
    class BaseTag
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         */
        protected $idTag;
    
        /**
         * @ORM\ManyToMany(targetEntity="Portfolio", inversedBy="tags")
         * @ORM\JoinTable(name="Portfolio_has_Tag",
         *     joinColumns={@ORM\JoinColumn(name="Tag_idTag", referencedColumnName="idTag", nullable=false)},
         *     inverseJoinColumns={@ORM\JoinColumn(name="Portfolio_idPortfolio", referencedColumnName="idPortfolio", nullable=false)}
         * )
         */
        protected $portfolios;
    
        public function __construct()
        {
            $this->portfolios = new ArrayCollection();
        }
    
        /**
         * Set the value of idTag.
         *
         * @param integer $idTag
         * @return \TestModule\Entity\Tag
         */
        public function setIdTag($idTag)
        {
            $this->idTag = $idTag;
    
            return $this;
        }
    
        /**
         * Get the value of idTag.
         *
         * @return integer
         */
        public function getIdTag()
        {
            return $this->idTag;
        }
    
        /**
         * Add Portfolio entity to collection.
         *
         * @param \TestModule\Entity\Portfolio $portfolio
         * @return \TestModule\Entity\Tag
         */
        public function addPortfolio(Portfolio $portfolio)
        {
            $portfolio->addTag($this);
            $this->portfolios[] = $portfolio;
    
            return $this;
        }
    
        /**
         * Remove Portfolio entity from collection.
         *
         * @param \TestModule\Entity\Portfolio $portfolio
         * @return \TestModule\Entity\Tag
         */
        public function removePortfolio(Portfolio $portfolio)
        {
            $portfolio->removeTag($this);
            $this->portfolios->removeElement($portfolio);
    
            return $this;
        }
    
        /**
         * Get Portfolio entity collection.
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getPortfolios()
        {
            return $this->portfolios;
        }
    
    }
    Ответ написан
    Комментировать
  • Можно ли в onBootstrap принудительно вызвать action определенного контроллера?

    @novrm
    Не совсем понятно что вы хотите сделать?
    Сделать перенаправление на другой контроллер или действие? Так сделайте это с того контроллера, который вызывается первым...
    Ответ написан
    Комментировать