Архив рубрики: PHP

Zend Framework 3 перенаправление страницы из модуля приложения

Задача: если не установлены куки, перенаправить пользователя на страницу авторизации, вне зависимости от первоначальной точки входа в приложение

Решение: про первой инициализации модуля, создаем событие onDispath, в котором смотрим куки, и если они нас не устраивают — меняем шаблон и перенаправляем на другой контроллер:

    public function init(ModuleManager $manager){       
        // Получаем менеджер событий.
        $eventManager = $manager->getEventManager();
        $sharedEventManager = $eventManager->getSharedManager();
        // Регистрируем метод-обработчик.            
        $sharedEventManager->attach(__NAMESPACE__, 'dispatch', [$this, 'onDispatch'], 100);
        
    }   
    // Обработчик события.
    public function onDispatch(MvcEvent $event){        
        if (Auth::GetCookies("randomid4")==false){            
            // Получаем контроллер, к которому был отправлен HTTP-запрос.
              $controller = $event->getTarget();
              // Получаем полностью определенное имя класса контроллера.
              $controllerClass = get_class($controller);
              // Получаем имя модуля контроллера.
              $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
              $viewModel = $event->getViewModel();                  
              $viewModel->setTemplate('layout/login');                                                   
              $uri = $event->getRequest()->getUri();              
              $patch = $uri->getPath();              
                if ($patch!="/user/login"){
                      $uri->setPath('/user/login');
                      $response=$event->getResponse();
                      $response->getHeaders()->addHeaderLine('Location', $uri);
                      $response->setStatusCode(301);
                      $response->sendHeaders();
                    return $response;
                };                
        }
    }

 

Zend Framework 3 получение конфигурации приложения из контроллера

Казалось бы простая вещь, а телодвижений много. Странно. Но тем не менее, решение есть.

Конфигурация приложения:

<?php
return [
    'database'=>[
                        'host'  => '127.0.0.1',
                        'username'=>'root',
                        'password'=>'perferfre',
                        'basename'=>'mysql'        
    ],
    'modules' => [
            'Zend\Router',
            'Zend\Validator',
            'Application',            
    ],
    'module_listener_options' => [
        'module_paths' => [
            './module',
            './vendor',
        ],
        'config_cache_enabled' => false,
        'config_cache_key' => 'application.config.cache',
        'module_map_cache_enabled' => false,
        'module_map_cache_key' => 'application.module.cache',
        'cache_dir' => 'data/cache/',
    ],    
];

Создаем  фабрику IndexControllerFactory.php:

namespace Application\Controller;

use Zend\ServiceManager\Factory\FactoryInterface;
use Interop\Container\ContainerInterface;

class IndexControllerFactory implements FactoryInterface{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
        $config = $container->get("ApplicationConfig");
        return new IndexController($config);
    }
}

В конфигурации модуля:

            'controllers' => [
                'factories' => [
                    Controller\IndexController::class => Controller\IndexControllerFactory::class,                        
                    Controller\UserController::class => InvokableFactory::class,                        
                ],
            ],

В контроллере:

class IndexController extends AbstractActionController{        
    var $sqln; 
    public function __construct(array $config) {     
        var_dump($config);
	 }    
...

 

Минимальный скелет приложения для Zend Framework 3

Решил попробовать не собирать каждый раз при старте нового проекта свой «каркас» приложения, а взять  уже готовый фреймворк в стиле MVC и попробовать использовать его. Пока выбор пал на Zend Framework, потому что там похоже действительно самый минимум. Он не «раздутый», который для использования не требует недель изучения для «старта» (типа YII).  С фреймворком,в базе для первоначального обучения идет «штатный минимальный шаблон»  : https://github.com/zendframework/ZendSkeletonApplication, но мне он  тоже показался слишком усложненным. Потому в ходе «упрощения» создал свой:

https://github.com/donpadlo/zend3skeleton

, который при помощи composer позволяет установить фреймворк, и позволяет поддерживать актуальными дополнительные компоненты типа jquery, bootstrap4 и т.д.

Кроме того, из штатного «скелета» вырезан лишний код, который усложняет первоначальное понимание принципов работы Zend Framework

В шаблоне так-же рассмотрен вариант использования двух контроллеров, а не одного как в «базе» (в реальных проектах число контроллеров стремится к увеличению)

 

Использование Composer в проектах на PHP

Composer — это менеджер внешних библиотек для вашего проекта. Например, если вы используете jquery, jqueryui, какие-то другие библиотеки, то для того чтобы не тащить их при переносе проекта, не следить за их обновлением и актуальностью, достаточно использовать Composer. При новой инсталляции проекта достаточно будет выполнить

composer install

для генерации начального composer.json  (создание нового проекта) достаточно выполнить:

composer init

добавить нужные пакеты в папку vendor можно:

composer require components/jquery:3.3.1
composer require components/jqueryui:1.12.1
composer require components/font-awesome:5.4.2
composer require components/bootstrap:4.1.1

Обновить пакеты можно:

composer update

Ну и далее как использовать в своем коде PHP:

require_once vendor/autoload.php
 
Или JS:
 
<script src="/vendor/components/jquery/jquery.js"></script>

Ну и в догонку. Если у вас из проекта нет доступа к папке vendor, а нужно для использования например css и js непосредственно на странице, можно сделать симлинк, например что-то вроде:

pavel@pavelpc:/var/www/webuseorg4/public$ ln -s ../vendor/components/ components
pavel@pavelpc:/var/www/webuseorg4/public$