Getting started in Symfony... flow of CLI operations, etc - symfony1

I sure hope this is an ok question to ask here. I realize it isn't a specific programming Q, but hopefully it does have an answer.
I've been trying to learn Symfony (PHP framework) and I've gone through the Jobeet tutorial as well as read through the massive "Book". So I sit here about to begin my first project and amazingly find myself absolutely stuck on what to do. I realized that after reading all that... that I didn't "get" what the overall flow was. I'm asking this here because of the WIKI style so this can be adopted by experienced symfony users and melded into a final document that myself and other symfonewbies can use.
I'm beginning this from the point of view of a Windows user with a local server setup and the folder(s) containing php and symfony executables have been added to my PATH environment variable. I'm also using the assumption that Doctrine is being used rather than Propel as it has been stated in the docs that the default setup will be Doctrine going forward.
Create a folder for your project. Open a command line (in Windows, Start -> cmd.exe) and use the generate:project command to make the skeleton.
I'm really already lost here. From the Jobeet tutorial it seems to suggest the next step is creating your database in schema.yml and running doctrine:build-all? Or does generate:app and generate:module etc come first?
and so-on.
I'd appreciate any symfony pros out there contributing. Thanks.

Come up with a concept
First of all think of an interesting project that you would like to build. The default for this kind of project is usually a blog, but if that does not float your boat, how about something like a twitter clone or a reddit clone?
Build your model
In Symfony, the thing to do now is build your model. Create it in either a schema.YML file or in a graphical product like DB Designer, MySQL Workbench etc.
You need to add the tables, columns and foreign keys so that Propel can build you an interesting model to play with.
Let symfony build your apps
Now get on to the Symfony command line and create a couple of apps. A frontend, for the web and a backend to manage the site as an administrator.
Now let Symfony generate your model based on your schema. The lib/model folder should now have a load of files, filled with some useful functions based on your model.
For your backend app, generate a CRUD system with the admin generator and customise it with the yml file provided. Follow the myfirstapp tutorial for some interesting additions for the CRUD site.
Go in and edit your freshly built site!
For the Front end, create a module for each of the major parts of your site. These may include users, articles, tags, comments, stories, links, votes etc etc. Once you have some modules set up, the real fun starts. Create some functions in your actions file (such as list, show, delete, update) and create corresponding template files to display the results of the action.
Each action you create is automatically mapped to a corresponding URL.
http://yoursite/module/action
Hope this gives you some inspiration!

Follow the process in the jobeet tutorial - you've said that it suggests creating/defining the model is the next step, its what I always do.
Then create some fixtures, then go generating applications/modules etc. Once you reach this point, there's less need to stick to the order jobeet does things, but its still a good reference.

Related

What are the steps for modifying an existing rails application

I am new to ruby on rails and I am working on a web application written by ruby on rails. It has more than 10 models and I need to add some new attributes to some of the models as well as new methods and views. I also will need to remove or enhance some of the functionality. I know that I would need to generate new migrations and from there add/remove new columns. Then in controllers, add/modify methods, and update the views.
I wanted to know what would be the best steps (and in which order) for doing the above tasks. Also, do I need to change other files in folders like test or any other folder? What things should I consider to minimize the troubles later?
Thanks in Advance.
Since you are new to rails, the first thing you should do is to read through the getting started guide. This will help you understand the fundamentals of the rails framework and the application you inherited. After that, there are several other guides worth reading (from the same site) that may be directly applicable to the work you are doing.
Another incredibly helpful resource is railscasts. Some of these are outdated, but they are still a great starting place and can help introduce you to both new, powerful gems and rails techniques to get the work done faster and better.
As to your specific question, rails is built on an MVC architecture (meaning Model Views Controllers). It is in your best interest to try and follow this practice whenever possible. Reading up on this will clarify some of your questions as well.
When you run a migration, you will be modifying your database. The changes are viewable in the database schema (which should never be modified by hand, always modify it through migrations). This will add attributes to your models whose table you modified. In the controllers, you will add logic to deal with all of these things and the views will present the data to your users (or allow users to enter data). Asking which order is best is probably rather opinion based, but I would say you should modify the tables (run needed migrations) first. This way you can then generate the logic to deal with the new attributes. I would then create the controller logic and finally the views.
You also ask what other files need to be changed. This is heavily dependent on your system. At a base level, you should definitely be writing tests to support the logic you are generating (and many developers will advocate that you should do this before you write the other logic, a process called Test Driven Development).
TL;DR: Read the guides, work through a basic tutorial, and watch some Railscasts. This should get you up to speed on the process and best practices that go along with rails development.

Web-based database/forms RAD tool

I'm searching for something of which I don't really know the name of.
From time to time, I have to develop a small tool for a small group of users which is basically a web frontend to one or two database tables. It's very basic and something which one could do in a spreadsheet (without the problem that only one user can have the file open at a time and something like Sharepoint is not available) or for what one would have chosen MS Access in the 90s. Google Docs would also be possible, but we'd like to keep our data in-house. (I for myself just use phpMyAdmin for that, but it's not suitable for not tech-savvy end-users.)
So I'm looking for a tool which generates/provides a forms-based Web interface for simple models or database schemes that I create. First, is there a common name for such a thing? And second, does anyone have recommendations (preferably open source and/or free)? The closest thing I've come to is the scaffold generator in Ruby on Rails, but it's very basic and not optimal since it's only designed for generating prototype could which one should edit later, and last time I have looked at it, it was not possible to differently updating your model, i. e. regenerate code for model changes but preserving the manual changes of your code.
Thank you.
You're looking for Web UI Framework. Look into http://agiletoolkit.org/

Order / Priority of development in Symfony

So I've decided after much debate and research to use symfony on my next project. To sum the project up, it is an LMS (Yes, I know there are pre-built ones such as moodle but they do not have what my particular company requires). There are many modules and issues to take into consideration. My question is in what order should one start with Symfony?
Note, the database is already made and populated with data.
The Doctrine ORM?
User Authentication?
Creating the Core modules? (Courses, Enrollment, Grades)
Page security (i.e. installing the rules for who can access what page)?
Checking out the Jobeet tutorial is good advice.
If the database is already built, I would probably do something like this:
Ensure you have a plan of what "objects" and functionality the site is to have (eg. list of courses, course detail page, course search, etc). You should be able to visualise the site and have some design mockups ready. It would also help to know whether it's going to be multi-language or not.
Generate Doctrine models & form classes on the back of your db
Create home page placeholder (probably a module) and a logged-in home page placeholder (probably a module) + basic layouts for further tweaking later.
Create signup & authentication processes (so you have the core functionality of adding users, signing them in and signing them out). Use sfDoctrineGuardPlugin.
Now, start creating core modules one by one according to your plan. As you progress, you'll notice what bits make sense as partials/components and where an additional module might make sense. Add new routing rules as you go along.
Finally, add any little bits, cleanup your template HTML/CSS, JS files, etc
... this way you have a work-in-progress site that you can play around with as you go along.
If I were you, I would try to follow this tutorial : http://www.symfony-project.org/jobeet/1_4/Doctrine/en/ You can certainly match each step of the tutorial with a feature your website has.

How to extend an existing Ruby on Rails CMS to host multiple sites?

I am trying to build a CMS I can use to host multiple sites. I know I'm going to end up reinventing the wheel a million times with this project, so I'm thinking about extending an existing open source Ruby on Rails CMS to meet my needs.
One of those needs is to be able to run multiple sites, while using only one code-base. That way, when there's an update I want to make, I can update it in one place, and the change is reflected on all of the sites. I think that this will be able to scale by running multiple instances of the application.
I think that I can use the domain/subdomain to determine which data to display. For example, someone goes to subdomain1.mysite.com and the application looks in the database for the content for subdomain1.
The problem I see is with most pre-built CMS solutions, they are only designed to host one site, including the one I want to use. So the database is structured to work with one site. However, I had the idea that I could overcome this by "creating a new database" for each site, then specifying which database to connect to based on the domain/subdomain as I mentioned above.
I'm thinking of hosting this on Heroku, so I'm wondering what my options for this might be. I'm not very familiar with Amazon S3, or Amazon SimpleDB, but I feel like there's some sort of "cloud database" that would make this solution a lot more realistic, than creating a new MySQL database for each site.
What do you think? Am I thinking about this the wrong way? What advice do you have to offer in this area?
I've worked on a Rails app like this, and the way it was done there was named-based virtual hosts, with db entries for each site running. Each record was scoped to a site if necessary (blog posts, etc.) while users would have access to all sites running out of that db. Administrator permissions could be global or scoped to one or more sites.
You're absolutely correct when you say you'll reinvent the wheel a million times during the project. Plugins will likely require hacking on top of the CMS itself.
In my situation, it ended up being a waste of almost a million dollars of company money to build that codebase to run multiple sites while still being able to cater to the whims of each client site. It worked, but was not very maintainable due to the number of site-specific hacks that subsequently entered the codebase. You may be able to make it work if you don't have to worry about catering to specific client sites running on your platform.
In the end, you're going to need a layer of indirection to handle the different sites regardless of methodology. We ended up putting it in the database itself. If you go with the different-db-for-each-site method you mentioned, you'll put that layer in your code instead. I'm not sure which one is the better method.
I hope you're able to pull this off. I failed.
Also, as I learned today, Heroku offers postgres instead of mysql for rails apps.
There's James Stewart's Theme Support Plugin for Rails 2.3, and lucasefe's themes_for_rails gem for Rails 3+.
I just started using the 2.3 version and it's working well so far.

Rails best practice question: Where should one put shared code and how will it be loaded?

The rails books and web pages I've been following have all stuck to very simple projects for the sake of providing complete examples. I'm moving away from the small project app and into a realm of non-browser clients and need to decide where to put code that is shared by all involved parties.
The non-browser client is a script that runs on any machine which can connect to the database. Browser clients write commands into the database, which the script examines and decides what to do. Upon completion, the script then writes its result back. The script is not started by the RoR server, but has access to its directory structure.
Where would be the best place for shared code to live, and how would the RoR loader handle it? The code in question doesn't really belong in a model, otherwise I'd drop it in there and be done with it.
I'd put the shared code in the Rails project's /lib directory and consider making it a custom Rake task.
It really depends on how much you use this shared code. If you use it everywhere, then throw it in the lib folder (as has already been stated here). If you are only using it in a few places, you might want to consider making a plugin out of it and loading it only in the places that use it. It's nice to only load what you need (one of the reasons I'm loving merb).

Resources