Routing and controllers
Routing and controllers
We will build a very simple inventory system to display our album collection. The home page will list our collection and allow us to add, edit and delete albums. Hence the following pages are required:
| Page | Description |
|---|---|
| Home | This will display the list of albums and provide links to edit and delete them. Also, a link to enable adding new albums will be provided. |
| Add new album | This page will provide a form for adding a new album. |
| Edit album | This page will provide a form for editing an album. |
| Delete album | This page will confirm that we want to delete an album and then delete it. |
Before we set up our files, it's important to understand how the framework expects the pages to be organised. Each page of the application is known as anaction and actions are grouped into controllers within modules. Hence, you would generally group related actions into a controller; for instance, a news controller might have actions of current, archived, and view.
As we have four pages that all apply to albums, we will group them in a single controller AlbumController within our Album module as four actions. The four actions will be:
| Page | Controller | Action |
|---|---|---|
| Home | AlbumController |
index |
| Add new album | AlbumController |
add |
| Edit album | AlbumController |
edit |
| Delete album | AlbumController |
delete |
The mapping of a URL to a particular action is done using routes that are defined in the module’s module.config.php file. We will add a route for our album actions. This is the updated module config file with the new code highlighted using comments.
namespace Album;
use Zend\ServiceManager\Factory\InvokableFactory;
return [
'controllers' => [
'factories' => [
Controller\AlbumController::class => InvokableFactory::class,
],
],
// The following section is new and should be added to your file:
'router' => [
'routes' => [
'album' => [
'type' => 'segment',
'options' => [
'route' => '/album[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\AlbumController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'album' => __DIR__ . '/../view',
],
],
];
The name of the route is ‘album’ and has a type of ‘segment’. The segment route allows us to specify placeholders in the URL pattern (route) that will be mapped to named parameters in the matched route. In this case, the route is/album[/:action[/:id]] which will match any URL that starts with /album. The next segment will be an optional action name, and then finally the next segment will be mapped to an optional id. The square brackets indicate that a segment is optional. The constraints section allows us to ensure that the characters within a segment are as expected, so we have limited actions to starting with a letter and then subsequent characters only being alphanumeric, underscore, or hyphen. We also limit the id to digits.
This route allows us to have the following URLs:
| URL | Page | Action |
|---|---|---|
/album |
Home (list of albums) | index |
/album/add |
Add new album | add |
/album/edit/2 |
Edit album with an id of 2 | edit |
/album/delete/4 |
Delete album with an id of 4 | delete |
Create the controller
We are now ready to set up our controller. For zend-mvc, the controller is a class that is generally called {Controller name}Controller; note that{Controller name} must start with a capital letter. This class lives in a file called{Controller name}Controller.php within the Controller subdirectory for the module; in our case that is module/Album/src/Controller/. Each action is a public method within the controller class that is named {action name}Action, where {action name} should start with a lower case letter.
Conventions not strictly enforced
This is by convention. zend-mvc doesn't provide many restrictions on controllers other than that they must implement the
Zend\Stdlib\Dispatchableinterface. The framework provides two abstract classes that do this for us:Zend\Mvc\Controller\AbstractActionControllerandZend\Mvc\Controller\AbstractRestfulController. We'll be using the standardAbstractActionController, but if you’re intending to write a RESTful web service,AbstractRestfulControllermay be useful.
Let’s go ahead and create our controller class in the filezf2-tutorials/module/Album/src/Controller/AlbumController.php:
namespace Album\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class AlbumController extends AbstractActionController
{
public function indexAction()
{
}
public function addAction()
{
}
public function editAction()
{
}
public function deleteAction()
{
}
}
We have now set up the four actions that we want to use. They won't work yet until we set up the views. The URLs for each action are:
| URL | Method called |
|---|---|
http://zf2-tutorial.localhost/album |
Album\Controller\AlbumController::indexAction |
http://zf2-tutorial.localhost/album/add |
Album\Controller\AlbumController::addAction |
http://zf2-tutorial.localhost/album/edit |
Album\Controller\AlbumController::editAction |
http://zf2-tutorial.localhost/album/delete |
Album\Controller\AlbumController::deleteAction |
We now have a working router and the actions are set up for each page of our application.
It's time to build the view and the model layer.
Initialise the view scripts
To integrate the view into our application, we need to create some view script files. These files will be executed by the DefaultViewStrategy and will be passed any variables or view models that are returned from the controller action method. These view scripts are stored in our module’s views directory within a directory named after the controller. Create these four empty files now:
module/Album/view/album/album/index.phtmlmodule/Album/view/album/album/add.phtmlmodule/Album/view/album/album/edit.phtmlmodule/Album/view/album/album/delete.phtml
We can now start filling everything in, starting with our database and models.
Routing and controllers的更多相关文章
- Laravel Controllers
Basic Controllers Instead of defining all of your route-level logic in a single routes.php file, you ...
- Orchard源码分析(7):ASP.NET MVC相关
概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展.主 ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- ASP.NET MVC相关
Orchard源码分析(7):ASP.NET MVC相关 概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供 ...
- Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
What's In This Chapter? Features of ASP.NET MVC 6 Routing Creating Controllers Creating Views Valida ...
- Pylons架构网站开发从0到1
首先说明下这里的从0到1指的是从没有听说过pylons到开发出一个看上去还不错的网站.一个月前,我没有听说过也不知道什么是pylons,HTML只知道一些标签,JavaScript也不怎么懂,由于只倾 ...
- 【ASP.NET Core】MVC 控制器的模型绑定(宏观篇)
欢迎来到老周的水文演播中心. 咱们都知道,MVC的控制器也可以用来实现 Web API 的(它们原本就是一个玩意儿),区别嘛也就是一个有 View 而另一个没有 View.于是,在依赖注入的服务容器中 ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
随机推荐
- Hibernate之QBC检索和本地SQL检索
QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口 本地SQL查询来完善HQL ...
- ODAC访问oracle时,提示:由于以前的函数求值超时,函数求值被禁用,必须继续执行才能正常返回
这是因为调试时会自动对Local/Watch等窗口里面(或鼠标停留所在)的变量求值,为了防止用户写的程序错误(比如死循环),系统有一个超时限制,如果某个属性的get中做了很复杂的操作(而不是简单地返回 ...
- Today I Cooked the Sun Yat-Sen University [2007-09-25 12:37:39]
Aha,yes,it is! And I paticipate in the school page of sysu...and cann't change my previous csu to sy ...
- 【ruby on rail 项目之 VPS下载机】
[idea] 感觉互联网上国内难以下载资源的资源,通过VPS下载后再拖回来,想做个集成功能的.这里定个计划.打算开始做,项目会在github上同步更新. [start]
- <转>Redis 应用场景
http://blog.csdn.net/hguisu/article/details/8836819 1. MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...
- Linux shell命令
一.删除监听指定端口的进程: lsof -ti: 80 | xargs kill -9 -t: 输出pid -i:查看指定端口占用情况 二.查看可执行文件动态链接库相关信息 ldd <可执行文件 ...
- mssql server 2005还原数据库bak文件与“备份集中的数据库备份与现有的xx数据库不同”解决方法
mssql server 2005还原数据库bak文件,网站使用虚拟主机建站会经常遇到,一般情况下,主机商有在线的管理程序,但有时候没有的话,就需要本地还原备份sql数据库了.这种情况mssql se ...
- NOR型flash与NAND型flash的区别
1) 闪存芯片读写的基本单位不同 应用程序对NOR芯片操作以“字”为基本单位.为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区.读写时 ...
- Android中使用sqlite笔记
1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...
- python 安装第三方模块
在Python中,安装第三方模块,是通过setuptools这个工具完成的. 如果你正在使用Mac或Linux,安装setuptools本身这个步骤就可以跳过了. 如果你正在使用Windows,请首先 ...