laravel post 参数如何接受其他地方Post过来的信息

Laravel 关联模型由于名称一致性导致的问题 - 为程序员服务
Laravel 关联模型由于名称一致性导致的问题
1. 定义关联模型
在Laravel里面,我们可以通过定义以下Model来完成关联查询。
class MyPost extends Eloquent {
public function myPostInfo () {
return $this-&hasOne('MyPostInfo');
class MyPostInfo extends Eloquent {}
2. 使用关联模型
这里myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:
$post = MyPost::find(1);
$post_info = $post-&myPostI // example 1
$post_info = $post-&my_post_ // example 2
Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。
3. 缓存失效
如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如
$post_info = $post-&myPostI
// $post-&relations = [‘myPostInfo’ =& ..];
$post_info = $post-&my_post_
// $post-&relations = [‘myPostInfo’ =& …, ‘my_post_info’ =& …];
所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel Case.
4. toArray() 方法失效
如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。
所以如果用到了toArray()方法来转换Model,切忌同时使用两者。
5. 容易犯错的位置
最容易犯错的代码是这样的:
MyPost::with(‘myPostInfo’)-&get();
在使用With去eagerLoad关联模型时,必须使用和定义方法同名的key去读取,那么这样读取出来的方法只能是Camel Case的key。其他地方就只能用
$my_post-&myPostI
来保证不出问题。
闫肃的博客
原文地址:, 感谢原作者分享。
您可能感兴趣的代码Posts - 319,
Articles - 0,
Comments - 785
-正确的时间经历正确的事情
09:56 by 轩脉刃, ... 阅读,
今天想用laravel搭建一个后台系统,就需要最简单的那种,有用户登录系统,试用了下,觉得laravel的用户登录这块做的还真happy。当然,前提就是,你要的用户管理系统是最简单的那种,就是没有用户权限,能登录就好。
我这里就不用默认的user表做例子了,那样很容易和laravel的一些默认设置混淆。
首先确认,后台的用户表,我设计表叫做badmin,每个管理员有用户名(username),有昵称(nickname),有邮箱(email),有密码(password)
这里玩个花,使用laravel的migration来建立表(实际上可以用不着使用这个工具建立表)
1 安装好最基本的laravel框架
2 创建migration文件:
./artisan migrate:make create-badmin-table
3 发现app/database/migration/下面多了一个php文件:
_090336_create-badmin-table.php
4 往up和down里面增加内容;
use Illuminate\Database\Schema\B
use Illuminate\Database\Migrations\M
class CreateBadminTable extends Migration {
* Run the migrations.
* @return void
public function up()
Schema::create('badmin', function($table)
$table-&increments('id');
$table-&string('nickname', 100)-&unique();
$table-&string('username', 100)-&unique();
$table-&string('email', 100)-&unique();
$table-&string('password', 64);
$table-&timestamps();
* Reverse the migrations.
* @return void
public function down()
Schema::drop('badmin');
5 配置好local的database,app/config/local/database.php
return array(
'fetch' =& PDO::FETCH_CLASS,
'default' =& 'mysql',
'connections' =& array(
'mysql' =& array(
=& 'mysql',
=& 'localhost',
'database'
=& &test',
'username'
=& 'yejianfeng',
'password'
=& '123456',
=& 'utf8',
'collation' =& 'utf8_unicode_ci',
'migrations' =& 'migrations',
6 创建数据表:
./artisan migrate --env=local
这个时候去数据库看,就发现多了一张badmin表,数据结构如下:
CREATE TABLE `badmin` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nickname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT ' 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT ' 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `badmin_nickname_unique` (`nickname`),
UNIQUE KEY `badmin_username_unique` (`username`),
UNIQUE KEY `badmin_email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_
要问这里为什么多出了create_at和update_at,这是laravel默认为每个表创建的字段,而且在使用Eloquent进行增删改查的时候能自动更新这两个字段
7 创建个Model:
use Illuminate\Auth\UserT
use Illuminate\Auth\UserI
use Illuminate\Auth\Reminders\RemindableT
use Illuminate\Auth\Reminders\RemindableI
class Badmin extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableT
protected $table = 'badmin';
protected $hidden = array('password');
public static $rules = [
'nickname' =& 'required|alpha_num|min:2',
'username' =& 'required',
'email'=&'required|email|unique:badmin',
'password'=&'required|alpha_num|between:6,12|confirmed',
这里必须要implements UserInterface和RemindableInterface
8 把model和Auth关联上,修改app/config/auth.php
return array(
// 默认的用户验证驱动
// 可以是database或者eloquent
'driver' =& 'eloquent',
// 只有驱动为eloquent的时候才有用
'model' =& 'Badmin',
这里的driver可以是eloquent或者database,使用eloquent就告诉Auth组件说,用户认证类是Badmin这个类管的。这里的model是有命名空间的,就是说如果你的admin类是\Yejianfeng\Badmin,这里就应该改成&\Yejianfeng\Badmin&
9 好了,这个时间其实逻辑部分已经搭建完毕了,你已经可以在controller种使用
Auth::attempt(XXX) 做权限认证
Auth::user() 获取登录用户(一个Badmin类)
10 下面要建立一个用户登录页面:
11 设置路由:
// 不需要登录验证的接口
Route::get('/', ['as' =& 'user.login','uses'=&'UserController@getLogin']);
Route::get('user/login', ['as' =& 'login', 'uses' =& 'UserController@getLogin']);
Route::post('user/login', ['as' =& 'login', 'uses' =& 'UserController@postLogin']);
// 需要登录验证才能操作的接口
Route::group(array('before' =& 'auth'), function()
Route::get('user/logout', ['as' =& 'logout', 'uses' =& 'UserController@getLogout']);
Route::get('user/dashboard', ['as' =& 'dashboard', 'uses' =& 'UserController@getDashboard']);
12 设置controller:
class UserController extends BaseController {
// 登录页面
public function getLogin()
return View::make('user.login');
// 登录操作
public function postLogin()
if (Auth::attempt(array('email'=&Input::get('email'), 'password'=&Input::get('password')))) {
return Redirect::to('user/dashboard')
-&with('message', '成功登录');
return Redirect::to('user/login')
-&with('message', '用户名密码不正确')
-&withInput();
public function getLogout()
Auth::logout();
return Redirect::to('user/login');
public function getDashboard()
return View::make('user.dashboard');
// 添加新用户操作
public function getCreate()
return View::make('user.create');
// 添加新用户操作
public function postCreate()
$validator = Validator::make(Input::all(), User::$rules);
if ($validator-&passes()){
$bAdmin = new Badmin();
$bAdmin-&nickname = Input::get('nickname');
$bAdmin-&username = Input::get('username');
$bAdmin-&email = Input::get('email');
$user-&password = Hash::make(Input::get('password'));
$user-&save();
Response::json(null);
Response::json(['message' =& '注册失败'], 410);
13 设置下filter,app/filter.php
Route::filter('auth', function()
if (Auth::guest())
if (Request::ajax())
return Response::make('Unauthorized', 401);
return Redirect::guest('/');
将这里认证失败后的地址转到/ 路径
14&设置views/user/login.blade.php
这里截取一部分
可以看出,这里可以直接使用Session::has和Session::get
然后基本就完成了...
laravel这里的auth机制还是很方便的,但是migration使用起来总觉得有点憋屈。操作数据库总是隔着一层,不爽。
这里的auth一些简单的用户登录机制已经可以了,但是如果要做更复杂的用户管理权限,估计要使用Sentry()这样的第三方组件了。类PostRepostioryInterface找不到线4
或与我摆弄甚至得到了类
应用程序\\型号\\接口\\ PostRepositoryInterface未找到
问题:如何注册在laravel 4?我需要做的就是L4识别类/接口在这
Larave 3中有一个类加载器$静态对象,你可以通过添加
Autoloader::namespaces(array(
'App\Models\Interfaces' =& path('app').'models/interfaces',
我不知道我是否有这个权利的laravel 3但无论哪种方式,自动装载器不会在Laravel 4存在和ClassLoader的存在,但在类加载器是不存在的Laravel 4。
我看着这一点,但它似乎并没有不注册工作的
使用Laravel 4
例如结构:
app/models/interfaces
PostRepostitoryInterface.php
app/models/repositories
EloquentPostRepository.php
namespaces:
App\Models\R
App\Models\I
&?php namespace App\Models\I
interface PostRepositoryInterface {
public function all();
public function find($id);
public function store($data);
&?php namespace App\Models\R
use App\Models\Interfaces\PostRepositoryI
class EloquentPostRepository implements PostRepositoryInterface {
public function all()
return Post::all();
public function find($id)
return Post::find($id);
public function store($data)
return Post::save($data);
use App\Models\Interfaces\PostRepositoryI
class PostsController extends BaseController {
public function __construct( PostRepositoryInterface $posts )
$this-&posts = $
本文地址 :CodeGo.net/558619/
-------------------------------------------------------------------------------------------------------------------------
1. 你可能忘了做composer dump-autoload。这将更新的类Laravel自动加载列表。
你可以阅读更多
在laravel IRC频道我发现了应该在L4而无需在任何地方注册它们。这是转储,自动加载将它们添加到so文件,这不是一个问题。
这个问题竟然是一个错字明显(我无法找到它在上面的代码中,但经历的每一行文本后/粘贴类和改变),并以我实际的代码我离开了“使用”的
use App\Models\Interfaces\PostRepositoryI
现在,我已经打了另一面墙上试图与国际奥委会和控制器构造函数的接口(目标接口应用程序\\型号\\接口\\ PostRepositoryInterface不可实例化),但我想这应该是一个不同的问题。
本文标题 :如何在laravel 4注册一个命名空间
本文地址 :CodeGo.net/558619/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&m收藏,1k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
现在,/post/总会跳到别的页面,而不是跳到/post的位置。
我的laravel版本是4.2,下面是测试代码。
phpRoute::get('post', function() { return 'w/out slash'; });
Route::get('post/', function() { return 'with slash'; });
phpRoute::get('post/', function() { return 'with slash'; });
Route::get('post', function() { return 'w/out slash'; });
以上两种配置,结果都如下,都是/post/ 301 跳到别的页面,/post页面正常。
curl http://localhost/gitcafe/public/post
with slash
curl http://localhost/gitcafe/public/post/
&!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&
&html&&head&
&title&301 Moved Permanently&/title&
&/head&&body&
&h1&Moved Permanently&/h1&
&p&The document has moved &a href="http://localhost/post"&here&/a&.&/p&
&/body&&/html&
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
4月2日 回答
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只须一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:
扫扫下载 App
SegmentFault
一起探索更多未知关注程序员俱乐部
关注程序员俱乐部,每日为您呈现IT界的技术干货。
扫一扫二维码,为您推送最新的技术文章和最新动态。
Laravel框架在PHP开发中使用十分广泛,本文主要对Laravel框架中的路由设置作详细的介绍,Laravel的路由配置非常灵活,如何设置好路由对PHP应用来说也是相当关键的。
您的应用程序的绝大多数路由将在 app/routes.php 文件中定义。Laravel 中最简单的路由由一个 URI 和一个调用组成。
基本 GET 路由
Route::get('/', function()
return 'Hello World';
基本 POST 路由
Route::post('foo/bar', function()
return 'Hello World';
注册一个路由以响应所有 HTTP 方法
Route::any('foo', function()
return 'Hello World';
强制一个路由必须通过 HTTPS 访问
Route::get('foo', array('https', function()
return 'Must be over HTTPS';
经常您需要根据路由产生 URLs,您可以通过使用 URL::to 方法:
$url = URL::to('foo');
Route::get('user/{id}', function($id)
return 'User '.$
可选的路由参数
Route::get('user/{name?}', function($name = null)
带默认值的可选的路由参数
Route::get('user/{name?}', function($name = 'John')
带正则表达式约束的路由
Route::get('user/{name}', function($name)
-&where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)
-&where('id', '[0-9]+');
路由过滤器
路由过滤器提供了一种限制访问指定路由的简单的方法,这在您需要为您的站点创建需要认证区域的时候非常有用。Laravel 框架中包含了一些路由过滤器,比如 auth 过滤器、auth.basic 过滤器、guest 过滤器、以及 csrf 过滤器。它们被存放在 app/filters.php 文件中。
定义一个路由过滤器
Route::filter('old', function()
if (Input::get('age') & 200)
return Redirect::to('home');
如果一个响应从一个路由过滤器中返回,这个响应即被认为是这个请求的响应,路由将不被执行,任何关于这个路由的 after 过滤器也将被取消执行。
为一个路由指定一个路由过滤器
Route::get('user', array('before' =& 'old', function()
return 'You are over 200 years old!';
为一个路由指定多个路由过滤器
Route::get('user', array('before' =& 'auth|old', function()
return 'You are authenticated and over 200 years old!';
指定路由过滤器参数
Route::filter('age', function($route, $request, $value)
Route::get('user', array('before' =& 'age:200', function()
return 'Hello World';
当路由过滤器接收到作为第三个参数的响应 $response:
Route::filter('log', function($route, $request, $response, $value)
基本路由过滤器的模式
您可能希望根据 URI 为一组路由指定过滤器。
Route::filter('admin', function()
Route::when('admin/*', 'admin');
在上面的例子中,admin 过滤器将应用带所有以 admin/ 开头的路由。星号作为一个通配符,将适配到所有字符的组合。
您也可以通过指定 HTTP 方法约束模式过滤器:
Route::when('admin/*', 'admin', array('post'));
对于高级的过滤器,您可以使用一个类代替闭包函数。因为过滤器类是位于应用程序之外的 IoC 容器,您能够在过滤器中使用依赖注入,更易于测试。
定义一个过滤器类
class FooFilter {
public function filter()
// Filter logic...
注册一个基于类的过滤器
Route::filter('foo', 'FooFilter');
命名路由在更易于在生成跳转或 URLs 时指定路由。您可以像这样为路由指定一个名字:
Route::get('user/profile', array('as' =& 'profile', function()
您也可以为控制器的方法指定路由名字:
Route::get('user/profile', array('as' =& 'profile', 'uses' =&
'UserController@showProfile'));
现在您在生成 URLs 或跳转的时候使用路由的名字:
$url = URL::route('profile');
$redirect = Redirect::route('profile');
您可以使用 currentRouteName 方法获取一个路由的名字:
$name = Route::currentRouteName();
有些时候您可能希望应用过滤器到一组路由。您不必要为每个路由指定过滤器,可以使用路由组:
Route::group(array('before' =& 'auth'), function()
Route::get('/', function()
// Has Auth Filter
Route::get('user/profile', function()
// Has Auth Filter
子域名路由
Laravel 路由也能够处理通配符的子域名,并且从域名中获取通配符参数:
注册子域名路由
Route::group(array('domain' =& '{account}.'), function()
Route::get('user/{id}', function($account, $id)
一组路由可以通过在属性数组中使用 prefix 选项为路由组添加前缀:
为路由组添加前缀
Route::group(array('prefix' =& 'admin'), function()
Route::get('user', function()
路由模型绑定
模型绑定提供了一个简单的方法向路由中注入模型。比如,不仅注入一个用户的 ID,您可以根据指定的 ID 注入整个用户模型实例。首先使用 Route::model 方法指定所需要的模型:
为模型绑定一个变量
Route::model('user', 'User');
然后, 定义一个包含 {user} 参数的路由:
Route::get('profile/{user}', function(User $user)
因为我们已经绑定 {user} 参数到 User 模型,一个 User 实例将被注入到路由中。因此,比如一个 profile/1 的请求将注入一个 ID 为 1 的 User 实例。
注意: 如果在数据库中没有找到这个模型实例,将引发404错误。
如果您希望指定您自己定义的没有找到的行为,您可以为 model 方法传递一个闭包作为第三个参数:
Route::model('user', 'User', function()
throw new NotFoundE
有时您希望使用自己的方法处理路由参数,可以使用 Route::bind 方法:
Route::bind('user', function($value, $route)
return User::where('name', $value)-&first();
引发404错误
有两种方法在路由中手动触发一个404错误。首先,您可以使用 App::abort 方法:
App::abort(404);
其次,您可以抛出一个 Symfony\Component\HttpKernel\Exception\NotFoundHttpException 的实例。
更多关于处理404异常和为这些错误使用使用自定义响应的信息可以在 错误 章节中找到。
路由至控制器
Laravel 不仅允许您路由至闭包,也可以路由至控制器类,甚至允许创建 资源控制器.

我要回帖

更多关于 laravel post 参数 的文章

 

随机推荐