zf3: получение значений из GET и POST
В контроллере:
1 2 |
$rows=$this->params()->fromQuery('rows', '10'); $url=$this->params()->fromPost('url', ''); |
Жизнь замечательных грибов
В контроллере:
1 2 |
$rows=$this->params()->fromQuery('rows', '10'); $url=$this->params()->fromPost('url', ''); |
Контроллер можно оформить например так:
1 2 3 4 5 6 7 |
public function sendresultAction(){ $response = $this->getResponse(); $headers = $response->getHeaders(); $headers->addHeaderLine("Content-type: application/json"); $response->setContent(json_encode(["result" => "ok"])); return $this->getResponse(); } |
Задача: естественным для Zend Framework способом выводить в шаблоне phtml некий HTML текст генерируемый на сервере.
Решение: создадим helper (помошник вида), на примере вывода каких то сообщений пользователю.
1) В настройках модуля анонсируем помошника:
1 2 3 4 |
'view_helpers' => [ 'factories' => [View\Helper\Messages::class => InvokableFactory::class], 'aliases' => ['mess' => View\Helper\Messages::class], ], |
2) Создаем класс /module/Application/src/View/Helper/Messages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace Application\View\Helper; use Zend\View\Helper\AbstractHelper; use Application\Common\CommonFunctions; // Этот класс помощника отображения разных сообщений пользователю (статичных) class Messages extends AbstractHelper { public function __construct() { } public function renderErrorMessages() { foreach (CommonFunctions::$err as $msg) { echo '<div class="alert alert-warning alert-dismissible fade show" role="alert">'; echo "<strong>$msg</strong>"; echo '<button type="button" class="close" data-dismiss="alert" aria-label="Close">'; echo '<span aria-hidden="true">×</span>'; echo '</button>'; echo '</div>'; }; } } |
3) В нутри шаблона layout.phtml теперь можно написать чтото вроде:
1 2 3 4 5 6 7 8 |
<div class="container-fluid"> <?php echo $this->mess()->renderErrorMessages(); ?> <?= $this->content ?> <hr> <footer> <p>© 2011 - <?= date('Y') ?> by <a href="https://грибовы.рф">Pavel Gribov</a></p> </footer> </div> |
Задача: если не установлены куки, перенаправить пользователя на страницу авторизации, вне зависимости от первоначальной точки входа в приложение
Решение: про первой инициализации модуля, создаем событие onDispath, в котором смотрим куки, и если они нас не устраивают — меняем шаблон и перенаправляем на другой контроллер:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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; }; } } |
Казалось бы простая вещь, а телодвижений много. Странно. Но тем не менее, решение есть.
Конфигурация приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?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:
1 2 3 4 5 6 7 8 9 10 11 |
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); } } |
В конфигурации модуля:
1 2 3 4 5 6 |
'controllers' => [ 'factories' => [ Controller\IndexController::class => Controller\IndexControllerFactory::class, Controller\UserController::class => InvokableFactory::class, ], ], |
В контроллере:
1 2 3 4 5 6 |
class IndexController extends AbstractActionController{ var $sqln; public function __construct(array $config) { var_dump($config); } ... |