Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

学习Laravel 记录 #18

Open
lovecn opened this issue Mar 28, 2015 · 37 comments
Open

学习Laravel 记录 #18

lovecn opened this issue Mar 28, 2015 · 37 comments

Comments

@lovecn
Copy link
Owner

lovecn commented Mar 28, 2015

1.增加辅助函数
Within your app/Http directory, create a helpers.php file and add your functions.
Within composer.json, in the autoload block, add "files": ["app/Http/helpers.php"].

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

Run composer dump-autoload 调用的时候用全局命名空间 \help();
或者在bootstarp/autoload.php增加require DIR.'/../app/libraries/function/helper.php';
创建文件app\Providers\HelperServiceProvider.php

public function register()
    {
        foreach (glob(app_path().'/libraries/function/*.php') as $filename){
            require_once($filename);
        }
    }

app.php文件数组添加'App\Providers\HelperServiceProvider',
直接$obj = new \App\libraries\Myclass;;$obj ->my();
新建立文件app\Services\Sms.php ,app.php文件aliases数组添加'Sms' => 'App\Services\Sms',
使用use Sms; $sms = new Sms;$sms ->send('发短信');
2.$url = action('Admin\BlogController@create');
3.登录用户信息数组 Auth::user()->toArray();
4.laravel debug https://github.com/barryvdh/laravel-debugbar
5.api接口中去除csrf 在App\Http\Kernel将全局中间件$middleware数组里的'App\Http\Middleware\VerifyCsrfToken'移到$routeMiddleware数组里,让它成为一个可选项 protected $namespace = 'App\Http\Controllers';
6.update方法会自动去掉不可填充的属性,也就是说只会更新你数据库里面有的且在model里面可填充的字段
7.$data = Input::all();
注意:这里获取到的数据包含 GET 和 POST 提交的所有数据,并且 GET 的优先级更高。就是同名的get覆盖post
8.如果要启用日志use DB;DB::connection()->enableQueryLog(); $queries = DB::getQueryLog();
9.获取uri片段 $segment = $request->segment(4);
10.为Laravel的artisan指令增加bash脚本

#!/bin/bash

if [ -f "./artisan" ]; then
        php artisan "$@"
else

        if [ "$1" == "create" ]; then

                if [ ! `which git` ]; then
                    echo "For this installer to work you'll need to install Git."
                    echo '        http://gitref.org/'
                fi

                git clone --recursive git://github.com/laravel/laravel.git "./$2"
                cd "$2"; chmod -R 0777 storage/

        else
                echo 'This is not a valid laravel installation so artisan is a bit lost.'
                echo '        http://laravel.com/docs/install#installation'

        fi
fi

保存为/usr/bin/artisan 并执行 chmod +x /usr/bin/artisan 赋予执行权限
然后,你就可以进入你的项目文件夹,只需输入bash命令 "artisan create myapp",就会自动从github上clone一份最新的Laravel框架,并会自动设置storage文件夹的权限。之后,你可以直接输入“ artisan xxxx xxx”的指令了,而不用输入'php artisan xxxx xxxx'
11.URL生成
Route::get('articles',['uses'=>'ArticlesController@index','as'=>'articles.index']);
链接
URL::route('articles.index')
URL::action('ArticlesController@index')
Route::controller('users','UsersController');
通过 Route::controller() 最终结果类似于:

Route::get('users',['uses'=>'UsersController@getIndex']);
Route::get('users/edit',['uses'=>'UsersController@getEdit']);
Route::post('users/edit',['uses'=>'UsersController@postEdit']);
如果字段很多,但仅有几个需要批量赋值保护,可以设置 guarded 属性。

如果要彻底关闭批量赋值保护,使用 Model::unguard() 就好了(强烈不推荐!!!)

class Question extends Model {

    //定义可以批量赋值的黑名单,定义白名单是protected $fillable
    protected $guarded = ['id', 'created_at', 'updated_at'];

  public function belongsToDiffiuclty()
  {
    return $this->belongsTo('Difficulty', 'difficulty_id', 'id');
  }

  public function scopeDifficultyEasy($query) {
      return $query->where('difficulty_id', 1);
  }

  public function scopeDifficultyNormal($query) {
      return $query->where('difficulty_id', 2);
  }

  public function scopeDifficultyHard($query) {
      return $query->where('difficulty_id', 3);
  }

}
public function store(Request $request)
    {
        $this->validate($request,[
//          'title'=>'required|unique:questions|max:255',
            'title'=>'required|max:255',
            'body'=>'required',
        ]);
        $question = new Question;
        $question->title          = Input::get('title');
        $question->body           = Input::get('body');
        $question->difficulty_id  = Input::get('difficulty');
        $question->major_id       = Input::get('major');
        $question->user_id        = 1;//Auth::user()->id;
        if($question->save()){
            return Redirect::to('questions');
        }else{
            return Redirect::back()->withInput()->withErrors('保存失败!');
        }
    }

Call to undefined method Redis::connection()
如果你用 PECL 安装了 Redis PHP extension,则需要重命名 config/app.php 里的 Redis 别名。
在php.ini中将extension = ''redis.so'注释掉,于是就解决了
其实就是关键字重复了,laravel使用的是predis,php extension 使用的都是phpredis,两个库的redis对象关键字都是Redis,只需改变laravel中的Redis关键字即可
'Redis' => 'Illuminate\Support\Facades\Redis'
改为
'RedisFacade' => 'Illuminate\Support\Facades\Redis' use RedisFacade; $redis=RedisFacade::connection(); $redis->set('laravel','golaravel'); echo $redis->get('laravel');
验证唯一:
'email' => ['required','email','unique:members,email,1'],

注意最后的 1 ,这个是members表的id字段,这里就是id=1的记录不作验证,等于 "where email='EMAIL' and id != 1"
csrf_token();产生:通过 Illuminate\Session\Store 类的 getToken 方法获取随机产生长度为40的字符串,而这40个字符是由 Illuminate\Support\Str 类的 random 方法产生
Illuminate\Contracts 目录下为接口定义
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\Registrar;
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;

$this->middleware('guest', ['except' => 'getLogout']);

}
Laravel会自动在容器中搜索实现了接口Illuminate\Contracts\Auth\Registrar的类或对象,有的话就取出来作为实际参数传到构造函数里
实现了接口Illuminate\Contracts\Auth\Guard的类在\Illuminate\Auth\Guard.php

控制器(controller)就像是一个老板,只会指挥别人,自己从来不干活。当然接活儿(http请求)是他的事。所以尽量不要把业务逻辑写在controller里,controller里就写指挥的命令

在隐式路由中,如果你的方法名有多个单词组成,在路由中会自动用“-”链接起来function getadminprofile(){}
在路由中就会转换成 users/admin-profile
service provider 里面的注册方法register()先运行,boot()后运行,register() 就是注册Ioc容器的地方,只能写注册相关的内容
验证汉化,修改resources\lang\en\validation.php
'custom' => [
'id' => [
'required' => '学号不能为空',
"digits" => "学号必须是 10 位数字",
"unique" => "该同学已经存在",
],

// AND
$results = SomeModel::where('location', $location)->where('blood_group', $bloodGroup)->get();

// OR
$results = SomeModel::where('location', $location)->orWhere('blood_group', $bloodGroup)->get();

// SomeModel class
public function scopeSearchLocation($query, $location)
{
if ($location) $query->where('location', $location);
}

public function scopeSearchBloodGroup($query, $bloodGroup)
{
if ($location) $query->where('location', $bloodGroup);
}

// then
SomeModel::searchBloodGroup($bloodGroup)->searchLocation($location)->get();

composer config -g -e 修改源
{
"config": {},
"repositories": [
{"type": "composer", "url": "http://comproxy.cn/repo/packagist"},
{"packagist": false}
]
}

LARAVEL ROUTE 重定向的一个小坑
Route::group(array('prefix'=>'admin','before'=>'adminauth'),function(){
// 管理员登录
Route::get('/',function(){
return Redirect::to('admin/login');
});
Route::get('login','UserController@adminLogin');
}
public目录下正好有个admin目录
解决方案:

1.不要把public目录下已有的目录名做为路由地址 https://sosonemo.me/laravel-route-pitfall.html
route:cache
如果路由配置有直接写回调:如
Route::get('setting/flush',function(){
return 'sss';
});
是不能用缓存的!

变量引用
BASE_DIR=/var/webroot/project-root
CACHE_DIR=$BASE_DIR/cache
LOG_DIR=$BASE_DIR/logs.
指定必须定义的变量
Dotenv::required(['DB_HOST', 'DB_NAME', 'DB_USERNAME', 'DB_PASSWORD']);

@yield 是不可扩展的,如果你要定义的部分没有默认内容让子模板扩展的,那么用 @yield($name, $default) 的形式会比较方便

@section 则既可以被替代,又可以被扩展

{{-- layout.master --}}
@yield('title','默认标题')

@section('content')
默认的内容
@show

{{-- home.index --}}
@extends('layout.master')

@section('title')
@parent
新的标题
@Stop

@section('content')
@parent
扩展的内容
@Stop
由于 @yield 不能被扩展,所以即使加上了 @parent 也不起作用,输出的内容只有“新的标题”,替换了“默认的标题”。
// 函数的签名:
public function controller($uri, $controller, $names = array())

// 不命名一般使用:
Route::controller('admin', 'AdminController');

// 需要对其中的部分方法命名的话:
Route::controller('admin', 'AdminController', array(
'getIndex' => 'admin.index',
'getLogin' => 'admin.login',
'postLogin' => 'admin.login'
));

http://www.maatwebsite.nl/laravel-excel/docs/import 使用这个库读取文件的时候,如果要读取第一行,而且为汉字,需要设置config/excel.php 'to_ascii' => false,
Excel::load('file.xls', function($reader) {

// $reader->noHeading();
    var_dump($reader->toArray());//第一行的内容为数组的key
        // echo $reader->getTitle();
    // var_dump($reader->take(10));
    $reader->each(function($sheet) {
    // var_dump($sheet);
        // Loop through all rows
        $sheet->each(function($row) {
            // var_dump($row);
        })
    });
}, 'utf-8');

创建数据库时 int 类型设置默认值的问题:int类型被自动加上自增跟主键属性,$table->tinyInteger('sort',3);
public function tinyInteger($column, $autoIncrement = false, $unsigned = false)
$table->tinyInteger('level',1);把长度设置去掉就好了,变成$table->tinyInteger('level');

php artisan serve 访问localhost:8000
修改route.php
DB::listen(function($sql, $bindings, $time)
{
file_put_contents('php://stderr', "[SQL] {$sql} in {$time} s\n" .
" bindinds: ".json_encode($bindings)."\n");
});

命令行就可以看到SQL语句

或者修改config/database.php 增加'log'=>true
然后修改route.php
if (Config::get('database.log', false))
{
Event::listen('illuminate.query', function($query, $bindings, $time, $name)
{
$data = compact('bindings', 'time', 'name');

    // Format binding data for sql insertion
    foreach ($bindings as $i => $binding)
    {
        if ($binding instanceof \DateTime)
        {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        }
        else if (is_string($binding))
        {
            $bindings[$i] = "'$binding'";
        }
    }

    // Insert bindings into query
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);

    Log::info($query, $data);
});

}
SQL日志就记录在 app/storage/log

DB::table('users')->toSql() would return: select * from users

Event::listen('illuminate.query', function($query, $params, $time, $conn)
{
dd(array($query, $params, $time, $conn));
});

DB::table('users')->get();
This will print out something like:

array(4) {
[0]=>
string(21) "select * from "users""
[1]=>
array(0) {
}
[2]=>
string(4) "0.94"
[3]=>
string(6) "sqlite"
}

<script type="text/javascript">     var queries = {{ json_encode(DB::getQueryLog()) }};     console.log('/****************************** Database Queries ******************************/');     console.log(' ');     $.each(queries, function(id, query) {         console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);     });     console.log(' ');     console.log('/****************************** End Queries ***********************************/'); </script>

多数据库查询 编辑config/database.php

Our secondary database connection

'mysql2' => array(

    'driver'    => 'mysql',

    'host'      => 'host2',

    'database'  => 'database2',

    'username'  => 'user2',

    'password'  => 'pass2'

    'charset'   => 'utf8',

    'collation' => 'utf8_unicode_ci',

    'prefix'    => '',

),

在查询的时候,指明你前面声明的连接名称
$users = DB::connection('mysql2')->select(...);
在eloquent的model里面指明你要使用的连接

class SomeModel extends Eloquent {

protected $connection = 'mysql2';

//事务
DB::beginTransaction();
DB::rollback();
DB::commit();

事务
DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));
DB::table('posts')->delete();
});
$value = Request::header('Content-Type'); //获取请求头里的Content-Type信息
$url = Request::url();//获取请求URL
$value = Request::server('PATH_INFO');//获取 $_SERVER 数组里指定的值

print_r(\DB::getQueryLog());//修改Illuminate\Database\Connection的$loggingQueries = true

在指定路由关闭CSRF

修改app/Http/Middleware/VerifyCsrfToken.php

openRoutes as $route){ if ($request->is($route)){ return $next($request); } return parent::handle($request, $next); } ``` } } $cookie = Cookie::make('name', 'value', 60); $response = Response::make('Hello World'); return $response->withCookie($cookie); or $cookie = Cookie::make('name', 'value', 60); $view = View::make('categories.list'); return Response::make($view)->withCookie($cookie); or $cookie = Cookie::make('name', 'value', 60); return Redirect::route('home')->withCookie($cookie); Cookie::queue('cookieName', 'cookieValue', $lifeTimeInMinutes); return Redirect::route('home')->withCookie($cookie); $cookie_values = array( 'name' => Input::get('name'), 'id' => Auth::user()->id, 'login_success' => 1); ``` if(Request::ajax()) { $cookie = Cookie::make('blog', $cookie_values, 1000); $response = Response::json($cookie_values); $response->headers->setCookie($cookie); return $response; } ``` Use echo get_class(Facade::getFacadeRoot()); to determine which class it is. Working example: echo get_class(Cookie::getFacadeRoot());.Illuminate\Cookie\CookieJar // \Cookie::queue('test', null , -1); // 销毁 config/app.php 'Excel' => 'Maatwebsite\Excel\Facades\Excel' 'Maatwebsite\Excel\ExcelServiceProvider', Maatwebsite\Excel\Facades\Excel.php: protected static function getFacadeAccessor() { return 'excel'; } Maatwebsite\Excel\ExcelServiceProvider.php public function register() { $this->app[excel] = $this->app->share(function ($app) { return new excel;//同一个命名空间的类excel.php }); } $orders = Order::with('customer')->get()->paginate(5); //Remove the get() when you use paginate() $orders = Order::with('customer')->paginate(15); Laravel 依赖注入原理 https://phphub.org/topics/843 在 Laravel 中是可以不必指定 App\Http\Controllers: $app->get('/test', array( 'uses' => 'TestController@getIndex', )); 因为在 Laravel 中,默认控制器的根命名空间为 App\Http\Controllers。这个也可以设置:URL::setRootControllerNamespace('App\Http\Controllers'); class_alias('Illuminate\Support\Facades\App', 'App'); redis做缓存修改我们的配置文件 chche.php 'default' => 'redis' redis的一些配置在database.php php artisan make:controller PagesController --plain 这次生成的controller中将不包含任何方法。 blade模版的{{ $var }}是会转义html语义的,把about()方法中$name变量修改为:$name = 'Specs';,刷新浏览器,发现浏览器直接输出的是I'm Specs,查看源代码发现原来$name变量中的字符已经被转义成了HTML实体 如果不需要转义HTML的话,可以使用 {!! $var !!},修改视图文件为:

I'm {!! $name !!}

App facade 或者辅助方法 app() 取得应用程序实例: $environment = app()->environment(); $environment = App::environment(); Laravel 命令行工具 php artisan tinker >>> $name = 'Specs'; => "Specs" > > > $article = new App\Article; > > > => {} > > > $article->title = 'My first article'; > > > => "My first article" > > > $article->body = 'Lorem ipsum'; > > > => "Lorem ipsum" > > > $article->published_at = Carbon\Carbon::now(); > > > => { > > > date: "2015-05-14 13:26:16", > > > timezone_type: 3, > > > timezone: "UTC" > > > } > > > $article->toArray(); > > > => [ > > > "title" => "My first article", > > > "body" => "Lorem ipsum", > > > "published_at" => { > > > date: "2015-05-14 13:26:16", > > > timezone_type: 3, > > > timezone: "UTC" > > > } > > > ] > > > # 保存到数据库 > > > > > > $article->save(); > > > => true $article = Article::find($id); ``` // 找不到文章,抛出404 if(is_null($article)){ abort(404); } ``` 同 $article = Article::findOrFail($id); {{--{{ $article->title }}--}} {{ $article->title }} //方法一 $articles = Article::latest('published_at')->get(); //方法二 //$articles = Article::orderBy('published_at', 'desc')->get(); 修改模型文件 app/Article.php public function scopePublished($query){ $query->where('published_at', '<=', Carbon::now()); } $articles = Article::latest('published_at')->published()->get(); $article = Article::findOrFail($id); // 返回当前日期加8天 dd($article->created_at->addDays(8)); // 对日期进行格式化 dd($article->created_at->addDays(8)->format('Y-m')); // 返回距离当前的时间,如: "3 day from now", "1 week from now" dd($article->created_at->addDays(18)->diffForHumans()); protected $dates = ['published_at'];定义 published_at 也当作 Carbon 类型 public function store(Request $request){ $this->validate($request, ['title' => 'required|min:3', 'body' =>'required', 'published_at' => 'required|date']); Article::create($request->all()); 访问 http://laravel.dev/articles/create ,页面不跳转,而如果访问 http://laravel.dev/articles/create?foo=bar ,可以看到页面会自动跳转到 http://laravel.dev/articles public function handle($request, Closure $next) { if($request->is('articles/create') && $request->has('foo')){ return redirect('articles'); } $user->articles->toArray(); // 返回的是一个 collection //注意 使用 $user->articles 与 $user->articles() 的区别 > > > $user->articles()->get()->toArray(); > > > $user->articles() 可以添加查询条件,而$user->articles 则不能这么使用 > > > $user->articles()->where('title', 'New Article')->get()->toArray(); > > > 只在测试环境使用的插件 > > > "require-dev": { > > > "phpunit/phpunit": "4.7.3", > > > "filp/whoops": "1.1.6", > > > "phpspec/phpspec": "2.2.1" > > > }, > > > 当laravel的session driver设置为file, 这些session files都是以json形式存放在app/storage/sessions里面. 关键是,如何找到对应的session文件? 这个文件名是以加密形式存储在cookie的laravel_session里 $encrypter = new Illuminate\Encryption\Encrypter($key); $session_filename = $encrypter->decrypt($_COOKIE['laravel_session']); 在post模板中: public function user(){ return $this->belongsTo('User',$a,$b);$a默认为函数名_id(user_id)$b默认当前类主键 return $this->hasone('User',$a,$b);$a默认当前类名_id(post_id) $b默认当前类主键 } 然后在post-detail.blade.php中可以这样使用:$post->user .. @foreach($posts as $post) {{$post->user->username}} @Endforeach php -S 有一个致命问题就是路由中的 'home' 必须写成 '/home' 才能工作 server.php 其实是给php内置的服务器用的 当使用 php -S localhost:9999 开启内置服务器的时候就会使用server.php 做了部分url兼容的工作 创建表的 migration //create_users_table.php Schema::table('users', function ($table) { $table->string('name', 255); }); 重命名或者修改列,新建一个 migration,在 up 中执行修改,在 down 中修改回去。 //update_users_table.php public function up() { Schema::table('users', function(Blueprint $table) { $table->string('name', 50)->change(); }); } public function down() { Schema::table('users', function(Blueprint $table) { $table->string('name', 255)->change(); }); } 使用多数据库 在查询的时候,指明声明的连接名称 $users = DB::connection('mysql_center')->select(...); User::on('mysql_center')->where('username',$username) protected $connection = 'mysql_center'; return Response::json($user->toArray()); Sends Content-Type:application/json to the browser return $user->toJson(); Sends Content-Type:text/html It is automagically returned as JSON and the Content-Type is set correctly: return $model; https://github.com/followtheart/Laravel-5-Starter https://github.com/yccphp/laravel-5-blog PHP 中最好的时间处理的轮子了:https://github.com/briannesbitt/Carbon 文档:http://carbon.nesbot.com/docs/#api-humandiff 设计模式整理(PHP 代码演示) https://github.com/xujiajun/pattern-guidance 获取插入数据id $t = new Table //Table would be the name of your model / table $t->fieldName = $data['fieldData']; $t->save(); return $t->id; $lastInsertedID = DB::table('table')->insert( $data )->lastInsertId(); $id = DB::table('table')->insertGetId( $data ); php5.6取消了 [$HTTP_RAW_POST_DATA](http://andreas.heigl.org/2014/04/26/new-and-cool-features-in-php5-6/) 这个超全局变量 见 php.ini中 always_populate_raw_post_data $GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents('php://input'); [图片处理](http://laravel.io/forum/04-05-2014-cant-write-image-data-to-path) public function postCreate() { $validator = Validator::make(Input::all(), Product::$rules); ``` if ($validator->passes()) { $product = new Product; $product->category_id = Input::get('category_id'); $product->title = Input::get('title'); $product->description = Input::get('description'); $product->price = Input::get('price'); $image = Input::file('image'); $filename = time() . '.' . $image->getClientOriginalExtension(); Image::make($image->getRealPath())->resize(468, 249)->save(public_path('img/products/' . $filename);); $product->image = 'img/products/'.$filename; $product->save(); return Redirect::to('admin/products/index') ->with('message', 'Product Created'); } return Redirect::to('admin/products/index') ->with('message', 'Something went wrong') ->withErrors($validator) ->withInput(); } ```
@lovecn
Copy link
Owner Author

lovecn commented May 22, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 22, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 22, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 23, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 23, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 25, 2015

@lovecn
Copy link
Owner Author

lovecn commented May 30, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 1, 2015

http://www.jianshu.com/p/3af2a9c83c66 7天时间学习Laravel

@lovecn
Copy link
Owner Author

lovecn commented Jun 1, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 3, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 3, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 4, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 4, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 4, 2015

https://github.com/shellus/shcms 基于laravel的cms系统

@lovecn
Copy link
Owner Author

lovecn commented Jun 4, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 5, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 5, 2015

权限控制 https://github.com/Zizaco/entrust

@lovecn
Copy link
Owner Author

lovecn commented Jun 5, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 6, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 9, 2015

http://packalyst.com/packages php composr package

@lovecn
Copy link
Owner Author

lovecn commented Jun 12, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 12, 2015

laravel 4 + AngularJS 开发视频教程 http://www.itniub.com/15-laravel-4-angularjs

@lovecn
Copy link
Owner Author

lovecn commented Jun 12, 2015

[Laravel 5 教程学习笔记]http://9iphp.com/web/laravel

@lovecn
Copy link
Owner Author

lovecn commented Jun 14, 2015

Laravel cookie伪造,解密,和远程命令执行 http://drops.wooyun.org/papers/1515

@lovecn
Copy link
Owner Author

lovecn commented Jun 16, 2015

http://www.kancloud.cn/baidu/laravel5/qianyan laravel文档

@lovecn
Copy link
Owner Author

lovecn commented Jun 17, 2015

https://code.org/learn

@lovecn
Copy link
Owner Author

lovecn commented Jun 17, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 20, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 20, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 22, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 22, 2015

@lovecn lovecn closed this as completed Jun 22, 2015
@lovecn
Copy link
Owner Author

lovecn commented Jun 22, 2015

@lovecn lovecn reopened this Jun 22, 2015
@lovecn
Copy link
Owner Author

lovecn commented Jul 17, 2015

Laravel 风格的 JavaScript 验证器 https://github.com/ppoffice/js-validator

@lovecn
Copy link
Owner Author

lovecn commented Jul 17, 2015

@lovecn
Copy link
Owner Author

lovecn commented Aug 6, 2015

http://wulijun.github.io/2014/01/25/whats-new-in-php-5-6.html PHP5.6新特性介绍 交互式调试器phpdbg

@lovecn
Copy link
Owner Author

lovecn commented Aug 18, 2015

http://laravel.io/bin

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant