laravel 多站点实现怎么实现密保问题

Laravel身为最优雅的框架,很多学习PHP的小伙伴造就对Laravel垂涎欲滴。今天就来实现你的愿望,让我们一起从零开始,利用Laravel实现Web应用最常见的注册和登录功能!所有的课程源码已放在Github上:laravel-start. Race Start !
Bootstrap 3.3
Laravel就是我们关心的核心部分,Bootstrap用来快速设置一些前端的CSS样式。
composer create-project laravel/laravel laravel
cd laravel/public/packages
bower install bootstrap
chmod -R 755 app/storage
'default' =& 'mysql',
'connections' =& array(
&&& 'mysql' =& array(
&&&&&&& 'driver'&&& =& 'mysql',
&&&&&&& 'host'&&&&& =& '127.0.0.1',
&&&&&&& 'database'& =& 'laravel-start',
&&&&&&& 'username'& =& 'root',
&&&&&&& 'password'& =& '',
&&&&&&& 'charset'&& =& 'utf8',
&&&&&&& 'collation' =& 'utf8_unicode_ci',
&&&&&&& 'prefix'&&& =& '',
php artisan migrate:make create-users-table
以上命令会创建一个migrate文件(文件位于app/database/migrations目录下),这个文件的名字就是create-users-table,然后我们可以通过编辑刚刚生成的migrate文件来创建Users表。
public function up() {
&&&&&& Schema::create('users', function($table){
&&&&&&& $table-&increments('id');
&&&&&&& $table-&string('username', 20);
&&&&&&& $table-&string('email', 100)-&unique();
&&&&&&& $table-&string('password', 64);
&&&&&&& $table-&string('remember_token',62)-&default('default');
&&&&&&& $table-&timestamps();
&&&&&&& });
public function down()
&&& Schema::drop('users');
php artisan migrate
4.启动服务来试试
php artisan serve
OK,先给自己三十秒的掌声时间,如果你顺利地走到了这一步的话。恭喜你,你已经进入Laravel的大门,更多惊喜我们再一一道来.....
&!DOCTYPE html&
&html lang="en"&
&&& &head&
&&&&&&& &meta charset="utf-8"&
&&&&&&& &meta name="viewport" content="width=device-width, initial-scale=1.0"&
&&&&&&& &title&发现Laravel 4之美&/title&
&&& &/head&
&&& &body&
&&& &/body&
感觉main.blade.php的名字很奇怪?不用担心,Laravel的视图文件命名遵循filename.blade.php的规则,因为Laravel是用Blade这个模板引擎解析的,你不用深究,就照着上面的名字规则来命名视图文件就OK
&!DOCTYPE html&
&html lang="en"&
&&& &head&
&&&&&&& &meta charset="utf-8"&
&&&&&&& &meta name="viewport" content="width=device-width, initial-scale=1.0"&
&&&&&&& &title&发现Laravel 4之美&/title&
&&&&&& {{HTML::style('packages/bower_components/bootstrap/dist/css/bootstrap.min.css') }}
&&&&&&& {{ HTML::style('css/main.css')}}
&&& &/head&
&&& &body&
&&& &/body&
添加导航栏。在main.blade.php文件的&body&标签中加上以下代码:
&&&&&&& &div class="navbar navbar-inverse navbar-fixed-top"&
&&&&&&&&&&& &div class="container"&
&&&&&&&&&&&&&&& &div class="navbar-header"&
&&&&&&&&&&&&&&&&&&& &a class="navbar-brand hidden-sm" href="/"&Laravel新手上路&/a&
&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&& &ul class="nav navbar-nav navbar-right hidden-sm"&
&&&&&&&&&&&&&&&&&&& &li&{{ HTML::link('users/register', '注册') }}&/li&
&&&&&&&&&&&&&&&&&&& &li&{{ HTML::link('users/login', '登陆') }}&/li&
&&&&&&&&&&&&&&& &/ul&
&&&&&&&&&&& &/div&
&&&&&&& &/div&
到这里基本的功用部分就结束了,但是我们的追求从不会这么low,所以为了更好地与用户交互,我们希望在用户进行某个操作之后给出一些反馈,比如注册成功的时候说:少年,你已成功注册本站,恭喜恭喜。等,于是乎,我们再为main.blade.php添加一点点代码:
&&&&&&& &div class="container"&
&&&&&&&&&&& @if(Session::has('message'))
&&&&&&&&&&& &p class="alert"&{{ Session::get('message') }}&/p&
&&&&&&&&&&& @endif
&&&&&&& &/div&
在blade引擎的视图中if 的使用格式是
@if(conditions)
&&&&&&& &div class="container"&
&&&&&&& @if(Session::has('message'))
&&&&&&& &p class="alert"&{{ Session::get('message') }}&/p&
&&&&&&& @endif
&&&&&&& {{ $content }}
&&&&&&& &/div&
&&&& padding-top: 60
.form-signup, .form-signin {
&&&& margin: 0
终于要进入正题
6.创建UsersController
class UsersController extends BaseController {
class UsersController extends BaseController {
&&& protected $layout = "layouts.main";
7.实现注册
public function getRegister() {
&&& $this-&layout-&content = View::make('users.register');
自然而然的,我们现在要做的就是创建users/register.blade.php这个文件了,来到views文件夹 ,创建一个新的文件夹users/,再在里面新建register.blade.php,写上下面这些内容:
{{ Form::open(array('url'=&'users/create', 'class'=&'form-signup')) }}
&div class="container"&
&&& &div class="row"&
&&&&&&& &div class="col-md-4 col-md-offset-4"&
&&&&&&&&&&& &div class="panel panel-default"&
&&&&&&&&&&&&&&& &div class="panel-heading"&
&&&&&&&&&&&&&&&&&&& &h3 class="panel-title"&欢迎注册&/h3&
&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&& &div class="panel-body"&
&&&&&&&&&&&&&&& {{ Form::open(array('url'=&'users/create', 'class'=&'form-signup')) }}
&&&&&&&&&&&&&&&&&&& &ul&
&&&&&&&&&&&&&&&&&&&&&&& @foreach($errors-&all() as $error)
&&&&&&&&&&&&&&&&&&&&&&&&&&& &li&{{ $error }}&/li&
&&&&&&&&&&&&&&&&&&&&&&& @endforeach
&&&&&&&&&&&&&&&&&&& &/ul&
&&&&&&&&&&&&&&&&&&& &fieldset&
&&&&&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&&&&&&&&& {{ Form::text('username', null, array('class'=&'form-control', 'placeholder'=&'用户名')) }}
&&&&&&&&&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&&&&& {{ Form::text('email', null, array('class'=&'form-control', 'placeholder'=&'邮箱')) }}
&&&&&&&&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&&&&& {{ Form::text('password', array('class'=&'form-control', 'placeholder'=&'密码')) }}
&&&&&&&&&&&&&&&&&&&&&&& &/div&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&&&&& {{ Form::text('password_confirmation', array('class'=&'form-control', 'placeholder'=&'确认密码')) }}
&&&&&&&&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&&&&&&&&&& {{ Form::submit('马上注册',array('class'=&'btn btn-large btn-success btn-block')) }}
&&&&&&&&&&&&&&&&&&& &/fieldset&
&&&&&&&&&&&&&&& {{ Form::close() }}
&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&& &/div&
&&&&&&& &/div&
&&& &/div&
@foreach($errors-&all() as $error)
&li&{{ $error }}&/li&
@endforeach
再下来需要说明的就是几个Form输入框的创建方式了:
{{ Form::text() }} //创建type=text 输入框
{{ Form::password() }}//创建type=password 输入框
{{ Form::submit() }}//创建type=submit 输入框
最后别忘我们要用{{ Form::close() }}来结束表单。
Route::get('/', function()
&&& return View::make('hello');
比如我们想访问UsersController的getRegister(),我们可以在地址栏输入的格式是:
见证奇迹吧。是不是很爽!哈哈哈。
public function postCreate() {
说明上面的细节之后,我们还要做一件非常重要的事:表单验证。即是先在用户提交表单的时候验证其输入数据的合法性,以便于我们在数据库中能存储正确的数据,这里就联系到前面的:
&&& @foreach($errors-&all() as $error)
&&& &li&{{ $error }}&/li&
&&& @endforeach
public static $rules = array(
&&& 'username'=&'required|alpha|min:2',
&&& 'email'=&'required|email|unique:users',
&&& 'password'=&'required|alpha_num|between:6,12|confirmed',
&&& 'password_confirmation'=&'required|alpha_num|between:6,12'
email:邮件格式
unique:users:唯一,参考users表的设置
alpha_num:字母或数字
between:长度位于哪两个数字之间
confirmed:需要确认的
我们来一步一步地理清思路:首先判断用户提交的数据是否通过了验证
public function postCreate() {
&&& $validator = Validator::make(Input::all(), User::$rules);
&&&&&&& // 验证通过就存储用户数据
&&& } else {
&&&&&&& // 验证没通过就显示错误提示信息&&&
接着我们再来完善我们的postCreate()代码:
if ($validator-&passes()) {
&&& $user = new U//实例化User对象
&&& $user-&username = Input::get('username');
&&& $user-&email = Input::get('email');
&&& $user-&password = Hash::make(Input::get('password'));
&&& $user-&save();
&&& // 验证没通过就显示错误提示信息&&&&&
Redirect::to()的参数规则是:controller/action。前面是控制起,后面就是具体的方法名。
上面是验证通过的情况,现在我们看看验证没有通过的情况:
if ($validator-&passes()) {
&&& $user = new U//实例化User对象
&&& $user-&username = Input::get('username');
&&& $user-&email = Input::get('email');
&&& $user-&password = Hash::make(Input::get('password'));
&&& $user-&save();
&&& return Redirect::to('users/register')-&with('message', '请您正确填写下列数据')-&withErrors($validator)-&withInput();&&&
再进一步,我们在开发的时候永远不要忘记一件很重要的事:安全。那么在这里我们需要POST提交表单,我们就要保证它不会被CSRF攻击,解决这个问题我们需要在UsersController里添加下面的代码:
public function __construct() {
&&& $this-&beforeFilter('csrf', array('on'=&'post'));
&div class="container"&
&div class="row"&
&&& &div class="col-md-4 col-md-offset-4"&
&&&&&&& &div class="panel panel-default"&
&&&&&&&&&&& &div class="panel-heading"&
&&&&&&&&&&&&&&& &h3 class="panel-title"&欢迎登录&/h3&
&&&&&&&&&&& &/div&
&&&&&&&&&&& &div class="panel-body"&
&&&&&&&&&&&&&&& {{ Form::open(array('url'=&'users/signin', 'class'=&'form-signin')) }}
&&&&&&&&&&&&&&& &fieldset&
&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&& {{ Form::text('email', null, array('class'=&'form-control', 'placeholder'=&'邮箱')) }}
&&&&&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&&&&&& &div class="form-group"&
&&&&&&&&&&&&&&&&&&&& {{ Form::password('password', array('class'=&'form-control', 'placeholder'=&'密码')) }}
&&&&&&&&&&&&&&&&&&& &/div&
&&&&&&&&&&&&&&&&&&&& {{ Form::submit('马上登录',array('class'=&'btn btn-large btn-success btn-block')) }}
public function getLogin() {
&&& $this-&layout-&content = View::make('users.login');
这时候我们就可以注册新用户了,如果你的浏览器还保留在http://localhost:8000/users/register你可以试着输入你的用户名,邮箱,密码来注册一个,当然你也可以故意输错,看看会有什么信息返回给你。enjoy!
'url'=&'users/signin',所以接下来的一步就是为UsersController补充postSignin()方法:
&&& public function postSignin() {
&&& if (Auth::attempt(array('email'=&Input::get('email'), 'password'=&Input::get('password')))) {
&&&&&&& return Redirect::to('users/dashboard')-&with('message', '欢迎登录');
&&& } else {
&&&&&&& return Redirect::to('users/login')-&with('message', '用户名或密码错误')-&withInput();
既然是重定向到users/dashboard那么我们就来写写getDashboard()方法,到这里可能不用我说你都知道应该在UsersController添加下面的代码:
public function getDashboard() {
&&& $this-&layout-&content = View::make('users.dashboard');
&&& public function __construct() {
&&& $this-&beforeFilter('csrf', array('on'=&'post'));
&&& $this-&beforeFilter('auth', array('only'=&array('getDashboard')));
&div class="welcome"&
&&& &center&
&&& &a href="" target="_blank"&
&img src="https://wt-prj./766e22da1e8c467a8af35d90c0dd9d-c0e4-42ea-86b8-ddd63d07faa6.png" &
&&& &/center&
&&& &center&&h1&欢迎来到管理面板!&/h1&&/center&
Route::filter('auth', function()
&&& if (Auth::guest()) return Redirect::guest('users/login');
&&&&&&&&& &ul class="nav navbar-nav navbar-right hidden-sm"&
&&&&&&&&& @if(!Auth::check())
&&&&&&&&&&&&&& &li&{{ HTML::link('users/register', '注册') }}&/li&
&&&&&&&&&&&&&& &li&{{ HTML::link('users/login', '登陆') }}&/li&
public function getLogout() {
&&&&&&& if(Auth::check())
&&&&&&&&&&& Auth::logout();
&&& return Redirect::to('users/login')-&with('message','你现在已经退出登录了!');
10.最后的最后
这个小教程写到这里就基本结束了,希望各位玩的愉快。最后多说一句:编程是我们最容易学习的超能力,永远要相信自己可以改变世界!
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)laravel的模块化是如何实现的 - 给个理由先 - 博客园
laravel的模块化是如何实现的
在laravel提供的官方文档上,有一个这样的名词 服务提供者,文档中介绍了它在laravel框架中的角色,以及如何使用它,但却没有讲明服务提供者的本质--它是为了解决什么问题而存在的? 不解决这一点,对于它的理解,则只会停留在表面.服务提供者是laravel实现模块化设计的手法.
为什么要进行模块化设计这里就不说的,可以参考下这些: ,
为了实现模块化,必然要将一段程序组合起来,完成特定的事,从而形成模块.在laravel中, 一个模块都表现为一个Service.应用程序主体与组件(模块)之间必然要通过某种方式连接起来,才能使组件被主体所调用.在laravel中一个Service会被它的 Service Prorider 注入到ioc中,这样组件就与主体联系了起来, 具体的表现形式则是组件被主体所用,主体使用组件完成组件所擅长的事. 源代码是最好的文档,接下来,我们就看看&文档&是怎么说的.
laravel的启动过程
我们从启动开始,详细地分析在整个应用程序的生命周期中,Service Provider到底是什么?通过阅读源码方式来了解Serivce Provider在laravel中到底做了什么.
laravle的启动过程做了很多事,这里就不一一叙述了,主要说明有关Sevice Provider的部分.laravel有两个入口分别处理不同的请求1:public/index.php(http) 2.php arisan(cli).虽然入口有两种但它们的启动过程却相差无几(具体可以再详细了解这两种方式).
bootstrap/app.php则是它的主要启动文件, 在\Illuminate\Foundation\Application::__construct中就可以看到应用主体的启动做了什么:
绑定Appliation和Container
注册最基础的Service Provider
注册该应用程序的路径
上面启动过程的代码较简单,代码不分析了.就说一说为什么要做这几步,以及这几步对lavarel有什么作用.
laravel中以ioc为基础来构建应用程序的,所以,把这个最基础的Applicatoin放入容器中,供需要时可以随时从容器中提取使用(container 与 Application的关系看看代码就清晰了).
一个应用的合理运行必然离不开一些最基本的功能点,就像人类一样,虽然最重要的是大脑,但同样也不能没有血管,心脏.所以在laravel中也同样存在一些不可或缺的service provider, 比如事件和路由器.\Illuminate\Events\EventServiceProvider则把构建观察者的类注入到了ioc中,同时,在laravel源代码中大量使用了观察者模式来处理问题,\Illuminate\Routing\RoutingServiceProvider则把路由相关的服务注入到了主体中,因为一个http请求最不可或缺的当然是路由;
注册别名,则是为了调用ioc中的类时更方便,还有一点要注意是的,可以为一个类注册多个别名,为什么呢,其实这多个别名是存在关系的,它们大多是父类与子类的关系,就像Appliation和C
注册应用的路径则把一样常用的,跟应用有关的路径放到ioc中方便取用.启动的第一步到这就结束了.
http应用请求的启动
紧接着,又注册了三个类到ioc中,分别是http处理核心类,cli处理核心类,和异常处理.在这里注册了两种不同请亲的处理类,所以两个请求入口所做的事情都差不多了.接下来以http请求为例来,继续看下去.public/index.php:50则初始化了\App\Http\Kernel::__construct,也就初始化了中间件.接着public/index.php:52则调用了\Illuminate\Foundation\Http\Kernel::handle来处理请求,进一步看下去,也就是\Illuminate\Foundation\Http\Kernel::bootstrap中通过Application::bootstrapWith完成http请求环境的初始化,具体则是:
标记Application为已经引导启动状态
依次启动\Illuminate\Foundation\Http\Kernel::$bootstrappers中的项目
1.Illuminate\Foundation\Bootstrap\DetectEnvironment:设置应用程序的环境
2.Illuminate\Foundation\Bootstrap\LoadConfiguration:载入应用程序的配置文件
3.Illuminate\Foundation\Bootstrap\ConfigureLogging:绑定日志处理类
4.Illuminate\Foundation\Bootstrap\HandleExceptions:异常处理
5.Illuminate\Foundation\Bootstrap\RegisterFacades:Facade模式的应用
6.Illuminate\Foundation\Bootstrap\RegisterProviders:注册Service Provider
7.Illuminate\Foundation\Bootstrap\BootProviders:标记启动完成 , 执行Srvice Provider的register方法,完成注入
然后,在vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:129就进入到了路由器,进而进入对应Controller进行处理,最后完成处理,请求结束.这一部分就不说了.
cli请求的启动
这一部分略,步骤与http类似
从它的请求生命周期可以看出以下几点
1:Service Provider在启动阶段就已经与注入了IOC
2:分为了两种,一种是由系统控制,而另一种则是可由用户控制.第一种是构成应用程序的基础,不能缺少;第二种则将控制权交给用户,由用户掌控应用的运行,比如加载第三方composer包,或自定义的Service等等.
此时,模块化已经初现雏形.在Controller中,可以调用或组合不同的Service, 来完成特定的逻辑,因为它已经在IOC中了;我们可以控制不同的Service或增或减,自定义这个应用程序的功能,成为新的系统.接下来,再看看Service Provider做了什么,使模块化在laravel中更完善.
注册Service Provider
在注册基础的Service Provider中,不难发现,完成注册过程的是\Illuminate\Foundation\Application::register,这个方法比较简单,一是执行了ServierProceder::register方法,通过这个接口将Service注册动IOC中;二是在系统已经启动的情况下,执行ServierProceder::boot方法,作用在讲的很清楚.
在注册用户自定义(config/app.php:124)时,\Illuminate\Foundation\Application::registerConfiguredProviders则完成了注册过程,其处理核心\Illuminate\Foundation\ProviderRepository::load主要做了以下几步
1:解析所有的Service Provider, 通过它的defer属性来决定是否延迟加载
2:将解析的结果,也就是一个Service Provider的数组,缓存为文件,下次直接载入解析后的缓存文件
3:只加载defer属性不为ture的Service Provider, 并注册
4:将延迟加载的放支容器中(APP::$deferredServices),在需要的时候再加载
从注册过程可以看出,我们可以定义Service Provider加载的时间,并不仅仅在启动这过程中加载,而是在需要的时候再加载.一种是通过\Illuminate\Foundation\Application::make;还有一种方式延迟加载则是在when方法中通过事件注册到某项事件上去,这一点则要好好看看\Illuminate\Foundation\ProviderRepository类了.
理清它的注册过程后,我们再仔细看看Service Provider的抽象类,它作为基类,提供了Servicer Provider能做的所有事情.了解它能更好的理解Service Provider.这个类并不复杂,唯一一个不是很清晰的只有commands方法:它将命令注册到了\Illuminate\Console\Events\ArtisanStarting事件中,为什么这样做? 在cli时,启动时,会有该事件的执行,从而通过Service Provider把命令注入到了IOC中,这样执行命令就行云流水了.
到这里,用Service Provider来实现模块化的功能得到了强化,既可以延迟加载,还可以注册命令.接下来,通过一些例子,看看它具体做了什么.
Service Provider的使用
Service Provider有很多,我们随便挑两个来看看
QueueServiceProvider
\Illuminate\Queue\QueueServiceProvider并非系统控制级别,看源代码,可以发现,里面有很多注册方法,注册了很多有关队列的类到IOC中,同时也注册了很多命令.在provides方法中,它返回的就是一个所有在这个Service Provider出现的的各个类,它是做什么的?其实我们可以发现,这个Service Provider是延迟加载的,所以这个Service所提供的各种服务并不会出现在服务中,上面我们说过,在需要的时候再加载.这一功能就是由provides中的返回值来决定的,当调用IOC中,那些延迟加载服务中出现的那些类时,再加载这些延迟的服务,从而可以获得延迟服务所提供的服务.
EventServiceProvider
\Illuminate\Events\EventServiceProvider是应用程序的核心,它又做了什么呢?
它也是向IOC中注册了事件处理的类,同时为这个类设置了队列解析的类.
HashServiceProvider
\Illuminate\Hashing\HashServiceProvider也向IOC注册一hash处理的类,并且是延迟加载的.
查看Service Provicer的使用后,我们可以发现,它们都做了同们的事,就是把相应的服务注入到ICO中,以供使用,从而构成完成的系统.所以,现在我们就可以明白Service Provider是lararel完成模块化设计的方法,只不过融入了一些laravel自己的特点.

我要回帖

更多关于 laravel 实现文件下载 的文章

 

随机推荐