ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

Laravelでパッケージ用のConfigをコピーする

Laravelでパッケージを使う場合には、Configをコピーしてから使う。オリジナルのConfigはcomposer updateのたびにデフォルトに戻るからだ。
「config:publish ベンダ名/パッケージ名」でConfigがapp/config/packagesにコピーされる。

>php artisan config:publish schickling/backup
Configuration published for package: schickling/backup

Windowsでlaravel/installerを使ってみる

一応メモを残すけどlaravel/installerは不便だった。「composer create-project」のほうが便利。

Windowsだと「laravel new」が失敗する。

> composer global require "laravel/installer=~1.1"
Changed current directory to C:/Users/futari/AppData/Roaming/Composer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

>laravel new five
'laravel' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

フルパスを指定しなきゃダメみたい。

C:\Users\futari\AppData\Roaming\Composer\vendor\laravel\installer>php laravel new five
Crafting application...
Application ready! Build something amazing.

Winscpを使って自動ダウンロード処理を書く

winscp.comをCMDから直接実行する際に/scriptオプションでテキストを指定する。

"C:\Program Files (x86)\WinSCP\winscp.com" /script="myserver.txt"


myserver.txtの中身。

option batch on

open admin:password@127.0.0.1

get /tmp/backup.tar

close

exit

Form::openでメソッドを指定する

Form::openで直接メソッドを指定する。

{{ Form::open(['action' => ['UserController@change', $user->id]]) }}
{{ Form::close() }}

これにはroute.phpへの記述も必要。

Route::post('user/change', 'UserController@change');

Pythonのsubprocessの標準出力を入手する

Pythonのsubprocessを使って標準出力を入手したい。

import subprocess

cmdline = 'echo test'

p = subprocess.Popen(cmdline, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

while True:
  line = p.stdout.readline()

  if not line:
    break

  print(line.strip())

ところが、この場合「test」ではなく「b'test'」と表示される。

b'test'

デコードすれば結果だけを表示できる。

print(line.strip().decode('ascii'))

Python3とdecode

Python3で作ったスクリプトWindowsコマンドプロンプト上で実行したら、日本語部分のdecodeが失敗した。

この部分が

line.strip().decode('ascii')

こういうエラーを出す。

UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 28:
 invalid start byte

shift-JISにしたら直った。

line.strip().decode('shift-JIS')

エクセルで作成したCSVファイルをLaravelに読み込み

Excelで作成したCSVファイルをLaravelに読み込んでみた。

$buf = mb_convert_encoding(file_get_contents(
  Input::file('csv')->getRealPath()),
  'utf-8',
  'sjis-win');

$lines = explode("\n", $buf);

array_pop($lines);

array_shift($lines);

最後のarray_popとarray_shiftは最初の一行と、最後の空行を取り除いている。

Laravel5でartisanコマンドを自作

artisan用のコマンドは名前が変わって「コンソール」になった。なのでmake:consoleでコマンドを作る。

php artisan make:console FutariUpdate --command=futari:update

app\Console\Kernel.phpにコマンドを登録する。

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel {

  protected $commands = [
    'Shoek\Console\Commands\Inspire',
    'Shoek\Console\Commands\FutariUpdate',
  ];

Laravelで自作メソッドにidを渡す

Laravel4で自作メソッドにidを渡す。

Viewの書き方

{{ Form::open(['action' => ['JisakuController@insert',$jisaku->id]) }}

routes.phpの書き方

Route::post('jisakus/{id}/insert', 'JisakuController@insert')

コントローラーの書き方

public function insert($id)
{

}

Laravelで定数を使う

前も書いた気がするけど、例として「constants.php」を「app/start」内に置く。

#app/start/constants.php
<?php

define('ADMIN', 'administrator');

「app/start/global.php」の末尾で「constants.php」を読み込む。

require app_path().'/filters.php';
require_once 'constants.php'; # ←追記

Sentryでnone givenのエラーが出る

LaravelのSeederを使ってSentry用のユーザを一気に追加しようとしたら、以下のエラーメッセージが出た。

  [Cartalyst\Sentry\Users\LoginRequiredException]
  A login is required for a user, none given.

そのときのSeederはこちら。

<?php

use League\Csv\Reader;

class UserSeeder extends Seeder {

  public function run()
  {
    $reader = Reader::createFromPath('./import/user.csv');

    $csvs = $reader->setDelimiter("\t")->fetchAssoc($reader->fetchOne());

    array_shift($csvs);

    foreach ($csvs as $csv) {

      Sentry::createUser($csv);
    }

  }

}
<||

CSVファイルの中身はこちら。
>||
username	email	password
MyUserName1	MyEmailAddress1 MyPassword1
MyUserName2	MyEmailAddress2 MyPassword2

原因はSentry::createUserにactivatedの情報が無かったから。そこでCSVファイルの1行目にactivatedを足して、その値を1にした。

username	email	password	activated
MyUserName1	MyEmailAddress1 MyPassword1	1
MyUserName2	MyEmailAddress2 MyPassword2	1

migrateにどうしても失敗する

migrateにどうしても失敗する場合がある。以下みたいなメッセージ。

php artisan migrate
Do you really wish to run this command? yes
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException",
  "message":"Class 'CreateUsersTable' not found",
  "file":"vendor\/laravel\/framework\/src\/Illuminate\/Database\/Migrations\/Migrator.php",
  "line":301}}

上記の場合だと「CreateUsersTable」が「vendor\composer」フォルダ内に登録されてないのが原因。

composer dump-autoload

で直る。