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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Zend Framework 1.5 - Zend Framework Manual</title>
</head>
<body>
<table width="100%">
<tr valign="top">
<td width="85%">
<table width="100%">
<tr>
<td width="25%" style="text-align: left;">
<a href="migration.16.html">Zend Framework 1.6</a>
</td>
<td width="50%" style="text-align: center;">
<div class="up"><span class="up"><a href="migration.html">Zend Gdata Migration Notes</a></span><br />
<span class="home"><a href="manual.html">Programmer's Reference Guide</a></span></div>
</td>
<td width="25%" style="text-align: right;">
<div class="next" style="text-align: right; float: right;"><a href="migration.10.html">Zend Framework 1.0</a></div>
</td>
</tr>
</table>
<hr />
<div id="migration.15" class="section"><div class="info"><h1 class="title">Zend Framework 1.5</h1></div>
<p class="para">
When upgrading from a previous release to Zend Framework 1.5 or higher you
should note the following migration notes.
</p>
<div class="section" id="migration.15.zend.controller" name="migration.15.zend.controller"><div class="info"><h1 class="title">Zend_Controller</h1></div>
<p class="para">
Though most basic functionality remains the same, and all documented
functionality remains the same, there is one particular
<em class="emphasis">undocumented</em> "feature" that has changed.
</p>
<p class="para">
When writing <acronym class="acronym">URL</acronym>s, the documented way to write camelCased action
names is to use a word separator; these are '.' or '-' by default,
but may be configured in the dispatcher. The dispatcher internally
lowercases the action name, and uses these word separators to
re-assemble the action method using camelCasing. However, because <acronym class="acronym">PHP</acronym>
functions are not case sensitive, you <em class="emphasis">could</em>
still write <acronym class="acronym">URL</acronym>s using camelCasing, and the dispatcher would resolve
these to the same location. For example, 'camel-cased' would become
'camelCasedAction' by the dispatcher, whereas 'camelCased' would
become 'camelcasedAction'; however, due to the case insensitivity of
<acronym class="acronym">PHP</acronym>, both will execute the same method.
</p>
<p class="para">
This causes issues with the ViewRenderer when resolving view
scripts. The canonical, documented way is that all word separators
are converted to dashes, and the words lowercased. This creates
a semantic tie between the actions and view scripts, and the
normalization ensures that the scripts can be found. However, if the
action 'camelCased' is called and actually resolves, the word
separator is no longer present, and the ViewRenderer attempts to
resolve to a different location -- <var class="filename">camelcased.phtml</var> instead of
<var class="filename">camel-cased.phtml</var>.
</p>
<p class="para">
Some developers relied on this "feature", which was never intended.
Several changes in the 1.5.0 tree, however, made it so that the
ViewRenderer no longer resolves these paths; the semantic tie is now
enforced. First among these, the dispatcher now enforces case
sensitivity in action names. What this means is that referring to
your actions on the url using camelCasing will no longer resolve to
the same method as using word separators (i.e., 'camel-casing').
This leads to the ViewRenderer now only honoring the word-separated
actions when resolving view scripts.
</p>
<p class="para">
If you find that you were relying on this "feature", you have several
options:
</p>
<ul class="itemizedlist">
<li class="listitem">
<p class="para">
Best option: rename your view scripts. Pros: forward
compatibility. Cons: if you have many view scripts that
relied on the former, unintended behavior, you will have a
lot of renaming to do.
</p>
</li>
<li class="listitem">
<p class="para">
Second best option: The ViewRenderer now delegates view
script resolution to <span class="classname">Zend_Filter_Inflector</span>; you
can modify the rules of the inflector to no longer separate
the words of an action with a dash:
</p>
<div class="programlisting php"><div class="phpcode"><div class="php" style="font-family: monospace;"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$viewRenderer</span> =</div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> Zend_Controller_Action_HelperBroker::<span style="color: #006600;">getStaticHelper</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'viewRenderer'</span><span style="color: #66cc66;">)</span>;</div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$inflector</span> = <span style="color: #0000ff;">$viewRenderer</span>-><span style="color: #006600;">getInflector</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;</div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$inflector</span>-><span style="color: #006600;">setFilterRule</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">':action'</span>, <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">(</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> <span style="color: #000000; font-weight: bold;">new</span> Zend_Filter_PregReplace<span style="color: #66cc66;">(</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> <span style="color: #ff0000;">'#[^a-z0-9'</span> . <a href="http://www.php.net/preg_quote"><span style="color: #000066;">preg_quote</span></a><span style="color: #66cc66;">(</span>DIRECTORY_SEPARATOR, <span style="color: #ff0000;">'#'</span><span style="color: #66cc66;">)</span> . <span style="color: #ff0000;">']+#i'</span>,</div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> <span style="color: #ff0000;">''</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> <span style="color: #66cc66;">)</span>,</div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"> <span style="color: #ff0000;">'StringToLower'</span></div></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;</div></li></ol></div></div></div>
<p class="para">
The above code will modify the inflector to no longer
separate the words with dash; you may also want to remove
the 'StringToLower' filter if you <em class="emphasis">do</em>
want the actual view script names camelCased as well.
</p>
<p class="para">
If renaming your view scripts would be too tedious or time
consuming, this is your best option until you can find the
time to do so.
</p>
</li>
<li class="listitem">
<p class="para">
Least desirable option: You can force the dispatcher to
dispatch camelCased action names with a new front controller
flag, <span class="property">useCaseSensitiveActions</span>:
</p>
<div class="programlisting php"><div class="phpcode"><div class="php" style="font-family: monospace;"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$front</span>-><span style="color: #006600;">setParam</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">'useCaseSensitiveActions'</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">)</span>;</div></li></ol></div></div></div>
<p class="para">
This will allow you to use camelCasing on the url and still
have it resolve to the same action as when you use word
separators. However, this will mean that the original issues
will cascade on through; you will likely need to use the
second option above in addition to this for things to work
at all reliably.
</p>
<p class="para">
Note, also, that usage of this flag will raise a notice that
this usage is deprecated.
</p>
</li>
</ul>
</div>
</div>
<hr />
<table width="100%">
<tr>
<td width="25%" style="text-align: left;">
<a href="migration.16.html">Zend Framework 1.6</a>
</td>
<td width="50%" style="text-align: center;">
<div class="up"><span class="up"><a href="migration.html">Zend Gdata Migration Notes</a></span><br />
<span class="home"><a href="manual.html">Programmer's Reference Guide</a></span></div>
</td>
<td width="25%" style="text-align: right;">
<div class="next" style="text-align: right; float: right;"><a href="migration.10.html">Zend Framework 1.0</a></div>
</td>
</tr>
</table>
</td>
<td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
float: left;
width: 186px;
padding: 5px;
font-size: smaller;
}
ul.toc {
margin: 0px 5px 5px 5px;
padding: 0px;
}
ul.toc li {
font-size: 85%;
margin: 1px 0 1px 1px;
padding: 1px 0 1px 11px;
list-style-type: none;
background-repeat: no-repeat;
background-position: center left;
}
ul.toc li.header {
font-size: 115%;
padding: 5px 0px 5px 11px;
border-bottom: 1px solid #cccccc;
margin-bottom: 5px;
}
ul.toc li.active {
font-weight: bold;
}
ul.toc li a {
text-decoration: none;
}
ul.toc li a:hover {
text-decoration: underline;
}
</style>
<ul class="toc">
<li class="header home"><a href="manual.html">Programmer's Reference Guide</a></li>
<li class="header up"><a href="manual.html">Programmer's Reference Guide</a></li>
<li class="header up"><a href="migration.html">Zend Gdata Migration Notes</a></li>
<li><a href="migration.112.html">Zend Framework 1.12</a></li>
<li><a href="migration.110.html">Zend Framework 1.10</a></li>
<li><a href="migration.19.html">Zend Framework 1.9</a></li>
<li><a href="migration.18.html">Zend Framework 1.8</a></li>
<li><a href="migration.17.html">Zend Framework 1.7</a></li>
<li><a href="migration.16.html">Zend Framework 1.6</a></li>
<li class="active"><a href="migration.15.html">Zend Framework 1.5</a></li>
<li><a href="migration.10.html">Zend Framework 1.0</a></li>
<li><a href="migration.09.html">Zend Framework 0.9</a></li>
<li><a href="migration.08.html">Zend Framework 0.8</a></li>
<li><a href="migration.06.html">Zend Framework 0.6</a></li>
</ul>
</td>
</tr>
</table>
</body>
</html>
|