[Laravel4] 实战之短网址

数据库表结构

CREATE TABLE `u_links` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL DEFAULT '',
  `hash` varchar(32) NOT NULL,
  `hits` int(10) unsigned NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

虽然理论上url可以很长,但是这里约束一下255

目录结构

这里仅列出需要动到的目录和文件

app/config             配置文件目录
app/controllers        控制器
app/models             模型
app/views              视图
app/lib                自己建的,方便放一些公用库
app/routes.php         路由

代码

对于短网址的算法不再说明,网上很多,这里使用base62来处理

配置文件

app/config/app.php

  1. 打开debug
  2. 修改时区为'Asia/Shanghai'
  3. 修改key,可使用artisan生成php artisan key:generate

app/config/database.php

  1. 修改mysql的配置

定路由

// 显示首页
Route::get('/', 'HomeController@index');
// 网址转向
Route::get('{shorten}', 'HomeController@redirect')
	->where('shorten', '[0-9A-z]+');
// 网址点击统计
Route::get('{shorten}!', 'HomeController@show')
	->where('shorten', '[0-9A-z]+');

控制器

由于HomeController本身就存在,所以我们不需要生成或新建。 这里我们会用到base62的库,附件中会给出QQ20130519-2.png

贴代码:

public function index() {
	$shorten = '';
	$url = Input::get('url');
	if (!is_null($url)) {
		$validator = Validator::make(compact('url'), [
				'url' => 'required|max:255|url',
			]);
		if ($validator->fails())
			return Redirect::to('/')->withInput()->withErrors($validator->errors());
		$hash = md5($url);
		$link = Link::whereHash($hash)->first();
		if (!$link)
			$link = Link::create(compact('url', 'hash'));
		$shorten = \Lib\Base62::encode($link->id);
	}
	return View::make('home.index')
				->with(compact('url', 'shorten'));
}
public function redirect($shorten) {
	$id = \Lib\Base62::decode($shorten);
	$link = Link::find($id);
	if ($link) {
		$link->increment('hits');
		return Redirect::to($link->url, 301);
	}
	App::abort(404);
}
public function show($shorten) {
	$id = \Lib\Base62::decode($shorten);
	$link = Link::find($id);
	if ($link) {
		return View::make('home.show')
					->with($link->toArray());
	}
	App::abort(404);
}

Base62.zip

标签: none

已有 2 条评论

  1. Tod Tod

    这模板做的太给力了

  2. 我是来坐沙发的!

添加新评论