summaryrefslogtreecommitdiffstats
path: root/user_guide/general/controllers.html
blob: 648298eb056285aad04c2217a0e30a38bcc373ef (plain)
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>

<title>Code Igniter User Guide</title>

<style type='text/css' media='all'>@import url('../userguide.css');</style>
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />

<script type="text/javascript" src="../scripts/nav.js"></script>
<script type="text/javascript" src="../scripts/prototype.lite.js"></script>
<script type="text/javascript" src="../scripts/moo.fx.js"></script>
<script type="text/javascript">
window.onload = function() {
	myHeight = new fx.Height('nav', {duration: 400}); 
	myHeight.hide();
}
</script>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv='expires' content='-1' />
<meta http-equiv= 'pragma' content='no-cache' />
<meta name='robots' content='all' />
<meta name='author' content='Rick Ellis' />
<meta name='description' content='Code Igniter User Guide' />

</head>
<body>

<!-- START NAVIGATION -->
<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle.jpg" width="153" height="44" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div>
<div id="masthead">
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td><h1>Code Igniter User Guide Version 1.4.0</h1></td>
<td id="breadcrumb_right"><a href="../toc.html">Full Table of Contents</a></td>
</tr>
</table>
</div>
<!-- END NAVIGATION -->


<!-- START BREADCRUMB -->
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr>
<td id="breadcrumb">
<a href="http://www.codeigniter.com/">Code Igniter Home</a> &nbsp;&#8250;&nbsp;
<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;
Controllers
</td>
<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="www.codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
</tr>
</table>
<!-- END BREADCRUMB -->

<br clear="all" />


<!-- START CONTENT -->
<div id="content">

<h1>Controllers</h1>

<p>Controllers are the heart of your application, as they determine how HTTP requests should be handled.</p>


<ul>
<li><a href="#what">What is a Controller?</a></li>
<li><a href="#hello">Hello World</a></li>
<li><a href="#functions">Functions</a></li>
<li><a href="#private">Private Functions</a></li>
<li><a href="#default">Defining a Default Controller</a></li>
<li><a href="#constructors">Class Constructors</a></li>
<li><a href="#reserved">Reserved Function Names</a></li>
</ul>


<a name="what"></a>
<h2>What is a Controller?</h2>

<p><dfn>A Controller is simply a class file that is named in a way that can be associated with a URI.</dfn></p>

<p>Consider this URI:</p>

<code>www.your-site.com/index.php/<var>blog</var>/</code>

<p>In the above example, Code Igniter would attempt to find a controller named <dfn>blog.php</dfn> and load it.</p>

<p><strong>When a controller's name matches the first segment of a URI, it will be loaded.</strong></p>

<a name="hello"></a>
<h2>Let's try it:&nbsp; Hello World!</h2>

<p>Let's create a simple controller so you can see it in action.  Using your text editor, create a file called <dfn>blog.php</dfn>, and put the following code in it:</p>


<textarea class="textarea" style="width:100%" cols="50" rows="10">
<?php
class Blog extends Controller {

	function index()
	{
		echo 'Hello World!';
	}
}
?>
</textarea>



<p>Then save the file to your <dfn>application/controllers/</dfn> folder.</p>

<p>Now visit the your site using a URL similar to this:</p>

<code>www.your-site.com/index.php/<var>blog</var>/</code>

<p>If you did it right, you should see <samp>Hello World!</samp>.</p>

<p>Note: Class names must start with an uppercase letter.  In other words, this is valid:

<code>&lt;?php<br />
class <var>Blog</var> extends Controller {<br />
<br />
}<br />
?&gt;</code>

<p>This is <strong>not</strong> valid:</p>

<code>&lt;?php<br />
class <var>blog</var> extends Controller {<br />
<br />
}<br />
?&gt;</code>

<p>Also, always make sure your controller <dfn>extends</dfn> the parent controller class so that it can inherit all its functions.</p> 



<a name="functions"></a>
<h2>Functions</h2>

<p>In the above example the function name is <dfn>index()</dfn>.  The "index" function is always loaded by default if the 
<strong>second segment</strong> of the URI is empty.  Another way to show your "Hello World" message would be this:</p>

<code>www.your-site.com/index.php/<var>blog</var>/<samp>index</samp>/</code>

<p><strong>The second segment of the URI determines which function in the controller gets called.</strong></p>

<p>Let's try it.  Add a new function to your controller:</p>


<textarea class="textarea" style="width:100%" cols="50" rows="15">
<?php
class Blog extends Controller {

	function index()
	{
		echo 'Hello World!';
	}

	function comments()
	{
		echo 'Look at this!';
	}
}
?>
</textarea>

<p>Now load the following URL to see the <dfn>comment</dfn> function:</p>

<code>www.your-site.com/index.php/<var>blog</var>/<samp>comments</samp>/</code>

<p>You should see your new message.</p>

<a name="private"></a>
<h2>Private Functions</h2>

<p>In some cases you may not want certain functions accessible publicly.  To make a function private, simply add an
underscore as the name prefix and it will not be served via a URL request. For example, if you were to have a function like this:</p>

<code>
function _utility()<br />
{<br />
&nbsp;&nbsp;// some code<br />
}</code>

<p>Trying to access it via the URL, like this, will not work:</p>

<code>www.your-site.com/index.php/<var>blog</var>/<samp>_utility</samp>/</code>



<a name="default"></a>
<h2>Defining a Default Controller</h2>

<p>Code Igniter can be told to load a default controller when a URI is not present, 
as will be the case when only your site root URL is requested.  To specify a default controller, open 
your <dfn>application/config/routes.php</dfn> file and set this variable:</p>

<code>$route['default_controller'] = '<var>Blog</var>';</code>

<p>Where <var>Blog</var> is the name of the controller class you want used. If you now load your main index.php file without
specifying any URI segments you'll see your Hello World message by default.</p>


<a name="constructors"></a>
<h2>Class Constructors</h2>


<p>If you intend to use a constructor in any of your Controllers, you <strong>MUST</strong> place the following line of code in it:</p>

<code>parent::Controller();</code>

<p>The reason this line is necessary is because your local constructor will be overriding the one in the parent controller class so we need to manually call it.</p>


<p>If you are not familliar with constructors, in PHP 4, a <em>constructor</em> is simply a function that has the exact same name as the class:</p>

<code>
&lt;?php<br />
class <kbd>Blog</kbd> extends Controller {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>Blog()</kbd><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<var>parent::Controller();</var><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
?&gt;</code>

<p>In PHP 5, constructors use the following syntax:</p>

<code>
&lt;?php<br />
class <kbd>Blog</kbd> extends Controller {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>__construct()</kbd><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<var>parent::Controller();</var><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
?&gt;</code>

<p>Constructors are useful if you need to set some default values, or run a default process when your class is instantiated.
Constructors can't return a value, but they can do some default work.</p>

<a name="reserved"></a>
<h2>Reserved Function Names</h2>

<p>Since your controller classes will extend the main application controller you 
must be careful not to name your functions identically to the ones used by that class, otherwise your local functions
will override them.  The following
is a list of reserved names.  Do not name your controller functions any of these:</p>

<ul>
<li>Controller</li>
<li>CI_Base</li>
<li>_ci_autoload</li>
<li>_ci_autoloader</li>
<li>_ci_assign_core</li>
<li>_ci_initialize</li>
<li>_ci_init_database</li>
<li>_ci_init_scaffolding</li>
<li>_ci_is_loaded</li>
<li>_ci_load</li>
<li>_ci_scaffolding</li>
<li>_ci_set_view_path</li>
</ul>

<p><br />If you are running PHP 4 there are some additional reserved names. These ONLY apply if you are running PHP 4.</p>

<ul>
<li>CI_Loader</li>
<li>config</li>
<li>database</li>
<li>file</li>
<li>helper</li>
<li>helpers</li>
<li>language</li>
<li>library</li>
<li>plugin</li>
<li>plugins</li>
<li>scaffolding</li>
<li>script</li>
<li>view</li>
<li>vars</li>
</ul>






<h2>That's it!</h2>

<p>That, in a nutshell, is all there is to know about controllers.</p>



</div>
<!-- END CONTENT -->


<div id="footer">
<p>
Previous Topic:&nbsp;&nbsp;<a href="urls.html">Code Igniter URLs</a>
&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
Next Topic:&nbsp;&nbsp;<a href="views.html">Views</a>
<p>

<p><a href="http://www.codeigniter.com">Code Igniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 &nbsp;&middot;&nbsp; <a href="http://www.pmachine.com">pMachine, Inc.</a></p>
</div>

</body>
</html>